"CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。作为一个面向开发和运营团队的解决方案,CI/CD 主要针对在集成新代码时所引发的问题 发布流程设计 部署 Git 仓库 准备 Jenkins 环境 部署私有镜像仓库 安装 Docker 构建 .."

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

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 仓库

yum install git -y
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

# 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
# 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 ...

第一步:输入上面日志输出的密码:a5f1f7c167fd4b8ab62f9497d32d97db,或者从本机 /root/.jenkins/secrets/initialAdminPassword 文件获取,点击继续 第二步:点击“选择插件来安装” 第三步:保持默认,点击继续 第四步:创建管理员用户,保存并完成 第五步:设置 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
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
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 放到宿主机上,容器以挂载形式使用。

# tar zxvf jdk-8u45-linux-x64.tar.gz 
# mv jdk-8u45-linux-x64 /usr/local/jdk1.8
# 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"]
# 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 安装必要插件

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

安装 SSH 与 Git Parameter 插件。

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

第一步:先创建一个用于连接 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 创建项目并发布测试

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

图片.png

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

图片.png

指定项目 Git 仓库地址:

图片.png

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

设置 maven 构建命令选项:

图片.png

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

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

图片.png

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
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 项目。

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

图片.png

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

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

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销, 可以很容易地在机器和数据中心中运行。最重要的是, 他们不依赖于任何语言、框架或包括系统。

    142 引用 • 237 回帖 • 761 关注
  • Jenkins

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

    24 引用 • 18 回帖 • 3 关注
感谢    关注    收藏    赞同    反对    举报    分享
回帖    
请输入回帖内容...