
19

基于Jenkins与Docker的自动化CI/CD实践
source link: http://dockone.io/article/2434133
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

高效的CI/CD环境能获得什么呢?
- 及时发现问题:提早得到集成反馈和修复
- 大幅度减少故障率:业务流程化,减少人工出错风险
- 加快迭代速度:可以在几分钟内运行几十次、甚至上百次持续集成
- 减少时间成本:多项目管理及繁琐的部署工作没有了,不必再花费一定时间去准备
- 研发端到端流水线,一键部署,应用弹性伸缩,灰度发布
发布流程设计
- 开发语言:Java
- 项目代码版本管理:Git
- 代码编译:Maven
- 持续集成:Jenkins
- 交付:以Docker镜像形式交付,提交至Harbor
- 部署:Docker主机创建容器
工作流程:
- 开发人员提交代码到Git版本仓库;
- Jenkins人工/定时触发项目构建;
- Jenkins拉取代码、代码编译、打包镜像、推送到镜像仓库;
- Jenkins在Docker主机创建容器并发布。
部署Git仓库
首先部署一个Git仓库,存储测试的代码,这里选择solo博客程序做测试:https://github.com/b3log/solo。该步骤在192.168.30.130上执行。安装Git:
# yum install -y git
创建Git用户并设置密码:
# useradd git# passwd git
创建仓库:
# su - git# mkdir solo.git# cd solo.git# git init --bare #创建裸仓库# vim config #添加用户,否则commit报错[user]
name = lzx
email = [email protected]
上传项目到仓库:
拉取代码:
# git clone https://github.com/b3log/solo.git
添加私有仓库地址:
# cd solo/# git remote remove origin# git remote add origin [email protected]:/home/git/solo.git
提交到私有仓库:
# git add .# git commit -m "all"# git push origin master
部署Harbor镜像仓库
之前部署过,此处省略,参考这里:https://blog.csdn.net/miss1181 ... 56200安装Docker
需要安装Docker及配置Java环镜。 该步骤在192.168.30.128上执行。安装依赖包:
# yum install -y yum-utils device-mapper-persistent-data lvm2
添加Docker软件包源:
# curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
安装Docker CE:
# yum install -y docker-ce
启动并开机启动:
# systemctl start docker && systemctl enable docker
安装Java和Maven环境:
# tar zxf jdk-8u191-linux-x64.tar.gz && mv jdk1.8.0_191/ /usr/local/jdk# wget http://mirrors.shu.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz# tar zxf apache-maven-3.6.0-bin.tar.gz && mv apache-maven-3.6.0/ /usr/local/maven# vim /etc/profileMAVEN_HOME=/usr/local/maven
JAVA_HOME=/usr/local/jdk
PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport JAVA_HOME PATH CLASSPATH# source !$
授权Docker主机免密登陆Git仓库:
# ssh-keygen# ssh-copy-id [email protected]# ssh [email protected] #测试登录
安装Jenkins
基于CentOS镜像构建Jenkins镜像,同时将安装JDK、Maven。该步骤在192.168.30.129上执行。编辑Dockerfile:
# vim Dockerfile-java
FROM centos:latest
MAINTAINER lzx [email protected]
RUN yum install -y wget vim curl unzip iproute net-tools && \
yum clean all && \
rm -rf /var/cache/yum/*
ADD jdk-8u191-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_191/ /usr/local/jdk && \
wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.39/bin/apache-tomcat-8.5.39.tar.gz && \
tar zxf apache-tomcat-8.5.39.tar.gz && \
mv apache-tomcat-8.5.39 /usr/local/tomcat && \
wget http://mirrors.shu.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz && \
tar zxf apache-maven-3.6.0-bin.tar.gz && \
mv apache-maven-3.6.0 /usr/local/maven && \
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war && \
rm -rf /usr/local/tomcat/webapps/* && \
unzip jenkins.war -d /usr/local/tomcat/webapps/ROOT && \
rm -rf jenkins.war jdk-* apache-*
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME /usr/local/jdk/jre
ENV CATALINA_HOME /usr/local/tomcat
ENV MAVEN_HOME /usr/local/maven
ENV CLASSPATH $JAVA_HOME/lib:$JRE_HOME/lib:$JRE_HOME/lib/charsets.jar
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib:$MAVEN_HOME/bin
WORKDIR /usr/local/tomcat
EXPOSE 8080
CMD ["catalina.sh","run"]
Docker构建Jenkins镜像:
# docker build -t jenkins-2.164 -f Dockerfile-java .
启动Jenkins:
# docker run -d -p 8080:8080 --name jenkins jenkins-2.164:latest
启动完打开网页访问
192.168.30.129:8080
,安装推荐插件,设置账户密码。添加凭据:
系统管理
→ 凭据配置
→ 凭据
→ Jenkins
→ 全局凭据
→ 添加凭据
新建节点:
系统管理
→ 节点管理
→ 新建节点
标签请注意不要填错,用于识别哪一个slave执行任务。
新建任务:
新建任务
→ 流水线
,名称任意。Jenkinsfile如下:
node ("192.168.30.128") { #指定slave标签#拉取代码stage('Git Checkout') {
checkout([$class: 'GitSCM',branches: [[name: '$Tag']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: '[email protected]:/home/git/solo.git']]])} #$Tag引用用户交互输入的tag#代码编译stage('Maven Build') {
sh '''
export JAVA_HOME=/usr/local/jdk
/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true
'''}#项目打包到镜像并推送到镜像仓库stage('Build and Puah Image') {
sh '''
docker login -u admin -p Harbor12345 harbor.uqp.com
REPOSITORY=harbor.uqp.com/project/solo:${Tag}
cat > Dockerfile2 <<EOF
FROM harbor.uqp.com/library/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 -f Dockerfile2 .
docker push $REPOSITORY
''' #根据$Tag作为镜像版本号}#部署到Docker主机stage('Deploy to Docker') {
sh '''
REPOSITORY=harbor.uqp.com/project/solo:${Tag}
docker rm -f blog-solo | true
docker image rm $REPOSITORY | true
docker login -u amdin -p Harbor12345 harbor.uqp.com
docker container run -d -v /usr/local/jdk:/usr/local/jdk --name blog-solo -p 88:8080 $REPOSITORY
'''}}
Git仓库模拟提交代码创建tag:
# cd solo/# touch src/main/webapp/123.txt# git add .# git commit -m "touch 123.txt"# git tag 1.0.0# git push origin 1.0.0
Jenkins上执行任务:
带参数执行构建:
到Docker主机上查看:
# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
386b2097e507 harbor.uqp.com/project/solo:1.0.0 "catalina.sh run" 3 minutes ago Exited (255) 2 minutes ago blog-solo
容器ID与Jenkins上一致,但意外退出,查看原因:
# docker logs 38[ERROR]-[2019-03-26 16:41:47]-[org.b3log.latke.Latkes:786]: Read skin [Pinghsu]'s configuration failed: null
[ERROR]-[2019-03-26 16:41:47]-[org.b3log.solo.SoloServletListener:316]: Can't load the default skins, please make sure skin [Pinghsu] is under skins directory and structure correctly
提示皮肤配置为空,因此容器启动不起来。整个过程中,maven构建这一步可能有误,但jenkins执行过程中未报错;也有可能是b3log官方仓库有问题。
查看Harbor是否有对应镜像:
对应业务的Docker镜像已经上传到Harbor中。
大致过程是没有问题的,基本上可以实现业务基于Jenkins与Docker的自动化发布。后续有空再更新优化maven过程。作为自动化CI/CD流水线还是有很多优点的,例如:
- 项目发布可视化,明确阶段,方便处理问题;
- 一个Jenkinsfile文件就可以管理整个项目生命周期;
- 代码版本管理方便,版本发布、回退一键完成。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK