一、流程介绍
持续集成,是指用户将代码提交到gitlab后,进行自动部署的过程。代码push到lab之后,触发Jenkins进行代码的下拉,完成maven编译和打包功能,随后通过脚本或SSH服务生成镜像,完成镜像push到仓库以及在部署服务器上pull并运行该镜像的过程。本次实践中共两台服务器,一台为Jenkins服务器, 另一台为docker镜像仓库和部署服务器。
二、Jenkins配置
为了实现python API的调用,先要熟悉Jenkins的配置与使用。下面这一部分将介绍部署一个Java项目并完成自动打包和镜像推动与运行的完整流程。本次采用的策略为在Jenkins服务器生成war包后,在本地生成镜像推到仓库,并通过SSH服务在部署服务器上直接运行。因此,在Jenkins服务器和部署服务器都要有docker安装。如果Jenkins服务器无docker,也可以将war包通过SSH服务送到部署服务器上,在该服务器直接生成镜像并运行。接下来的操作将按照第一种策略进行。
参考链接:jenkins+docker实现自动编译、打包、构建镜像、容器部署
1. 准备工作
1.1 Docker Remote API
在部署(仓库)服务器上,运行指令:
vim /lib/systemd/system/docker.service
将ExecStart
修改为如下指令:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
1.2 私有镜像仓库
在镜像仓库服务器上,运行如下指令,可以按情况修改映射端口号5003:
docker run -d -v /opt/registry:/var/lib/registry -p 5003:5000 --restart=always --name registry registry
由于Docker CLI客户端默认以HTTPS访问,而部署的registry并未提供HTTPS,因此,需要添加HTTP可信任。在两个服务器上都需要运行:
vi /etc/docker/daemon.json
添加如下内容,修改地址为仓库服务器地址加上刚设置的映射端口号:
{
"insecure-registries":["192.168.xxx.xxx:5003"]
}
运行完毕后,镜像仓库搭建完毕,通过这个地址即可进行docker镜像push与pull。随后,更新配置文件并重启docker服务。
systemctl daemon-reload
systemctl restart docker
1.3 构建Tomcat镜像
Docker可以依照Dockerfile文件进行镜像的配置。在之后的进程中,我们是通过在Tomcat和jdk的镜像下加入构建的项目war包,将这个扩充的镜像运行从而实现项目的部署。因此,我们需要搭建一个有Tomcat,jdk环境的镜像。
在仓库服务器上运行指令:
vim Dockerfile
添加如下内容:
FROM centos:7
ENV VERSION=8.5.60
ENV JAVA_HOME /usr/local/jdk
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/tomcat
ENV CATALINA_BASE /usr/local/tomcat
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
RUN yum install wget -y
COPY jdk1.8.0_211 /usr/local/jdk/
RUN wget https://mirrors.cnnic.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && \
tar zxf apache-tomcat-${VERSION}.tar.gz && \
mv apache-tomcat-${VERSION} /usr/local/tomcat && \
rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/*
EXPOSE 8080
CMD ["catalina.sh", "run"]
这里的jdk压缩包已经在本地下载和解压,以jdk1.8.0_211保存在/root/目录之下。Tomcat则是通过镜像下载。Jdk压缩包可以通过以下链接下载合适的版本:https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html
保存之后,运行指令进行镜像构建:
docker build -t 192.168.xxx.xxx:5003/hxkg-tomcat-8.5 .
docker push 192.168.xxx.xxx:5003/hxkg-tomcat-8.5
2. Jenkins扩展包安装与全局变量设置
在左侧Manage Jenkins—Manage Plugins下安装docker-build-step, Publish Over SSH, Credentials Plugin
在Manage Jenkins—Configure System下,将Docker URL改为镜像仓库的服务器地址
在Publish over SSH里添加SSH服务器,添加要部署的服务器地址
3. 项目构建
在进入Jenkins服务后,点击左侧的新建Item,选择maven项目
在源码管理中,添加gitlab地址。Credentials为登录需要的账号密码信息。如果之前未设置,需要点右边手动添加。也可以用GitHub上的代码运行,在此提供一个简单的样例:https://github.com/sebsto/webapp.git
设置构建触发器
设置Post Steps,添加Execute Shell,注意修改仓库的IP地址
#You can change the name after 192.168.xxx.xxx:5003/
REPOSITORY=192.168.xxx.xxx:5003/test
# Write the Dockerfile
cat > Dockerfile << EOF
FROM 192.168.xxx.xxx:5003/hxkg-tomcat-8.5:latest
RUN rm -rf /usr/local/tomcat/webapps/*.war
COPY target/*.war /usr/local/tomcat/webapps
CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]
EOF
#Build image
docker build -t $REPOSITORY .
#Upload Image
docker push $REPOSITORY
添加SSH服务,服务器地址为需要部署的服务器。因为镜像已经推到了仓库,不需要传送文件,只需要运行指令。如果仓库和部署服务不在一台服务器上,还需要pull镜像。
#Keep the name same with you set above
REPOSITORY=192.168.xxx.xxx:5003/test
docker rm -f test
docker rmi $REPOSITORY
#You can change the mapping port before 8080
docker run -d --name test -p 2888:8080 $REPOSITORY
配置完成后,保存退出,点击Build Now进行构建。每一次构建的结果,可以通过点击左下方的序号,再点击“控制台输出”查看。
4. 常见构建错误
-
Get https://192.168.xxx.xxx:5003/v2/: http: server gave HTTP response to HTTPS client
解决方法:查看1.2部分,确保每个docker服务器上都正确设置了daemon.json
-
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
解决方法:检查docker服务是否正确安装并启动。如果正常运行,还有可能是权限问题。通过Jenkins的脚本访问server时,一般用户名为jenkins