00、CI/CD概述

持续集成(Continuous Integration, CI):代码合并、构建、部署、测试都在一起,不断地执行这个过程,并对结果反馈。
持续部署(Continuous Deployment, CD):部署到测试环境,预生产环境、生产环境。
持续交付(Continuous Delivery, CD):将最终产品发布到生产环境,给用户使用。

image.png

01、CI 工作流程设计

image.png

01.1、Jenkins Pipeline

Jenkins Pipeline是一套插件,支持在Jenkins中实现集成和持续交付管道;

Pipeline通过特定语法对简单到复杂的传输管道进行建模;

  • 声明式:遵循与Groovy相同语法。pipeline {}
  • 脚本式:支持Groovy大部分功能,也是非常表达和灵活的工具。node {}

Jenkins Pipeline的定义被写入一个文本文件,称为Jenkinsfile。

image.png
image.png
image.png

02、CI/CD 收益

高效的CI/CD环境可以获得:

  • 及时发现问题
  • 大幅度减少故障率
  • 加快迭代速度
  • 减少时间成本

1、部署Gitlab

1.1 部署Gitlab

  1. mkdir gitlab
  2. cd gitlab
  3. docker run -d \
  4. --name gitlab \
  5. -p 8443:443 \
  6. -p 9999:80 \
  7. -p 9998:22 \
  8. -v $PWD/config:/etc/gitlab \
  9. -v $PWD/logs:/var/log/gitlab \
  10. -v $PWD/data:/var/opt/gitlab \
  11. -v /etc/localtime:/etc/localtime \
  12. --restart=always \
  13. lizhenliang/gitlab-ce-zh:latest

访问地址:http://IP:9999
初次会先设置管理员密码 ,然后登陆,默认管理员用户名root,密码就是刚设置的。
image.png

gitlab目录说明:
1、/etc/gitlab:gitlab的配置文件
2、/var/log/gitlab:gitlab的日志文件
3、/var/opt/gitlab:gitlab实时代码数据存放目录
说明:
1、git 代码版本管理系统
2、gitlab 基于git做了图形管理页面
3、github 公共的代码管理仓库

1.2 创建项目,提交测试代码

进入后先创建项目,提交代码,以便后面测试。

unzip tomcat-java-demo-master.zip
cd tomcat-java-demo-master
git init
git remote add origin http://192.168.31.70:9999/root/java-demo.git
git add .
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
git commit -m 'all'
git push origin master

2、部署Harbor镜像仓库

2.1 安装docker与docker-compose

1、部署docker
# yum install -y yum-utils
# yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# yum install -y docker-ce
# systemctl start docekr
# systemctl enable docker

配置镜像加速器
# vi /etc/docekr/daemon.json
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}

重启docker服务
# systemctl restart docker

2、部署docker-compos
# mv docker-compose-Linux-x86_64 /usr/bin/docker-compose
# chmod +x /usr/bin/docker-compose


2.2 解压离线包部署

# tar zxvf harbor-offline-installer-v2.0.0.tgz
# cd harbor
# cp harbor.yml.tmpl harbor.yml
# vi harbor.yml
hostname: reg.ctnrs.com
https:   # 先注释https相关配置
harbor_admin_password: Harbor12345
# ./prepare --with-clair    #初始化配置文件
# ./install.sh  #部署安装harbor服务
# docker-compose down   #停止harbor服务
# docker-compose -f docker-compose.yml up -d    #启动harbor服务


2.3 在Jenkins主机配置Docker可信任,如果是HTTPS需要拷贝证书

由于habor未配置https,还需要在docker配置可信任。

# cat /etc/docker/daemon.json 
{"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
  "insecure-registries": ["reg.harbor.com"]
}
# systemctl restart docker


3、部署Jenkins

3.1 准备JDK和Maven环境

将二进制包上传到服务器并解压到工作目录,用于让Jenkins容器挂载使用。

# 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
修改Maven源:
    158      -->
    添加以下内容
    159    <mirror>
    160       <id>central</id>
    161       <mirrorOf>central</mirrorOf>
    162       <name>aliyun maven</name>
    163       <url>https://maven.aliyun.com/repository/public</url>
    164     </mirror>

docker run -d --name jenkins -p 80:8080 -p 50000:50000 -u root  \
   -v /opt/jenkins_home:/var/jenkins_home \
   -v /var/run/docker.sock:/var/run/docker.sock   \
   -v /usr/bin/docker:/usr/bin/docker \
   -v /usr/local/maven:/usr/local/maven \
   -v /usr/local/jdk:/usr/local/jdk \
   -v /etc/localtime:/etc/localtime \
   --restart=always \
   --name jenkins jenkins/jenkins:lts

访问地址:http://IP
image.png

