查看jenkins/jenkins镜像版本
拉取Jenkins镜像
docker pull jenkins/jenkins:2.346.3-2-lts-jdk11
创建Jenkins挂载目录并授权
mkdir -p /home/jenkins/jenkins_home
chmod 777 /home/jenkins/jenkins_home
运行Jenkins
docker run -d \
-p 8850:8080 -p 50000:50000 \
-v /home/jenkins/jenkins_home:/var/jenkins_home \
-v /etc/localtime:/etc/localtime \
--restart=always jenkins/jenkins:2.346.3-2-lts-jdk11
如果在执行docker run命令时遇到以下错误,重启docker后再执行
docker: Error response from daemon: driver failed programming external connectivity on endpoint boring_mclean (bbd33296c7b1a2c851c31db07d6dd7a44a95d1b5fa443c08e59508f1524790b9): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 50000 -j DNAT --to-destination 172.17.0.2:50000 ! -i docker0: iptables: No chain/target/match by that name.
重启docker
systemctl restart docker
关闭防火墙
systemctl stop firewalld
获取密钥
docker ps
docker exec -it 容器ID /bin/bash
cat /var/jenkins_home/secrets/initialAdminPassword
exit
跳过新手入门
进入Jenkins首页
创建新用户
修改密码
安装插件
选择【Available】,搜索【Localization】,选中【Localization: Chinese (Simplified)】插件,点击【Install without restart】
重启Jenkins
docker ps
docker restart 容器ID
docker ps
docker exec -it 容器ID /bin/bash
echo $JAVA_HOME
exit
安装Maven
安装【Config File Provider】插件(用于管理配置文件)
在【Managed files】中创建settings.xml文件
可修改或删除配置文件
在【全局工具配置】中配置settings.xml文件
- Jenkins从Gitlab上拉取代码;
- Jenkins从Nexus上拉取Jar包;
- Jenkins将编译/打包完成的文件或者Jar包上传至Nexus;
由于没有构建Maven项目的选项,因此我们还需要安装【Maven Integration】插件
配置【General】
由于源码管理是无,因此我们还需要安装【Git】插件管理源码(暂时保存配置)
安装【Git】插件
安装完成后回到刚刚的配置页面
配置【源码管理】
连接Gitlab代码仓库,添加Git管理凭证
填写Gitlab账号密码
无红色报错提示则说明Git仓库已经成功连接
配置【构建环境】
配置【Build】
clean install deploy -P prod
保存配置并构建当前任务
很遗憾,任务构建失败了
根据错误提示,我们可以发现这是因为settings.xml文件存在问题所导致的,我们需要把【localRepository】配置为当前linux系统的目录
Linux系统下的【localRepository】
创建【localRepository】目录,并授权(Jenkins需要写入Jar包的权限)
docker ps
docker exec -ti --user root 容器ID sh
mkdir -p /usr/maven/bubble
chmod 777 /usr/maven/bubble
exit
重新构建任务,如下图则说明任务构建成功
检查项目代码是否成功deploy到了maven私服上,可以根据最后修改时间进行判断(GMT是格林尼治时间,北京时间CST=GMT+8小时)
到这里我们已经可以从Git上拉取代码并进行构建了,但是构建完之后我们还需要实现代码的自动化部署。
- Jenkins从Gitlab上拉取代码;
- Jenkins从Nexus上拉取Jar包;
- Jenkins将编译/打包完成的文件或者Jar包上传至Nexus;
- Jenkins将编译/打包完成的Jar包上传至部署服务器的指定目录,并执行shell脚本运行此Jar包;
再新建一个任务,复制bubble-parent的配置内容
根据情况调整有差异化的配置
【General】
【源码管理】
【Build】
clean install deploy -Dmaven.test.skip=true -P prod
保存调整好的配置,在实现自动化部署之前我们还需要进行一些准备,需要准备一下部署项目的服务器。
接下来我会用这台云服务器进行部署微服务
部署的方式:Jenkins构建项目并打成Jar包上传至(部署微服务的)服务器后,再执行sh文件将Jar包制作成docker镜像并运行。比如Jenkins在构建bubble-gateway时,将打包好的bubble-gateway.jar上传至/home/bubble-app/bubble-gateway(具体目录结构如下图),上传完毕之后会执行bubble-gateway.sh脚本,将bubble-gateway.jar制作成docker镜像并运行。
目录结构:
文件示例:
Dockerfile
FROM adoptopenjdk/openjdk11:jdk-11.0.8_10-alpine
# 复制文件到容器
ADD bubble-gateway.jar /bubble-gateway.jar
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","-Duser.timezone=GMT+08 -XX:+HeapDumpOnOutOfMemoryError -Xms512m -Xmx512m","/bubble-gateway.jar"]
bubble-gateway.sh
#!/bin/bash
server_name=bubble-gateway
server_port=81
echo $server_name
if [[ -n $(docker ps | grep $server_name) ]];then
echo $server_name
docker stop $server_name
docker rm -f $server_name
docker rmi -f $server_name
fi
docker build -t $server_name .
docker run --name $server_name -it --restart=always -v /etc/localtime:/etc/localtime:ro -d -p $server_port:$server_port $server_name
准备好了这些之后我们需要让Jenkins将构建好的Jar包上传至云服务器
首先我们需要在Jenkins上安装【Publish over SSH】插件用于连接远程服务器
生成SSH密钥,并将公钥发布到(部署微服务的)服务器
在Jenkins服务器上执行以下操作
安装SSH
yum install -y openssl openssh-server
生成公钥和私钥
ssh-keygen
直接回车
设置一个【passphrase】密码,也可以不加密码直接回车。我这里设置了密码,比如【honey】
确认密码
密钥默认存放的路径:/root/.ssh
其中id_rsa为私钥,id_rsa.pub为公钥
将公钥发布到(部署微服务的)服务器(root 是远程服务器的登录名,@ 后面是目标服务器IP)
ssh-copy-id [email protected]
验证免密连接是否成功,无需输入密码登录到47.102.152.222即可。
ssh [email protected]
进入【系统配置】
配置【Publish over SSH】
完成配置后,点击下方的【Test Configuration】,如果出现【Success】则说明连接成功
配置【Post Steps】
配置【Send files or execute commands over SSH】
构建bubble-gateway前:
构建bubble-gateway
构建结果:
bubble-gateway.jar文件成功上传至/home/bubble-app/bubble-gateway目录,且创建bubble-gateway容器并运行
配置防火墙
访问正在运行的bubble-gateway项目
到这里说明自动化部署已经成功了,接下来我们还需要优化一下Jenkins构建的触发方式,期望能够在往Gitlab上的指定分支(如master分支)push或者merge代码时触发构建,该功能我们可以通过webhook进行实现。
- Developer将代码push/merge至指定分支(master);
- Gitlab通过web钩子对Jenkins发送webhook请求,Jenkins收到请求后则开始构建任务;
- Jenkins从Gitlab上拉取代码;
- Jenkins从Nexus上拉取Jar包;
- Jenkins将编译/打包完成的文件或者Jar包上传至Nexus;
- Jenkins将编译/打包完成的Jar包上传至部署服务器的指定目录,并执行shell脚本运行此Jar包;
安装【Gitlab】插件
安装完成【Gitlab】插件后,则会出现如下图所示的选项
【http://192.168.102.130:8850/project/bubble-parent】为webhook地址,在配置Gitlab时需要用到该地址,当Gitlab收到用户的合并请求等操作后会通过Web钩子调用该地址,以达到自动化的目的。
点击【高级】,配置更多信息
点击【Generate】,生成安全令牌
填写webhook地址和安全令牌
在点击【增加Web钩子】时出现了异常
【原因】
Gitlab 10.6 版本以后为了安全,默认不允许向本地网络发送webhook请求,但是可以修改默认值
【解决方法】
重新【增加Web钩子】成功后,发送Push事件测试一下
测试结果:
HTTP 200(说明发送请求成功)
Jenkins也开始构建任务
当开发者push/merge到master分支时才会发送事件
Jenkins只有收到push/merge到master分支的请求才会触发构建
开发者push代码至Gitlab
Jenkins开始构建
此次构建的修改记录
Jenkins构建成功
部署服务器接收到Jar包后,制作成Docker镜像并运行
配置防火墙
不过在访问时发现项目启动异常了,根据错误日志,可以定位到是由于数据库连接等配置统一放置在bubble-common,而bubble-common和bubble-auth是一起构建的,导致bubble-auth读取的公共依赖依然是bubble-common构建前的代码。之后可以关注一下项目关系,建立上下游项目关系,让多个项目能够有序的构建。
重新构建一下bubble-auth就能看到效果啦
构建完成所有任务