云原生系列2-CICD持续集成部署-GitLab和Jenkins

1、CICD持续集成部署

bash 复制代码
传统软件开发流程:
1、项目经理分配模块开发任务给开发人员(项目经理-开发)
2、每个模块单独开发完毕(开发),单元测试(测试)
3、开发完毕后,集成部署到服务器(测试、运维)
4、测试出现问题,提交bug,开发继续修复bug(开发)
5、bug修改完毕,继续提交测试....
问题:
1、模块之间依赖负载,集成部署经常出问题
2、测试人员经常在等待
3、按时交付也会出问题
思考:
1、测试时间能否提前(开发一提交代码,问题就能直接暴露出来:自动化测试)
2、人工集成部署 ( 能否使用自动化工具部署构建 )

持续集成:简称 CI

思想:每天要多次将代码合并到主干,并进行集成,测试,这样就可以提早发现错误,进行修正。持续集成也属于DevOps运维开发。

CI持续集成的好处:

1、自动化集成部署,提高了集成效率。

2、更快的修复问题。

3、更快的进行交付。

4、提高了产品质量。

持续集成流程:


DevOps 兴起于2009 年,近年来由于云计算、互联网的发展,促进了DevOps的基础设施及工具链的发展,涌现了一大批优秀的工具,这些工具包括开发,测试,运维的各个领域,例如:GitHub,Git/svn,Docker、Jenkins,HudSon,Ant/Maven/Gradle,QUnit、JMeter等,看下图:

这么多软件,按需学习,公司用什么学什么。

测试、部署的逻辑只需要写一遍,就可以自动运行了。

自动化监控平台(短信-)

自动化压测平台

2、GitLab类似github,是个私有仓库

1、GitLab安装,至少8G内存4核cpu

bash 复制代码
# 查找Gitlab镜像
docker search gitlab/gitlab-ce
# gitlab镜像拉取
docker pull gitlab/gitlab-ce
# 查看镜像
docker images
# 本机先建3个目录,为了gitlab容器通过挂载本机目录启动后可以映射到本机目录
# 配置文件
mkdir -p /home/gitlab/etc
# 数据文件
mkdir -p /home/gitlab/data
# 日志文件
mkdir -p /home/gitlab/logs
# 启动容器 mygitlab,如果不指定--hostname,host默认使用的是容器id访问。
docker run --name mygitlab -d \
--hostname=10.1.1.118 \
-p 4443:443 -p 8888:80 -p 8022:22 \
-v /home/gitlab/etc:/etc/gitlab \
-v /home/gitlab/data:/var/opt/gitlab \
-v /home/gitlab/logs:/var/log/gitlab \
--privileged=true \
gitlab/gitlab-ce:latest
# 动态查看容器日志
docker logs -f mygitlab

配置

bash 复制代码
# 配置http协议所使用的访问地址,不加端口默认为80
vim /home/gitlab/etc/gitlab.rb  加上下面这一行配置
external_url 'http://10.1.1.118'

/home/gitlab/data/gitlab-rails/etc/gitlab.yml,刚才启动容器指定的--hostname可在此配置文件修改配置

2、网页访问登入,http://10.1.1.118:8888

bash 复制代码
# 查看root用户默认密码
cat /home/gitlab/etc/initial_root_password
Password: Gsxzpjm/RwJgHlHIUJIOTFvfYnM19sC2VMPM7NTmCng=

登录成功后,修改密码(默认密码24小时有效)

3、创建项目

直接像使用github一样,所有操作都一样。

bash 复制代码
# 本机需要安装git环境
yum install git -y
git --version

克隆项目

bash 复制代码
# 全局配置
git config --global user.name "Administrator"
git config --global user.email "admin@example.com"
git config --global credential.helper store  #只需要输入一次账户密码信息就会被保存记住

