19

基于Jenkins与Docker的自动化CI/CD实践

 4 years ago
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.
neoserver,ios ssh client

高效的CI/CD环境能获得什么呢?
  1. 及时发现问题:提早得到集成反馈和修复
  2. 大幅度减少故障率:业务流程化,减少人工出错风险
  3. 加快迭代速度:可以在几分钟内运行几十次、甚至上百次持续集成
  4. 减少时间成本:多项目管理及繁琐的部署工作没有了,不必再花费一定时间去准备
  5. 研发端到端流水线,一键部署,应用弹性伸缩,灰度发布
要想做到一个高效的CI/CD流程,需要有能力整合DevOps工具链及多环境适配,并且设计之初以自动化为原则,如一键部署、一键升级。

发布流程设计

  • 开发语言:Java
  • 项目代码版本管理:Git
  • 代码编译:Maven
  • 持续集成:Jenkins
  • 交付:以Docker镜像形式交付,提交至Harbor
  • 部署:Docker主机创建容器
环境规划如下:

工作流程:
  1. 开发人员提交代码到Git版本仓库;
  2. Jenkins人工/定时触发项目构建;
  3. Jenkins拉取代码、代码编译、打包镜像、推送到镜像仓库;
  4. 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流水线还是有很多优点的,例如:
  1. 项目发布可视化,明确阶段,方便处理问题;
  2. 一个Jenkinsfile文件就可以管理整个项目生命周期;
  3. 代码版本管理方便,版本发布、回退一键完成。
原文链接:https://blog.51cto.com/u_10272167/2730581

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK