用jenkins+gitlab+docker完成容器化工程自动化部署集成
阅读原文时间:2021年04月20日阅读:1

整个流程:

工程修改后push到gitlab >> gitlab通过webhook通知jenkins工程有改变 >>jenkins到gitlab取最新工程 >> jenkins完成容器构建 docker images >> push到docker hub >> 让单台或多台服务器同时拉下这个镜像并运行

还可以使用完整的如下CI, CD 流程

由于笔者服务器资源有限 这里不做多台服务器的部署构建演示 思路是一样的 push到docker hub后 读者可以用jenkins中的构建命令通过ssh连接多台机器 让其pull下镜像并运行即可 如有kubernetes 则以jenkins构建的服务器作为kubernetes的master去控制整个集群即可 可以避免ssh多台机器 。

通过如下工程到gitlab 现在我们要将他与jenkins的工程做webhook 实现一键push部署

笔者工程的结构是如下的 如果是java工程的小伙伴们 可以按照如下的流程做配置

search
|-----api
|-----service
|----build.sh
|---- src
|-----main
|-----docker
|-----Dockerfile

一个比较典型的微服务应用 这里只强调应用中的两个比较重要的文件 一个是Dockerfile 另外一个是build.sh

pom.xml文件加入以下内容

                  com.spotify         docker-maven-plugin         0.4.3                   ${docker.image.prefix}/${company.name}:${project.parent.artifactId}.${project.port}           src/main/docker           ${project.port}                                     /               ${project.build.directory}               ${project.build.finalName}.jar                                         
    huaihkiss     companyname     9875 
 

在该服务的service工程下边 创建一个目录到src/main下边 目录名为docker 在该目录下创建一个Dockerfile文件 内容如下

FROM huaihkiss/centos7-base:jdk-1.8
#将jdk镜像作为基础镜像
MAINTAINER huaihkiss 1174889899@qq.com
#作者信息
VOLUME /tmp
VOLUME ~/
#VOLUME是挂载 将/tmp挂载到宿主机 ~/目录也就是用户目录 这个目录笔者用来放工程日志
ADD service-1.0-SNAPSHOT.jar /search-app.jar
#将mvn 构建后的jar包放在容器根目录下
RUN sh -c 'touch /search-app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /search-app.jar"]
CMD /usr/sbin/sshd -D
 

然后在该服务的service工程下边 创建一个文件 名为build.sh 内容如下 带中文注释的可以按照自身配置修改 下边的除非是项目结构不同 否则不要修改

#!/bin/bash
source /etc/profile
 
#project build variable
#you can change this code for your project
###START###
#docker hub 仓库名
DOCKERRESPOSITORYUSERNAME=huaihkiss
#docker hub用户名
DOCKERLOGINUSERNAME=huaihkiss
#dockerhub密码
DOCKERLOGINPASSWORD=password
#dockerhub 仓库tag名
RESPOSITORYNAME=xhgoo
#应用名称
APPNAME=search
#应用端口
APPPORT=9875
#容器端口
INPORT=9875
#宿主机映射端口
OUTPORT=9875
#挂载宿主机目录
HOSTPATH=~/
#被挂载的容器目录
CONTAINNERPATH=/root
#容器名称
CONTAINNERNAME=${APPNAME}-${APPPORT}
#镜像名称
MYIMAGE=${DOCKERRESPOSITORYUSERNAME}/${RESPOSITORYNAME}:${APPNAME}.${APPPORT}
###END###
 
#don't change this code
###START###
cd ../
mvn clean
mvn install
cd -
# uncomment if you need push
docker login -u ${DOCKERLOGINUSERNAME} -p ${DOCKERLOGINPASSWORD}
# stop all container
docker stop ${CONTAINNERNAME}
# remove all container
docker rm ${CONTAINNERNAME}
# remove old images
docker rmi ${MYIMAGE}
# build jar and image
#mvn package -e -X docker:build -DskipTest
mvn package docker:build
# push image
#docker push ${MYIMAGE}
# running container
docker run -it -dp ${OUTPORT}:${INPORT} -v ${HOSTPATH}:${CONTAINNERPATH} --name ${CONTAINNERNAME} ${MYIMAGE} /bin/bash
###END###
 

之后push到gitlab上边

打开jenkins 创建一个新任务

如下图操作、

选git 填入gitlab上边需要持续集成的工程地址 之后点Credentials旁边的add

输入gitlab上边的账号密码 点add

选择刚刚录入的账号密码

构建触发器在Build when a change is pushed to GitLab. GitLab CI Service 前打勾并复制那个url然后点击Generate按钮 生成一串secret token 保存起来

构建那里选择Execute shell

填入刚刚我们编写的构建程序build.sh

chmod 777 service/build.sh
cd service
./build.sh

点击保存

注意一点:jenkins在安装的时候会创建一个jenkins账户 jenkins完成大部分的操作都是通过这个账户来完成的 所以有可能会遇到构建的时候没有权限的情况出现 这个时候 我们需要给jenkins账户赋予一个合适的权限 

笔者这里给jenkins用户改了用户组为root用户组 作为演示 读者可以根据需要修改自己的用户组

vim /etc/passwd
 

jenkins❌990:0:Jenkins Automation Server:/var/lib/jenkins:/bin/false
 

保存 然后返回到gitlab的工程当中 选settings下边的Integrations

将刚刚复制的jenkins ci地址与secret token粘贴上来 按照如图打勾 保存

还是那个页面 test一下刚刚的webhook是否可用 如图所示

如图所示 200的话 那么已经ok了

这时候到jenkins看看 已经开始构建了 点击它

点击console output 可以查看日志

这个就是构建过程的日志

现在测试webhook已经测试成功了 我们再来测试一下在ide中push代码 jenkins会不会自动构建 这里笔者把端口号改成了9876

提交代码

看看jenkins 已经开始构建了 

点击进去看日志

查看jenkins首页 可以看到工程状态信息

在服务器上通过docker命令查看镜像 可以发现已经构建成镜像了

docker images

查看镜像

docker ps -a

已经成功运行 现在只要在ide上边push一下 就可以实现自动化构建容器应用了

如果想让多台服务器运行该容器的话 则可以在build.sh里边用远程ssh执行命令的方式 或者k8s去构建