# 注意点:需要配置端口8888
git clone http://10.1.1.118:8888/root/base-test.git    #有问题可rm -rf base-test删除项目再克隆一次
cd base-test     # 克隆下来后进入这个项目
# 创建一个分支git switch -c main,这里不创建分支main了,使用默认的master主分支
touch README.md    #创建一个项目
git add .      # git add README.md添加这个项目,git add . 添加当前目录下所有项目
git commit -m "update"  # 提交的信息-m "update"
git push -u origin master  #推送到master主分支

4、设置免密提交

bash 复制代码
[root@node1 ~]# ssh-keygen -t rsa -b 4096 -C "admin@example.com"   -t加密类型,-b加密大小,-C用户信息
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:woYgeVBL3AKa5oQ2Rz722JDGPBaLo26Mqd9XNPzYhcQ admin@example.com
The key's randomart image is:
+---[RSA 4096]----+
|o+o+     .       |
|o=O.=     E      |
|*B+/   . . .     |
|*oB.Bo  + . .    |
|.. ..o+.S= .     |
|+.   . .o o      |
|o+     .         |
|o  .  .          |
|... ..           |
+----[SHA256]-----+
[root@node1 ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDBm6BA8cjS4bjQKOpvReIE8nHEVTnd9tT25jhcxiQU2Epx190bCe/VVxomYQdIFEeECjPzx3TCLMHHxd5rNFaw9hljJwcQuaODmil5g1LmQRFZqnKoTXc9a5VDtW5CZpyGcgrl8lsE2Bgdh95Bmqta64VOhhc5sLjuSY6X5HQjBOvMmg6WetdlAiUIWp4egTXMXzXqCHfRkLw9opuqQpITpCmUOl94PRNG8eqhHGr0o38c/OJmNKDFXx9ouuuRLUJWvmK+qCsyvMTSGlvw3bKxsFGQA2V+Gn6jCgzrEZI1tZakmhoGw8EvuIViRrAjgre1tfzsO424cGGpRElXBHwhYx10NTX+e6HwZfvRznDuPsvkIQ6TlNIX0CIy2UxN63x4w3ZP3kOa+ZL0XTaGbHcxJZ2GUgYjQrHzSbDQ7cKKqiazl2epukcV+osf19QoVnbsg9uIBMC3t+i28fl+byZoJCpxIF+5ItmsyUq770ryKfaWVMrCYI76tMQHFKVE7rEe/fg6c2RwQxcEPfHOl1UN3nVo82x0HfqtMbDRmUdDMJaCf5X/QIS6oKTg7HosjnRb1XOioPAvr8aF2R5Qa3djkFssIj7BdNTia1lg7AuaGypMRIDohbrNOtkspxmVAyw4UQaqMX5buGYdJa+rBHUOK/UAXzj/EGKQCtmlkXGxFQ== admin@example.com


3、Jenkins安装

官网地址:https://www.jenkins.io/zh/

1、通过Docker安装Jenkins

bash 复制代码
# 创建挂载目录
mkdir -p /var/jenkins_home
chmod 777 /var/jenkins_home
# 安装jenkinsci/blueocean
docker run \
  -u root \
  -d \
  -p 8080:8080 \
  -p 50000:50000 \
  -v /var/jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean

[root@node1 ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                                                                      NAMES
c18bf132384c   jenkinsci/blueocean   "/sbin/tini -- /usr/..."   2 minutes ago   Up 2 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp   reverent_gould
[root@node1 ~]# docker logs -f c1   动态查看容器日志

2、网页登入,http://10.1.1.118:8080

查看密码,[root@node1 ~]# cat /var/jenkins_home/secrets/initialAdminPassword

3、进入插件安装页面,安装插件默认是国外网址,先改成国内网址,再安装推荐的所有插件即可。

bash 复制代码
/var/jenkins_home/updates/default.json  里面默认是国外网址,插件下载慢
#把 " www.google.com "  改成  " www.baidu.com "
#全局搜索 " updates.jenkins-ci.org/download " 替换成 mirrors.tuna.tsinghua.edu.cn/jenkins
cd /var/jenkins_home/updates
sed -i 's/https:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json 
sed -i 's/https:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json

部分插件安装失败不用管,直接点击继续

4、插件安装完毕,注册登录账户

5、配置实例的地址


6、下载更新插件

插件下载慢问题解决,Manage Plugins点击Advanced,把Update Site改为国内插件下载地址

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json






带感叹号!的,说明插件下载完成等待重启安装

检查插件配置,比如要使用的gitlab、docker、webhook之类的。没有的话,需要勾选下载,所有插件都更新到最新版本。

插件安装完重启,重启容器会挂掉,再启动容器就好了,重启后再次网页登入

bash 复制代码
[root@node1 updates]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@node1 updates]# docker ps -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED       STATUS                      PORTS     NAMES
c18bf132384c   jenkinsci/blueocean   "/sbin/tini -- /usr/..."   2 hours ago   Exited (5) 31 seconds ago             reverent_gould
[root@node1 updates]# docker start c1

7、创建流水线工程



bash 复制代码
pipeline {
    agent { docker 'maven:3.3.3' }
    stages {
        stage('build') {
            steps {
                sh 'mvn --version'
            }
        }
    }
}



双击进入此页面,右上角可叉掉

4、Jenkins使用

Jenkins基本指令,可参照官网学习,https://www.jenkins.io/zh/doc/pipeline/tour/hello-world/

Jenkins Pipeline(或简称为 "Pipeline")是一套插件,将持续交付的实现和实施集成到 Jenkins 中。持续交付 Pipeline 自动化的表达了这样一种流程:将基于版本控制管理的软件持续的交付到您的用户和消费者手中。

Jenkins Pipeline 提供了一套可扩展的工具,用于将"简单到复杂"的交付流程实现为"持续交付即代码"。Jenkins Pipeline 的定义通常被写入到一个文本文件(称为 Jenkinsfile )中,该文件可以被放入项目的源代码控制库中。

1、创建流水线任务(Hello,Jenkins)

bash 复制代码
pipeline {
    agent { docker 'maven:3.3.3'}  // agent定义环境,这里可理解为docker run
    stages {
        stage('Build') { 
            steps {
                // 具体的执行逻辑 shell命令
                sh 'mvn -version'
            }
        }
    }
}




如果出现了错误,就会出现红色报错。

bash 复制代码
pipeline {
    agent { docker 'maven:3.3.3'}  // agent定义环境,这里可理解为docker run
    stages {
        stage('Build') { 
            steps {
                // 具体的执行逻辑 shell命令
                sh 'mvn -version'
                sh 'docker version'  //会报错,启动的容器里面没有docker
            }
        }
    }
}


2、重试retry、超时timeout

将agent环境修改为any(any是默认的linux环境)

bash 复制代码
pipeline {
    agent any
    stages {
        stage('Deploy') {   //Deploy部署,不是Build构建了
            steps {
                // 重试,连续执行多次,如果不成功就停止了。
                retry(3){  //重试3次就停止了
                    sh './start.sh'  // 测试脚本
                }
            }
        }
    }
}
bash 复制代码
pipeline {
    agent any
    stages {
        stage('Deploy') {   //Deploy部署,不是Build构建了
            steps {
                // 超时,超过预期的时间,就会自动终止。支付、回调等场景。
                timeout(time: 10,unit: 'SECONDS'){  //分钟 MINUTES
                    sh './health-check.sh' // 测试脚本
                }
            }
        }
    }
}
bash 复制代码
pipeline {
    agent any
    stages {
        stage('Deploy') {   //Deploy部署,不是Build构建了
            steps {
                // 超时,超过预期的时间,就会自动终止。支付、回调等场景。
                timeout(time: 10,unit: 'SECONDS'){  //分钟 MINUTES
                    sh 'ping www.baidu.com' 
                }
            }
        }
    }
}

3、钩子函数post,生命周期的函数

pipeline 执行到某个步骤的时候,来做一些事情。

bash 复制代码
pipeline {
    agent any
    stages {
        stage('Test') { 
            steps {
         		sh 'testfail'  //没有此命令会执行失败
            }
        }
    }
    // 钩子函数,比如执行结果不同,我们可以处理一些善后工作
    post {
    	// 行为
    	always {
    		echo 'always'
    	}
    	success {
            echo 'success'
    	}
    	failure {
    		echo 'failure'
    	}
    	unstable {
    		echo 'unstable'
    	}
    	changed {
    		echo 'changed'
    	}
    }
}
bash 复制代码
pipeline {
    agent any
    stages {
        stage('Test') { 
            steps {
         		sh 'echo  11'  //成功执行
            }
        }
    }
    // 钩子函数,比如执行结果不同,我们可以处理一些善后工作
    post {
    	// 行为
    	always {
    		echo 'always'
    	}
    	success {
            echo 'success'
    	}
    	failure {
    		echo 'failure'
    	}
    	unstable {
    		echo 'unstable'
    	}
    	changed {
    		echo 'changed'
    	}
    }
}

4、定义执行环境agent,将agent环境修改为any(any是默认的linux环境)

agent 指令告诉Jenkins在哪里以及如何执行Pipeline或者Pipeline子集。所有的Pipeline都需要 agent 指令。在执行引擎中,agent 指令会引起以下操作的执行:

1、所有在块block中的步骤steps会被Jenkins保存在一个执行队列中。 一旦一个执行器 executor 是可以利用的,这些步骤将会开始执行。

2、一个工作目录workspace(/var/jenkins_home/workspace) 将会被分配, 工作空间中会包含来自远程仓库的文件和一些用于Pipeline的工作文件。

在Pipeline中可以很容易的运行 Docker 镜像和容器。 Pipeline可以定义命令或者应用运行需要的环境和工具, 不需要在执行代理中手动去配置各种各样的系统工具和依赖。这种方式可以让你使用 Docker容器工具包 中的任何工具。

bash 复制代码
pipeline {
    agent {
        docker { image 'node:7-alpine' }
    }
    stages {
        stage('Test') {
            steps {
                sh 'node --version'
            }
        }
    }
}
bash 复制代码
如果是其他环境,就配置其他的运行镜像即可,默认any(linux环境)。
pipeline{
    agent {
        docker { image '***:version' }
    }
    stages{  
        // 执行步骤
        dockerfile
        dockercompose
        shell
        其他程序相关的命令
        .....
    }
}

5、环境变量environment

全局的环境变量,在所有的 steps 步骤都可以使用。像linux中profile文件、docker --env都是定义环境变量的。很多命令会使用环境变量,可以在这里定义。

bash 复制代码
pipeline {
    agent any 
    // 环境变量的定义
    environment{
    	DB_ENGINE = 'sqlite'
    	DB_PASSWORD='123456'
    }   
    stages {
        stage('Build') {
            steps {   // 在steps步骤中使用环境变量
                sh 'echo $DB_ENGINE'
                sh 'echo $DB_PASSWORD'
            }
        }
    }
}

6、多步骤

bash 复制代码
// 最外层 pipeline
pipeline {
	// agent 环境
    agent any
    // 步骤集合
    stages {
    	// 分步骤
        stage('Build') {  // 构建项目
        	// 具体的步骤
            steps {
                // 具体的执行逻辑 shell命令
                sh 'echo Build'  // Dockerfile、构建相关工作
            }
        }
        
        	// 分步骤
        stage('Test') {  // 测试项目
        	// 具体的步骤
            steps {
                // 具体的执行逻辑 shell命令
                sh 'echo Test'   // shell测试、web测试、压测
            }
        }
        
        // 分步骤
        stage('Deploy') {  // 部署
        	// 具体的步骤
            steps {
                // 具体的执行逻辑 shell命令
                sh 'echo Deploy'   // 访问、集群、liunx
            }
        }
    }
}


7、人工确认

通常在阶段之间,特别是不同环境阶段之间,可能需要人工确认是否可以继续运行。 例如,判断应用程序是否在一个足够好的状态可以进入到生产环境阶段。 这可以使用 input 步骤完成。 在下面的例子中,"Sanity check" 阶段会等待人工确认,并且在没有人工确认的情况下不会继续执行。

bash 复制代码
pipeline {
    agent any
    stages {
  
        stage('Deploy - Staging') {
            steps {
                echo 'curl '
            }
        }

        stage('Sanity check') {
            steps {
            	// 人工确认
                input "Does the staging environment look ok?"
            }
        }

        stage('Deploy - Production') {
            steps {
               echo 'Deploy - Production'
            }
        }
    }
}


5、webhook触发器

构建触发器,自动触发构建执行,有一个 webhook 触发器。测试环境关闭防火墙让容器之间互通。

逻辑:提交代码后,jenkins能够自动感知到代码提交了,流水线工程(项目打包,构建镜像,运行容器,测试接口,人工确认,部署上线)就会自动执行。

开发git提交代码push推送到仓库gitlab,仓库gitlab绑定jenkins触发器webhook,jenkins触发器webhook检测到仓库gitlab代码发生变化,会自动执行jenkins的流水线任务(pipeline)。在cicd链上,部署、测试脚本都要提前写好,一次写好,终身运行。

jenkins就发出了一个触发器命令,需要gitlab代码仓库那边配置触发

gitlab账户允许配置

项目中配置webhook







6、流水线项目

流水线项目官方文档:https://www.jenkins.io/zh/doc/tutorials/build-a-java-app-with-maven/

1、clone克隆GitHub示例仓库到本地,然后push到自己的gitlab仓库中

bash 复制代码
git clone https://github.com/jenkins-docs/simple-java-maven-app.git
mv simple-java-maven-app simple-java-maven-app2
git clone http://10.1.1.118:8888/root/simple-java-maven-app.git
cp -r simple-java-maven-app2/* simple-java-maven-app/

cd simple-java-maven-app
git add .
git commit -m "add"
git push -u origin master


2、在 jenkins 创建流水线项目 simple-java-maven-app

配置绑定git

添加git仓库登录凭证



测试构建

Docker maven构建很慢,需要配置镜像加速,可以自己定义settings文件,然后识别。

编写一个 settings.xml 放到项目下

bash 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <mirrors>
	<mirror>
      <id>nexus-aliyun</id>  
      <mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>  
      <name>Nexus aliyun</name>  
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>  
    </mirror>
  </mirrors>
</settings>



修改 Jenkinsfile,指定我们自己写的 settings.xml

bash 复制代码
pipeline {
    agent {
        docker {
            image 'maven:3-alpine'
            args '-v /root/.m2:/root/.m2'
        }
    }
    stages {
        stage('Build') {
        	// 在原来的基础上增加 -gs settings.xml 指定我们的配置
            steps {
                sh 'mvn -B -gs settings.xml -DskipTests clean package'              
            }
        }
    }
}

提交到远程,再次测试构建

开发提交代码后,自动构建并运行测试。

相关推荐
水宝的滚动歌词11 小时前
K8S单节点部署及集群部署
云原生·容器·kubernetes
yohoo菜鸟13 小时前
kubernetes简单入门实战
云原生·容器·kubernetes
Lyqfor17 小时前
云原生学习
java·分布式·学习·阿里云·云原生
Smile丶凉轩20 小时前
微服务即时通讯系统的实现(客户端)----(1)
微服务·云原生·架构
南慕小白20 小时前
云原生后端
云原生
小安运维日记21 小时前
CKA认证 | Day3 K8s管理应用生命周期(上)
运维·云原生·容器·kubernetes·云计算·k8s
politeboy1 天前
关于k8s中镜像的服务端口被拒绝的问题
云原生·容器·kubernetes
weixin_438197381 天前
K8S创建云主机配置docker仓库
linux·云原生·容器·eureka·kubernetes
ggaofeng1 天前
通过命令学习k8s
云原生·容器·kubernetes
qq_道可道2 天前
K8S升级到1.24后,切换运行时导致 dind 构建镜像慢根因定位与解决
云原生·容器·kubernetes