Jenkins 是一个简单易用的持续集成软件平台,我们依然采用 Docker 的方式部署,docker-compose.yml 配置文件如下:
version: '3.1'
services:
jenkins:
restart: always
image: jenkinsci/jenkins
container_name: jenkins
ports:
# 发布端口
- 8080:8080
# 基于 JNLP 的 Jenkins 代理通过 TCP 端口 50000 与 Jenkins master 进行通信
- 50000:50000
environment:
TZ: Asia/Shanghai
volumes:
- ./data:/var/jenkins_home
安装过程中会出现 Docker 数据卷 权限问题,用以下命令解决:
chown -R 1000 /usr/local/docker/jenkins/data
Jenkins 第一次启动时需要输入一个初始密码用以解锁安装流程,使用 docker logs jenkins 即可方便的查看到初始密码
插件是 Jenkins 的核心,其丰富的插件(截止到 2018.10.29 共有 77350 个插件)可以满足不同人群的不同需求
/var/jenkins_home/jdk1.8.0_152
/var/jenkins_home/apache-maven-3.5.3
写在前面
Jenkins 的持续交付流程与 GitLab Runner 的持续集成差不多,但 GitLab Runner 已经默认是配置好了 Git,所以 Jenkins 需要额外配置多一个 GitLab 的 SSH 登录。按照之前 GitLab Runner 的持续集成流程,Jenkins 的持续交付流程大致如下(其实原理还是挺简单的,但对于刚刚接触 Jenkins 同学理解起来可能还是有一点难度的):
拉取代码
打包构建
上传镜像
运行容器
维护清理
docker exec -it jenkins /bin/bash
ssh-keygen -t rsa -C "your_email@example.com"
cat /var/jenkins_home/.ssh/id_rsa.pub
Jenkins 的持续交付流程与 GitLab Runner 的持续集成差不多,但 GitLab Runner 已经默认是配置好了 Git,所以 Jenkins 需要额外配置多一个 GitLab 的 SSH 登录。按照之前 GitLab Runner 的持续集成流程,Jenkins 的持续交付流程大致如下(其实原理还是挺简单的,但对于刚刚接触 Jenkins 同学理解起来可能还是有一点难度的,最好看下本节视频加深理解):
步骤同
docker exec -it jenkins /bin/bash
1
ssh-keygen -t rsa -C "your_email@example.com"
1
cat /var/jenkins_home/.ssh/id_rsa.pub
1
系统管理
-> 系统设置
-> Publish over SSH
由于我们所有项目的父工程都是依赖于 myshop-dependencies
,所以我们的第一步是实现该项目的持续交付
在 GitLab 中为项目创建标签
在 Jenkins 中创建一个基于 Maven 的任务
这里使用了 Groovy 脚本来查询最近的 tags 版本,代码如下:
def ver_keys = [ 'bash', '-c', 'cd /var/jenkins_home/workspace/myshop-dependencies;git pull>/dev/null; git remote prune origin >/dev/null; git tag -l|sort -r |head -10 ' ]
ver_keys.execute().text.tokenize('\n')
1
2
echo $RELEASE_VERSION
cd /var/jenkins_home/workspace/myshop-dependencies
git checkout $RELEASE_VERSION
git pull origin $RELEASE_VERSION
mvn clean package
1
2
3
4
5
在 Jenkins 中创建一个基于 Maven 的任务
这里使用了 Groovy 脚本来查询最近的 tags 版本,代码如下:
def ver_keys = [ 'bash', '-c', 'cd /var/jenkins_home/workspace/myshop-service-user-provider;git pull>/dev/null; git remote prune origin >/dev/null; git tag -l|sort -r |head -10 ' ]
ver_keys.execute().text.tokenize('\n')
1
2
echo $RELEASE_VERSION
cd /var/jenkins_home/workspace/myshop-service-user-provider
git checkout $RELEASE_VERSION
git pull origin $RELEASE_VERSION
mvn clean package
1
2
3
4
5
Send files or execute commands over SSH(发送文件或执行远程命令)
`**/*.jar,docker/**`
1
**/*.jar
,我们打包的 .jar
文件是在 target
目录下的,传输时会一并创建 target
目录,如果不希望创建 target
目录,则可以使用该参数屏蔽掉这些前缀文件夹。myshop-service-user-provider
1
cd /usr/local/jenkins/myshop-service-user-provider
cp target/myshop-service-user-provider-1.0.0-SNAPSHOT.jar docker
cd docker
docker build -t 192.168.10.133:5000/myshop-service-user-provider:v1.0.0 .
docker push 192.168.10.133:5000/myshop-service-user-provider:v1.0.0
docker-compose down
docker-compose up -d
docker image prune -f
1
2
3
4
5
6
7
8
使用参数化构建项目
操作步骤同上
因篇幅问题不能全部显示,请点此查看更多更全内容