使用Jenkins和Docker持续集成java项目

使用Jenkins和Docker持续集成java项目

  • 项目地址:https://github.com/chenbin-353549444/spring-boot-admin-jenkins-docker
  • 简介:使用JenkinsDocker持续集成java项目,本例是Spring boot admin项目,较为简单,可做为参考。
  • 意义:JenkinsfileDockerfile将服务器设置和运维代码化、可视化、流程化、标准化,降低与其他人的沟通成本

安装Docker

参照官网安装:https://docs.docker.com/install/linux/docker-ce/centos/

  • 注意替换国内源加速,https://download.docker.com/linux/替换为https://mirrors.aliyun.com/docker-ce/linux/

配置阿里云镜像加速

1
2
3
4
5
6
7
8
9
10
$ sudo systemctl enable docker
$ sudo vi /etc/systemd/system/multi-user.target.wants/docker.service
$ #在文件中找到 ExecStart= 这一行,并且在其行尾添加上所需的配置。
$ #ExecStart=/usr/bin/dockerd --registry-mirror=https://c2iitbpy.mirror.aliyuncs.com
$ #加速器地址在阿里云管理控制台-容器服务-镜像-镜像仓库控制台-Docker Hub镜像站点中可以找到
$ #保存退出后,重新加载配置并启动服务:
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
$ #确认配置是否生效
$ sudo ps -ef | grep dockerd

安装Jenkins

运行Jenkins容器的命令

1
2
3
4
5
6
7
8
9
10
docker run \
--name jenkins \
-d \
-u root \
-p 8080:8080 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-e TZ=Asia/Shanghai \
-v "$HOME":/home \
jenkinsci/blueocean

  • 使用命名卷管理Jenkins目录,保持宿主机清洁。如要删除数据重新安装,需要删除命名卷
  • -e TZ=Asia/Shanghai设置时区
  • 将宿主的/var/run/docker.sock文件挂载到容器内的同样位置,从而让容器内可以通过unix socket调用宿主的Docker引擎
  • 首次运行选择默认插件即可,初始密码在日志中可以找到
  • 邮件和SSH等详细设置参照官网:https://jenkins.io/

Spring boot admin

使用start.spring.io创建最简单的spring boot admin项目,依赖选择ops下的spring boot admin(server)
运行后在localhost:8080可以看到admin的界面

Jenkinsfile

根目录下创建Jenkinsfile文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!groovy
pipeline {
agent none
stages {
stage('Build') {
agent {
docker {
image 'maven:3.5.0-jdk-8-alpine'
args '-v mavenRepository:/root/.m2'
}
}
steps {
sh 'mvn -B -DskipTests clean package --settings settings.xml'
}
}
stage('Test') {
agent {
docker {
image 'maven:3.5.0-jdk-8-alpine'
args '-v mavenRepository:/root/.m2'
}
}
steps {
sh 'mvn test --settings settings.xml'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
stage('Deliver') {
agent any
steps {
sh 'sh run.sh'
}
}
}
post {
always {
mail body: "${env.JOB_NAME} - Build # ${env.BUILD_NUMBER} - ${currentBuild.currentResult}: Check console output at ${env.BUILD_URL} to view the results.",
subject: "${env.JOB_NAME} - Build # ${env.BUILD_NUMBER} - ${currentBuild.currentResult}!",
to: '353549444@qq.com'
}
}
}

  • 使用maven容器代理BuildTest这两个步骤,该容器生命只在stage中有效
  • 使用命名卷mavenRepository存储maven依赖,同一宿主机可共用
  • 使用项目中的settings.xml设置maven国内源镜像
  • Deliver步骤不用代理,把前两步生成的jar部署到容器中
  • post步骤为发送结果邮件,需设置Jenkins管理邮箱和smtp

settings.xml中添加maven国内源镜像:

1
2
3
4
5
6
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>

部署脚本run.sh

写的比较简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
# 停止admin容器
(docker stop admin && echo "stop success") || echo "stop error";

# 删除damin容器
(docker rm admin && echo "rm success") || echo "rm error";

# 删除原来镜像
(docker rmi admin && echo "rmi success") || echo "rmi error";

# 生成新的镜像
docker build -t admin .;

# 运行admin容器
docker run --name admin \
-p 8899:8899 \
-d \
-e TZ=Asia/Shanghai \
admin

更复杂的脚本参考:多环境jar部署脚本示例

Dockerfile

1
2
3
4
5
FROM openjdk:8-jdk-alpine as APP
VOLUME /tmp
COPY target/admin-1.0.jar app.jar
ENV JAVA_OPTS="-Xms512m -Xmx2048m"
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

参考链接

Jenkins持续集成maven项目:https://jenkins.io/doc/tutorials/build-a-java-app-with-maven
CentOS安装Docker:https://docs.docker.com/install/linux/docker-ce/centos

文章目录
  1. 1. 使用Jenkins和Docker持续集成java项目
    1. 1.0.1. 安装Docker
    2. 1.0.2. 安装Jenkins
    3. 1.0.3. Spring boot admin
    4. 1.0.4. Jenkinsfile
    5. 1.0.5. 部署脚本run.sh
    6. 1.0.6. Dockerfile
    7. 1.0.7. 参考链接