环境准备

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java

 Docker 注册中心安装及配置

1. 安装 Artifactory

IP: 192.168.0.100, 安装后服务监听 8081端口

wget https://bintray.com/jfrog/artifactory-pro-rpms/rpm -O bintray-jfrog-artifactory-pro-rpms.repo
sudo mv bintray-jfrog-artifactory-pro-rpms.repo /etc/yum.repos.d/
yum install jfrog-artifactory-pro


2.生成反向代理配置, 映射 Artifactory 注册中心 

登陆 Artifatory , 进入 Admin->Reverse Proxy, 通过 UI 生成注册中心反向代理配置, 如下图:

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_02实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_03

推荐使用 Sub Domain 方式。


3.在 Artifactory 同一台机器安装 Nginx

yum install nginx

touch /etc/nginx/conf.d/artifactory.conf

将上一步骤生成的配置添加到 artifactory.conf 文件中。代理配置将子域名或指定端口服务映射到 Artifactory Docker 仓库,这样我们可以基于一个 Aritfacotry 实例创建多个 Docker 注册中心,分仓库存储管理 Docker 镜像,如下图:

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_04


4.创建 Docker 仓库

  • 创建 Docker 类型仓库:docker-dev-local2, docker-release-local2

  • 创建 Maven 类型仓库:libs-snapshot-local, libs-release-local

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_05


Jenkins 安装及配置

1.安装 Jenkins

IP: 192.168.0.101, 指定 Jenkins 服务端口 9080 (可以自定义)

wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.60.1/jenkins.war -O jenkins.war


nohup java -jar jenkins.war --httpPort=9080 >/dev/null 2>&1 &


2.安装相关插件

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_06


3.配置 Jenkins 系统配置

配置 Artifactory Server, 并开启 Enable Build Info proxy for Docker images,proxy 的作用是帮助我们收集并记录构建时的依赖以及发布构建等信息,其中 Proxy 端口设置为 8092(可以自定义),会在后面的步骤使用到。

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_07


4.在 Jenkins 所在机器安装 Docker

注意:Jenkins Master以及所有 Agent 上都需要安装 Docker

sudo yum install -y yum-utils

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

sudo yum makecache fast

sudo yum install docker-ce


5.配置Docker Client Proxy

mkdir -p /etc/systemd/system/docker.service.d

cat << EOF > /etc/systemd/system/docker.service.d/http-proxy.conf


[Service]

Environment="HTTP_PROXY=http://192.168.0.101:8092/"

EOF

systemctl daemon-reload

systemctl restart docker

其中 proxy 的 ip:port 为第 3 步Jenkins 上配置的 build info proxy


Ansible 安装配置

1.Jenkins 节点安装 Ansible, IP:192.168.0.101

rpm -iUvh http://dl.Fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

yum install ansible


2.添加受管理节点,用于发布业务应用

主节点生成密钥对,并发布到 App 节点

ssh-keygen -t rsa

ssh-copy-id -i root@192.168.0.102


App 运行节点 IP:192.168.0.102

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_08

Jenkins Pipeline

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java

创建 Jenkins Pipeline Job

1.创建 Pipeline 类型 Job

Job Name 命名为docker-app-pipeline


2.配置 docker-app-pipeline job

  • Fork Git repository:

    https://gitlab.com/yongqiang/docker-lifecycle-scripts/

  • 配置 JenkinsFile 对应 Git 仓库

  • 配置 JenkinsFIle 所在目录


实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_10


Pipeline 关键源码分析

1.业务 App 项目构建

基于Artifactory Plugin 提供的 DSL 进行项目构建,将构建的 war 包发布到 libs-snapshot-local 仓库,支持 Maven,Gradle

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_11


2.下载最新构建的 App war 包

基于Artifactory Latest Version API 查找项目构建的最新版本号,并下载对应 war 包到 workspace

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_12


3.将 war 包打包到 docker-app 镜像中

基于最新稳定版 docker-framework 镜像构建

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_13实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_14


4.测试 docker-app 镜像

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_15


5.升级 war 包以及 docker-app 到 Release 仓库

基于 Artifactory 的 promote api,从 Dev 仓库升级到 Release 仓库,并将最新 docker-app:$buildId 镜像 tag 为 latest 标签,方便对外提供服务


6.发布最新镜像到 App 服务器

App 服务器 IP:192.168.0.3

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_16


7.添加 Git Webhook

提交代码到 Git 仓库,自动触发 docker-app-pipeline Job,经构建,测试,快速发布到测试或生产环境,大大提高 CI/CD 持续交付速度


实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_08

运行效果

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java

1.构建过程视图,可以清晰看到构建过程以及每一步运行耗时

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_19


2.App 运行浏览

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_20

3.构建过程中,Artifactory Plugin 收集构建信息,可以记录本次构建发布的模块及其依赖信息,绑定镜像版本与业务 App 版本的关系,更加透明

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_21

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_08

总结

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java

今天我们实践了上一期的话题,解决传统流水线的一些隐患,基于 Jenkins,Artifactory,Docker 以及 Ansible 实现了自动化 Docker 流水线。理论上不需要任何人工操作,就可以快速将业务 App 快速发布到生产环境,帮助我们快速稳定的将代码转化为商业价值。

实战 Docker 流水线 – 基于 Jenkins Pipeline 实现 Docker 持续交付_java_24