docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

时间:2021-08-29 14:11:13

这一步完成了 我们就可以完成我们整个流程了:

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

由于笔者服务器资源有限 这里不做多台服务器的部署构建演示 思路是一样的 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

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

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

pom.xml文件加入以下内容

<build> 
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.3</version>
<configuration>
<imageName>${docker.image.prefix}/${company.name}:${project.parent.artifactId}.${project.port}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<exposes>${project.port}</exposes>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
<properties>   <docker.image.prefix>huaihkiss</docker.image.prefix>    <company.name>companyname</company.name>    <project.port>9875</project.port> </properties>
在该服务的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 创建一个新任务

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

如下图操作、

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

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


docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

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

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

选择刚刚录入的账号密码

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

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

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

构建那里选择Execute shell

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

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

chmod 777 service/build.sh
cd service
./build.sh
点击保存

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

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

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

vim /etc/passwd
docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

jenkins:x:990:0:Jenkins Automation Server:/var/lib/jenkins:/bin/false
保存 然后返回到gitlab的工程当中 选settings下边的 Integrations


docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

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

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

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

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

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

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

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

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

点击console output 可以查看日志

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

这个就是构建过程的日志

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

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

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

提交代码

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

看看jenkins 已经开始构建了 

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

点击进去看日志

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

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

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

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

docker images

docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成

查看镜像 

docker ps -a
docker容器自动化部署落地实践之五:用jenkins+gitlab+docker完成容器化工程自动化部署集成
已经成功运行 现在只要在ide上边push一下 就可以实现自动化构建容器应用了

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