在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要。目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部署、交付(CD)。在此,我们来以一个案例初步了解 CI 流程。那么什么是 CI 呢?简单来讲,CI 就是将传统的代码合并、构建、部署、测试都集成在一起,不断地执行这个过程,并对结果进行反馈。
CI 流程设计图:
工作流程:
1. 开发人员提交代码到Git版本仓库;
2. Jenkins人工/定时触发项目构建;
3. Jenkins拉取代码、代码编码、打包镜像、推送到镜像仓库;
4. Jenkins在Docker主机创建容器并发布
服务器规划:
IP地址
|
角色
|
10.0.0.111
|
Jenkins,Docker,JDK,Maven
|
10.0.0.100
|
Harbor(Docker,docker-compose),Git
|
部署Git代码版本仓库
10.0.0.100 操作
# yum install git -y
# useradd git
# passwd git
# su – git
# mkdir wenlong.git
# cd wenlong.git/
#初始化仓库
# git --bare init
10.0.0.111 操作
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 操作
Jenkins主机安装Docker并配置可信任
10.0.0.111 操作
# 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环境部署
# tar zxvf jdk-8u45-linux-x64.tar.gz
# mv jdk1..0_45 /usr/local/jdk
# tar zxf apache-maven-3.5.-bin.tar.gz
# mv apache-maven-3.5. /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..tar.gz
# mv apache-tomcat-8.5. /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/,按提示输入密码,登录即可。
Jenkins安装必要插件
由于jenkins是离线安装,所有在此需要配置一下插件下载地址:系统管理-->插件管理-->Advanced
修改下方地址
jenkins插件清华大学镜像地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
http://mirror.xmission.com/jenkins/updates/update-center.json
将https修改为http 再点Submit
Submit后点击Available,Check now此时我们可以看到很多可获得插件
安装git和pipeline插件
Jenkins流水线部署
pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。
创建一个pipeline类型的Job
选择流水线类型
配置Pipeline script,点击Pipeline语法,来自动生成我们需要的配置。
选择Git方式,配置Git仓库地址,再添加认证相关
使用秘钥认证方式需要将jenkins上生成的公钥发送到git服务器上,然后将jenkins上的生成的私钥内容粘贴到下图Key中,这样jenkins就可以免交互的拉取git仓库中的代码了。
[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
配置完成后,生成Pipeline脚本了。点击下方Generate Pipeline Script,然后复制方框内的内容。
编写我们所需要的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..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
'''
}
}
在Pipeline脚本里面我们指定了一个branch参数,所以我们需要传递一个参数变量,这里我们选择参数化构建,默认值为master分支。
然后保存配置
发布测试
回到主界面,我们开始构建任务:
查看构建成功后的图形构建过程:
通过浏览器来访问java项目:http://10.0.0.111:88/