Jenkins 与 Docker 的自动化 CI/CD 实战

本贴最后更新于 1841 天前,其中的信息可能已经斗转星移

CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。作为一个面向开发和运营团队的解决方案,CI/CD 主要针对在集成新代码时所引发的问题

  • 发布流程设计
  • 部署 Git 仓库
  • 准备 Jenkins 环境
  • 部署私有镜像仓库
  • 安装 Docker
  • 构建 Tomcat 基础镜像
  • Jenkins 配置全局工具配置
  • Jenkins 安装必要插件
  • 上传 JAVA 项目代码到 Git 仓库
  • Jenkins 创建项目并发布测

一、发布流程设计

图片.png

工作流程:

  1. 开发人员提交代码到 Git 版本仓库;
  2. Jenkins 人工/定时触发项目构建;
  3. Jenkins 拉取代码、代码编码、打包镜像、推送到镜像仓库;
  4. Jenkins 在 Docker 主机创建容器并发布。

环境规划如下:

角色 IP
Jenkins/Docker 10.201.1.140
Docker 10.201.1.141
Git/Registry 10.201.1.142

操作系统:CentOS7.4

二、部署 Git 仓库

  • 安装 git
yum install git -y
  • 创建 Git 用户并设置密码
useradd git
passwd git
  • 创建仓库
su - git
mkdir solo.git
cd solo.git
git --bare init
  • 访问创建的这个仓库
git clone git@10.201.1.142:/home/git/solo.git

三、准备 Jenkins 环境

Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于代码编译、部署、测试等工作。 Jenkins 也是一个跨平台的,大多数主流的平台都支持,而且安装很简单,我们这里以部署 war 包方式安装它。
官网下载地址:https://jenkins.io/download/
如图点击下载最后一个 Generic Java package(war):
图片.png

  • 在安装前需要具备 Java 环境,安装方式如下:
# tar zxf jdk-8u45-linux-x64.tar.gz 
# mv jdk-8u45-linux-x64 /usr/local/jdk1.8 
# vi /etc/profile 
JAVA_HOME=/usr/local/jdk1.8 
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
export JAVA_HOME PATH CLASSPATH
# source /etc/profile
  • 在 10.201.1.140 主机安装 Jenkins,下载 Tomcat 二进制包将 war 包到 webapps 下即可:
# wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war 
# wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz 
# tar zxf apache-tomcat-8.5.32.tar.gz 
# mv apache-tomcat-8.5.32 /usr/local/tomcat-jenkins 
# rm /usr/local/tomcat-jenkins/webapps/* -rf 
# unzip jenkins.war -d /usr/local/tomcat-jenkins/webapps/ROOT 
# cd /usr/local/tomcat-jenkins/bin/ 
# ./startup.sh 
# tail ../logs/catalina.out -f 
... 
Jenkins initial setup is required. An admin user has been created and a password generated. 
Please use the following password to proceed to installation: 

a5f1f7c167fd4b8ab62f9497d32d97db 

This may also be found at: /root/.jenkins/secrets/initialAdminPassword ...
  • 部署成功,访问 Jenkins:http://ip:8080

第一步:输入上面日志输出的密码:a5f1f7c167fd4b8ab62f9497d32d97db,或者从本机/root/.jenkins/secrets/initialAdminPassword 文件获取,点击继续
第二步:点击“选择插件来安装”
第三步:保持默认,点击继续
第四步:创建管理员用户,保存并完成
第五步:设置 Jenkins 访问地址,保持默认,点击保存完成

  • 安装完成,开始使用 Jenkins:

图片.png

四、部署私有镜像仓库

Docker Hub 作为 Docker 默认官方公共镜像;如果想自己搭建私有镜像仓库,官方也提供 registry 镜像,使得搭建私有仓库非常简单。
在 10.201.1.142 部署:

docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry

接下来测试 registry 可用性。
由于 Docker CLI 默认以 HTTPS 访问,而部署的 registry 并未提供 HTTPS,因此,需要在 pull 镜像的 Docker 主机(10.201.1.140,10.201.1.141)添加 HTTP 可信任:

 # vi /etc/docker/daemon.json 
{"insecure-registries":["10.201.1.142:5000"]}
# service docker restart

五、安装 Docker

在三台主机安装 Docker,如下:

  • 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
  • 添加 Docker 软件包源:
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
  • 安装 Docker CE
yum install docker-ce -y
  • 配置加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://bc437cce.m.daocloud.io
  • 启动并开机启动
# systemctl start docker
# systemctl enable docker

六、构建 Tomcat 基础镜像

JAVA 程序必须有 JDK 环境才可以运行,为了减少镜像大小及提高性能,这里直接把 JDK 放到宿主机上,容器以挂载形式使用。

  • 在 140,141 机器上安装 JDK:
