共计 5126 个字符,预计需要花费 13 分钟才能阅读完成。
在互联网时代,对于每一家公司,软件开发和发布的重要性不言而喻,目前已经形成一套标准的流程,最重要的组成部分就是持续集成(CI)及持续部署、交付(CD)。本文基于 Jenkins+Docker+Git 实现一套 CI 自动化发布流程。
一、发布流程设计
工作流程:
- 开发人员提交代码到 Git 版本仓库;
- Jenkins 人工 / 定时触发项目构建;
- Jenkins 拉取代码、代码编码、打包镜像、推送到镜像仓库;
- Jenkins 在 Docker 主机创建容器并发布。
环境规划如下:
角色 | IP |
---|---|
Jenkins/Docker | 192.168.0.217 |
Docker | 192.168.0.218 |
Git/Registry | 192.168.0.219 |
操作系统:CentOS7.4
二、部署 Git 仓库
# yum install git -y
- 创建 Git 用户并设置密码
# useradd git # passwd git - 创建仓库
su - git mkdir solo.git cd solo.git git --bare init - 访问创建的这个仓库
# git clone git@192.168.0.212:/home/git/solo.git
三、准备 Jenkins 环境
Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于代码编译、部署、测试等工作。Jenkins 也是一个跨平台的,大多数主流的平台都支持,而且安装很简单,我们这里以部署 war 包方式安装它。
官网下载地址:https://jenkins.io/download/
如图点击下载最后一个 Generic Java package(war):
在安装前需要具备 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
在 192.168.0.217 主机安装 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:
四、部署私有镜像仓库
Docker Hub 作为 Docker 默认官方公共镜像;如果想自己搭建私有镜像仓库,官方也提供 registry 镜像,使得搭建私有仓库非常简单。
在 192.168.0.219 部署:
# 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 主机(192.168.0.217,192.168.0.218)添加 HTTP 可信任:
# vi /etc/docker/daemon.json | |
{"insecure-registries":["192.168.0.219:5000"]} | |
# service docker restart |
五、安装 Docker
在 192.168.0.217/192.168.0.218/192.168.0.219 主机安装 Docker,如下:
- 安装依赖包
# yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加 Docker 软件包源:
--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 放到宿主机上,容器以挂载形式使用。
在 192.168.0.217/192.168.0.218 安装 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 www.aliangedu.com | |
ENV VERSION=8.5.32 | |
ENV JAVA_HOME /usr/local/jdk | |
RUN yum install wget -y | |
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 ["catalina.sh", "run"] |
构建镜像并上传到 registry:
# docker build -t 192.168.0.219:5000/tomcat-85 -f Dockerfile . | |
# docker push 192.168.0.219:5000/tomcat-85 |
七、Jenkins 配置全局工具配置
主页面 -> 系统管理 -> 全局工具配置
指定 JDK、Maven 路径,Git 保持默认:
如果 Jenkins 主机没有 git 命令,需要安装 Git:# yum install git -y
八、Jenkins 安装必要插件
1. Jenkins 安装必要插件
主页面 -> 系统管理 -> 管理插件:
安装 SSH 与 Git Parameter 插件。
插件说明:
- SSH:用于 SSH 远程 Docker 主机执行 Shell 命令
- Git Parameter:动态获取 Git 仓库 Branch、Tag
2. 配置 SSH 插件
第一步:先创建一个用于连接 Docker 主机的凭据。
主页面 -> 凭据 -> 系统 -> 右击全局凭据 -> 添加凭据:
输入连接 Docker 主机的用户名和密码:
第二步:添加 SSH 远程主机
主页面 -> 系统管理 -> 系统设置 -> SSH remote hosts:
九、上传 JAVA 项目代码到 Git 仓库
从 Github 拉取开源 JAVA 博客系统 solo:
# git clone https://github.com/b3log/solo | |
# cd solo | |
移除旧的推送地址,添加新的:# git remote remove origin | |
# git remote add origin git@192.168.0.219:/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 项目:
注意:如果没有显示“构建一个 Maven 项目”选项,需要在管理插件里安装“Maven Integration plugin”插件。
配置 Git 参数化构建:
动态获取 Git 仓库 tag,与用户交互选择 Tag 发布:
指定项目 Git 仓库地址:
修改 */master 为 $Tag,Tag 是上面动态获取的变量名,表示根据用户选择打代码版本。
设置 maven 构建命令选项:
利用 pom.xml 文件构建项目。
在 Jenkins 本机镜像构建与推送到镜像仓库,并 SSH 远程连接到 Docker 主机使用推送的镜像创建容器:
上图中,在 Jenkins 主机执行的 Shell 命令如下:
REPOSITORY=192.168.0.219:5000/solo:${Tag} | |
# 构建镜像 | |
cat > Dockerfile << EOF | |
FROM 192.168.0.219:5000/tomcat-85:latest | |
RUN rm -rf /usr/local/tomcat/webapps/ROOT | |
COPY target/*.war /usr/local/tomcat/webapps/ROOT.war | |
CMD ["catalina.sh", "run"] | |
EOF | |
docker build -t $REPOSITORY . | |
# 上传镜像 | |
docker push $REPOSITORY |
上图中,SSH 远程 Docker 主机执行的 Shell 命令如下:
REPOSITORY=192.168.0.219: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 项目已配置完成,开始构建:
选择 tag,开始构建:
点击左下角构建历史里,右击第一个查看控制台输出:
浏览器访问 solo 项目:http://192.168.0.218:88
如果输出上述页面说明是正常的,页面没有加载成功样式,需要修改下项目里访问地址。
至此,自动化 CI 环境搭建完成,你可以模拟提交代码并打 tag 测试自动化发布流程。
若你在容器运维中,遇到容器方面的问题,可以给我微信↓。同样,若发现有任何纰漏,还请随时指正,相互学习,共同进步!
