接前文,已经在windows电脑上安装了虚拟机,部署安装了Docker和Gitlab,为了模拟实现实际工作中使用Jenkins完成持续集成和持续部署,现在此基础上,试着搭建Docker+Jenkins+Gitlab+Maven的持续集成环境。
目录
大体步骤如下:
- 开发人员通过IDE工具将代码推送到gitlab.
- jenkins从gitlab中获取到源码,并使用maven编译、打包、自动构建镜像.
- jenkins在构建脚本中调用docker命令将构建好的镜像push到本地Docker Registry.并启动相应的容器.
- jenkins构建失败或者成功,可以及时将结果推送给相关人员,比如测试人员,安排测试.
- 运维人员只需获取相应的镜像就可以快速发布到生产环境
1、Docker下安装Jenkins
注意在安装Jenkins时踩过的坑:
A、安装的不是最新版本的Jenkins,导致在下载插件时总是失败。
解决:使用最新版本lts
B、因为没有跟虚拟机内的docker共用一个docker,导致Jenkins里编译后处理的shell脚本里不认识docker命令
解决:使用dood方式重新编译Jenkins,共用宿主机内的docker
下面详细说明。
①、首先在docker官方仓库网页搜索jenkins的镜像。注意,要安装的是 jenkins/jenins:lts,不是jenins,后者已经被官方废弃了。
docker pull jenkins/jenkins:lts
②、因为自己的docker和Jenkins安装在同一虚拟机下,并且打算在Jenkins的编译后处理里使用的shell脚本里,也想使用docker环境,但如果不加配置,则会在shell脚本执行时报:Docker not found错误。因此,决定使用dood方案,以使得在docker容器中使用宿主机上的docker服务。
②-1.先删掉之前建好的jenkins容器和镜像,然后在虚拟机上创建一个空的Dockerfile文件.
[root@bogon jenkins-dood]# touch Dockerfile
②-2.编写Dockerfile脚本
[root@bogon jenkins-dood]# vi Dockerfile
FROM jenkins/jenkins:lts
USER root
ARG dockerGid=999
RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group
USER jenkins
②-3.重新构建jenkins镜像
[root@bogon jenkins-dood]# docker build -t jenkins .
②-4.在启动Jenkins容器时,我们需要先创建一个Jenkins的配置目录,并且挂载到docker 里的Jenkins目录下.
[root@bogon /]# mkdir -p /opt/jenkins-dood
②-5.修改目录权限.
[root@bogon /]# chown -R 1000 /opt/jenkins-dood
②-6.开始运行jenkins容器
docker run \
-d \
-p 38080:8080 \
-p 50000:50000 \
--name jenkins \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/bin/docker \
-v /opt/jenkins-dood:/var/jenkins_home \
-u root \
--link gitlab:127.0.0.1 \
jenkins/jenkins:lts
开放端口:
firewall-cmd --zone=public --add-port=38080/tcp --permanent
至此,Jenkins已经启动成功了。
2、访问Jenkins,创建构建任务
1、登录:http://192.168.112.11:38080/
2、 让输入密码,通过下面的命令获得
cat /opt/jenkins/secrets/initialAdminPassword
修改密码后,重新登录:
3、进去以后,安装推荐插件
4、开始使用
5、进行系统设置:
6、进入全局设置
7、设置JDK和maven自动安装:
8、新建一个构建JOB任务
设置gitlab地址 和代码分支
设置编译后shell脚本,制作镜像,发布到docker执行
上面截图中的shell脚本代码如下:
#定义变量
API_NAME="cullinan"
API_VERSION="1.0.0"
API_PORT=58080
IMAGE_NAME="192.168.112.11:58080/cullinan/$API_NAME:$BUILD_NUMBER"
CONTAINER_NAME=$API_NAME-$API_VERSION
#进入target目录复制Dockerfile文件(目前Dockerfile就在项目工作空间下)
#cd $WORKSPACE/$API_NAME/target
#cp classes/Dockerfile .
#构建docker镜像
docker build -t $IMAGE_NAME .
#推送docker镜像 (目前Docker与Jenkins在同一虚拟机下,无需推送)
#docker push $IMAGE_NAME
#删除docker容器
cid=$(docker ps | grep "$CONTAINER_NAME" | awk '{print $1}')
if [ "$cid" != "" ]; then
docker rm -f $cid
fi
#启动docker容器
docker run -d -p $API_PORT:58080 --name $CONTAINER_NAME $IMAGE_NAME
#删除Dockerfile文件
rm -f Dockerfile
idea项目代码结构及Dockerfile内容如下:
Dockerfile文件
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD $WORKSPACE/$API_NAME/target/cullinan-1.0.0-SNAPSHOT.jar app.jar
RUN sh -c 'touch /app.jar'
RUN echo "Asia/Shanghai" > /etc/timezone
ENV JAVA_OPTS=""
ENTRYPOINT ["sh", "-c","java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar"]
3、开始在Jenkins上部署
查看执行结果:
去虚拟机上看下运行的docker容器,可以看到23#版本的项目已经成功部署到容器里了。
访问测试:
说明Jenkins部署成功。
附:参考:
Jenkins+Docker+Gitlab+Maven搭建持续集成环境 - 简书
https://www.jianshu.com/p/61adada18438
https://www.it610.com/article/1187248456125751296.htm