jenkins目录说明:
1、/var/jenkins_home:jenkins数据存放目录
2、/usr/local/jdk:jenkins使用的jdk
3、/usr/local/maven:jenkins使用的maven仓库
挂载宿主机的docker文件挂载到jenkins容器里,实现docker in docker架构,在实现生产环境中,很少这样使用
-v /var/run/docker.sock:/var/run/docker.sock-v /usr/bin/docker:/usr/bin/docker

3.2 安装插件

管理Jenkins->系统配置—>管理插件—>搜索git/pipeline,选中点击安装。
image.png

默认从国外网络下载插件,会比较慢,建议修改国内源:

cd /opt/jenkins_home/updates
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && \
sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
docker restart jenkins

管理Jenkins->系统配置—>管理插件—>搜索Chinese,选中点击安装。需要手动重启。
image.png

docker restart jenkins

4、发布测试

4.1 创建项目并配置

New Item -> Pipeline -> This project is parameterized -> String Parameter

  • Name:Branch # 变量名,下面脚本中调用
  • Default Value:master # 默认分支
  • Description:发布的代码分支 # 描述

image.png
image.png

4.2 Pipeline脚本

#!/usr/bin/env groovy

def registry = "reg.harbor.com"
def project = "dev"
def app_name = "java-demo"
def image_name = "${registry}/${project}/${app_name}:${Branch}-${BUILD_NUMBER}"
def git_address = "http://192.168.211.130:9999/root/java-demo.git"
def docker_registry_auth = "e954ab4e-272e-4dd1-9afc-cbf55d20c4b2"
def git_auth = "c8709d73-1502-4993-b691-1ddbd9488460"

pipeline {
    agent any
    stages {
        stage('拉取代码'){
            steps {
              checkout([$class: 'GitSCM', branches: [[name: '${Branch}']], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
            }
        }

        stage('代码编译'){
           steps {
             sh """
                pwd
                JAVA_HOME=/usr/local/jdk
                PATH=$JAVA_HOME/bin:/usr/local/maven/bin:$PATH
                java -version
                mvn clean package -Dmaven.test.skip=true
                """
           }
        }

        stage('构建镜像'){
           steps {
                withCredentials([usernamePassword(credentialsId: "${docker_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
                sh """
                  echo '
                    FROM ${registry}/library/tomcat:v1
                    LABEL maitainer yangyuanqiang
                    RUN rm -rf /usr/local/tomcat/webapps/*
                    ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
                  ' > Dockerfile
                  docker build -t ${image_name} .
                  docker login -u ${username} -p '${password}' ${registry}
                  docker push ${image_name}
                """
                }
           }
        }

        stage('部署到Docker'){
           steps {
              sh """
              REPOSITORY=${image_name}
              docker rm -f tomcat-java-demo |true
              docker container run  -d --name tomcat-java-demo -p 88:8080 ${image_name}
              """
            }
        }
    }
}

上述脚本中,docker_registry_auth 和git_auth变量的值为Jenkins凭据ID,添加凭据后修改。

4.3 添加凭据

管理Jenkins->安全—>管理凭据->Jnekins->添加凭据->Username with password

  • Username:用户名
  • Password:密码
  • ID:留空
  • Description:描述

分别添加连接git和harbor凭据,并修改脚本为实际凭据ID。

添加harbor凭证
admin/Harbor12345
image.png

添加gitlab凭证
root/Admin123
image.png

4.4 发布应用

image.png
image.png
应用发布失败,查看报错日志进行分析处理

4.5 发布应用-钉钉机器人

管理Jenkins->系统配置—>管理插件—>搜索dingding,选中点击安装
image.png

构建应用,通过钉钉机器人通知
image.png
通知人:填写钉钉手机号码即可

image.png

image.png

image.png

4.6 SSH插件使用

管理Jenkins->系统配置—>管理插件—>搜索ssh,选中点击安装
image.png

这里使用的是密码方式远程,可使用密钥
image.png

5、 向GitLab提交代码之后自动触发Jenkins构建

GitLab服务器和Jenkins服务器可以通过Web Hook的方式进行通信。
管理Jenkins->系统配置—>管理插件—>搜索GitLab Plugin和GitLab Hook Plugin,选中点击安装
image.png
打开一个任务配置,构建触发器中选择”Build when a change is pushed to GitLab.”记下GitLab webhook URL,使用时候将localhost替换成服务器的ip地址。
image.png
在GitLab服务器中,在目标project的Settings->Integrations中添加Web Hook。将Jenkins产生的GitLab webhook URL填入URL,其他选项使用默认设置,点击”Add webhook”, webhook添加成功:
image.png
image.png
image.png
点击下方Test,并选择”Push events”, 系统报错,有权限问题:Jenkins匿名用户无Build权限。
image.png
在Jenkins中修改安全策略(谨慎操作,确保操作用户具有所有权限):
系统管理->全局安全配置->在安全矩阵中给予匿名用户Build权限
image.png
在GitLab中再次测试:
image.png

在Jenkins会看到应用在发布
image.png
钉钉机器人也会发送通知
image.png