# tar zxvf jdk-8u45-linux-x64.tar.gz 
# mv jdk-8u45-linux-x64 /usr/local/jdk1.8
  • Tomcat 基础镜像 Dockerfile:
# cat Dockerfile
FROM centos:7
MAINTAINER lxd

ENV VERSION=8.5.38
ENV JAVA_HOME=/usr/local/jdk
ENV PATH=$PATH:$JAVA_HOME/bin
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
RUN export JAVA_HOME PATH CLASSPATH
RUN yum -y install wget

RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && \
    tar zxf apache-tomcat-${VERSION}.tar.gz && \
    mv apache-tomcat-${VERSION} /usr/local/tomcat && \
    rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \
    mkdir /usr/local/tomcat/webapps/ROOT

EXPOSE 8080
CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]
  • 构建镜像并上传到 registry:
# docker build -t 10.201.1.142:5000/tomcat-85 -f Dockerfile .
# docker push 10.201.1.142:5000/tomcat-85

七、Jenkins 配置全局工具配置

主页面 -> 系统管理 -> 全局工具配置

指定 JDK、Maven 设置为自动安装,Git 保持默认:

图片.png
图片.png

如果 Jenkins 主机没有 git 命令,需要安装 Git:

yum install git -y

八、Jenkins 安装必要插件

  • Jenkins 安装必要插件

主页面 -> 系统管理 -> 管理插件:
图片.png

安装 SSH 与 Git Parameter 插件。

插件说明:
SSH:用于 SSH 远程 Docker 主机执行 Shell 命令
Git Parameter:动态获取 Git 仓库 Branch、Tag

  • 配置 SSH 插件

第一步:先创建一个用于连接 Docker 主机的凭据。
主页面 -> 凭据 -> 系统 -> 右击全局凭据 -> 添加凭据:

图片.png

输入连接 Docker 主机的用户名和密码:

图片.png

第二步:添加 SSH 远程主机
主页面 -> 系统管理 -> 系统设置 -> SSH remote hosts:

图片.png

九、上传 JAVA 项目代码到 Git 仓库

从 Github 拉取开源 JAVA 博客系统 solo:

# git clone https://github.com/b3log/solo
# cd solo
移除旧的推送地址,添加新的:
# git remote remove origin 
# git remote add origin git@10.201.1.142:/home/git/solo.git
提交代码到Git仓库并创建tag:
# touch src/main/webapp/a.html
# git add .
# git commit -m “a”
创建标签:
# git tag 1.0.0
推送到Git服务器:
# git push origin 1.0.0 

十、Jenkins 创建项目并发布测试

  • 主页面 -> 新建任务 -> 输入任务名称,构建一个 Maven 项目:

图片.png
注意:如果没有显示“构建一个 Maven 项目”选项,需要在管理插件里安装“Maven Integration plugin”插件。

  • 配置 Git 参数化构建:

图片.png

动态获取 Git 仓库 tag,与用户交互选择 Tag 发布:

图片.png

指定项目 Git 仓库地址:

图片.png

修改/master 为 $Tag,Tag 是上面动态获取的变量名,表示根据用户选择打代码版本。

设置 maven 构建命令选项:

图片.png

利用 pom.xml 文件构建项目。

在 Jenkins 本机镜像构建与推送到镜像仓库,并 SSH 远程连接到 Docker 主机使用推送的镜像创建容器:

图片.png

  • 上图中,在 Jenkins 主机执行的 Shell 命令如下:
REPOSITORY=10.201.1.142:5000/solo:${Tag}
# 构建镜像
cat > Dockerfile << EOF
FROM 10.201.1.142:5000/tomcat:latest
RUN rm -rf /usr/local/tomcat/webapps/ROOT
COPY target/*.war /usr/local/tomcat/webapps/ROOT.war
CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]
EOF
docker build -t $REPOSITORY .
# 上传镜像
docker push $REPOSITORY
  • 上图中,SSH 远程 Docker 主机执行的 Shell 命令如下:
REPOSITORY=10.201.1.142:5000/solo:${Tag}
# 部署
docker rm -f blog-solo |true
docker image rm $REPOSITORY |true
docker container run -d --name blog-solo -v /usr/local/jdk1.8:/usr/local/jdk -p 88:8080 $REPOSITORY

注:容器名称 blog-solo,暴露宿主机端口 88,即使用宿主机 IP:88 访问 blog-solo 项目。

  • blog-solo 项目已配置完成,开始构建:

图片.png
图片.png
图片.png

图片.png

如果输出上述页面说明是正常的,页面没有加载成功样式,需要修改下项目里访问地址。

至此,自动化 CI 环境搭建完成,你可以模拟提交代码并打 tag 测试自动化发布流程。

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    475 引用 • 899 回帖
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...