请启用 Javascript 以查看内容

使用Docker构建JenkinsCICD自动发布

 ·   ·  ☕ 4 分钟  ·  ✍ CNSRE

在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要。目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部署、交付(CD)。在此,我们来以一个案例初步了解 CI 流程。那么什么是 CI 呢?简单来讲,CI 就是将传统的代码合并、构建、部署、测试都集成在一起,不断地执行这个过程,并对结果进行反馈。
CI 流程设计图
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控

工作流程

  1. 开发人员提交代码到Git版本仓库;
  2. Jenkins人工/定时触发项目构建;
  3. Jenkins拉取代码、代码编码、打包镜像、推送到镜像仓库;
  4. Jenkins在Docker主机创建容器并发布
    cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控

服务器规划

IP地址 角色
10.0.0.111 Jenkins,Docker,JDK,Maven
10.0.0.100 Harbor(Docker,docker-compose),Git

部署Git代码版本仓库

10.0.0.100 操作

1
2
3
4
5
6
7
8
# yum install git -y
# useradd git
# passwd git
# su – git
# mkdir wenlong.git
# cd wenlong.git/
#初始化仓库
# git --bare init

10.0.0.111 操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Jenkins主机测试访问该仓库:
git clone git@10.0.0.100:/home/tools/git/wenlong.git
正克隆到 'wenlong'...
git@10.0.0.100's password: "git账号的密码"
warning: 您似乎克隆了一个空版本库。
模拟生产项目,拉取github上的一个demo,并上传至本地git库
# mv tomcat-java-demo-master/* wenlong/
# git add .
需要验证
# git config --global user.email "xuewenlong@123.com"
# git config --global user.name "xuewenlong"
# git commit -m "all"
# git push origin master

部Harbor镜像仓库

10.0.0.100 操作
参考:harbor私有仓库安装

  1. Jenkins主机安装Docker并配置可信任
    10.0.0.111 操作
1
2
3
4
5
6
7
8
# wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# yum install docker-ce -y
# cat /etc/docker/daemon.json 
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
  "insecure-registries": ["192.168.31.63"]
}
# systemctl start docker
# systemctl enable docker

Jenkins环境部署

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# tar zxvf jdk-8u45-linux-x64.tar.gz
# mv jdk1.8.0_45 /usr/local/jdk
# tar zxf apache-maven-3.5.0-bin.tar.gz
# mv apache-maven-3.5.0 /usr/local/maven
# vim /etc/profile
JAVA_HOME=/usr/local/jdk
PATH=$PATH:$JAVA_HOME/bin:/usr/local/maven/bin
export JAVA_HOME PATH 
# source /etc/profile
在10.0.0.111主机安装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.38/bin/apache-tomcat-8.5.38.tar.gz
# tar zxf apache-tomcat-8.5.38.tar.gz
# mv apache-tomcat-8.5.38 /usr/local/tomcat-jenkins
# rm -rf /usr/local/tomcat-jenkins/webapps/*
# mv jenkins.war /usr/local/tomcat-jenkins/webapps/ROOT.war
# cd /usr/local/tomcat-jenkins/bin/
# ./startup.sh

启动后,浏览器访问http://10.0.0.111:8080/,按提示输入密码,登录即可
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控

Jenkins安装必要插件

由于jenkins是离线安装,所有在此需要配置一下插件下载地址:系统管理–>插件管理–>Advanced

cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控

修改内容

1
2
3
jenkins插件清华大学镜像地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
http://mirror.xmission.com/jenkins/updates/update-center.json

将https修改为http 再点Submit
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
Submit后点击Available,Check now此时我们可以看到很多可获得插件
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
安装git和pipeline插件。
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控

Jenkins流水线部署

pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。
创建一个pipeline类型的Job:
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
选择流水线类型
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
到这里我们就开始配置Pipeline script,点击Pipeline语法,来自动生成我们需要的配置。
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
如下图,我们Git方式,配置Git仓库地址,再添加认证相关。
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
这里我们使用的是秘钥认证方式,需要将jenkins上生成的公钥发送到git服务器上,然后将jenkins上的生成的私钥内容粘贴到下图Key中,这样jenkins就可以免交互的拉取git仓库中的代码了。

1
2
3
4
5
[root@docker-jenkins bin]# ssh-keygen
[root@docker-jenkins bin]# cd
[root@docker-jenkins ~]# ls .ssh/
id_rsa  id_rsa.pub  known_hosts
[root@docker-jenkins ~]# ssh-copy-id git@10.0.0.100

cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
配置完成后,我们就可以生成Pipeline脚本了。点击下方Generate Pipeline Script,然后复制方框内的内容。
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控

编写我们所需要的Pipeline脚本如下,将其粘贴到script的拉取代码模块中,并修改分支master为${branch},其他模块内容自行编写。

node {
   def mvnHome
   stage('Preparation') { // for display purposes
   //拉取代码
      checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '7c00a680-53fd-42db-a12a-21b803dd6c40', url: 'git@10.0.0.100:/home/tools/git/wenlong.git']]])
   }
   //编译代码
   stage('Build') {
        sh '''
        export JAVA_HOME=/home/tools/jdk1.8.0_221
        mvn clean package -Dmaven.test.skip=true
        '''
   }
   // 项目打包到镜像并推送到镜像仓库
   stage('Build and Push Image') {
sh '''
REPOSITORY=10.0.0.100/library/wenlong:${branch}
cat > Dockerfile << EOF
FROM 10.0.0.100/library/tomcat:v1 
LABEL maintainer wenlong
RUN rm -rf /usr/local/tomcat/webapps/*
ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
EOF
docker build -t $REPOSITORY .
docker login 10.0.0.100 -u admin -p Harbor12345
docker push $REPOSITORY
'''
   }
   // 部署到Docker主机
   stage('Deploy to Docker') {
        sh '''
        REPOSITORY=10.0.0.100/library/wenlong:${branch}
        docker rm -f tomcat-java-demo |true
        docker pull $REPOSITORY
        docker container run -d --name wenlong -p 88:8080 $REPOSITORY
        '''
   }
}

cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
在Pipeline脚本里面我们指定了一个branch参数,所以我们需要传递一个参数变量,这里我们选择参数化构建,默认值为master分支。
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
然后保存配置。

发布测试

回到主界面,我们开始构建任务:
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
查看构建成功后的图形构建过程:
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
通过浏览器来访问java项目:http://10.0.0.111:88/
至此部署完成

文章链接
https://www.cnsre.cn/posts/210419172129/

分享

CNSRE
作者
CNSRE
一个📚学习中的👨‍💻SRE运维工程师🚀🚀🚀


目录