这一步完成了 我们就可以完成我们整个流程了:
工程修改后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
一个比较典型的微服务应用 这里只强调应用中的两个比较重要的文件 一个是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然后在该服务的service工程下边 创建一个文件 名为build.sh 内容如下 带中文注释的可以按照自身配置修改 下边的除非是项目结构不同 否则不要修改
#将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
#!/bin/bash之后push到gitlab上边
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###
打开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:x: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去构建