当前位置: 首页 > news >正文

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

1、CICD持续集成部署

传统软件开发流程:
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

# 查找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

配置

# 配置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
在这里插入图片描述

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

登录成功后,修改密码(默认密码24小时有效)
在这里插入图片描述
3、创建项目
在这里插入图片描述
直接像使用github一样,所有操作都一样。

# 本机需要安装git环境
yum install git -y
git --version

克隆项目

# 全局配置
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、设置免密提交
在这里插入图片描述

[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

# 创建挂载目录
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、进入插件安装页面,安装插件默认是国外网址,先改成国内网址,再安装推荐的所有插件即可。

/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之类的。没有的话,需要勾选下载,所有插件都更新到最新版本。
在这里插入图片描述
在这里插入图片描述
插件安装完重启,重启容器会挂掉,再启动容器就好了,重启后再次网页登入

[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、创建流水线工程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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)
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果出现了错误,就会出现红色报错。

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

在这里插入图片描述
在这里插入图片描述
2、重试retry、超时timeout
将agent环境修改为any(any是默认的linux环境)

pipeline {agent anystages {stage('Deploy') {   //Deploy部署,不是Build构建了steps {// 重试,连续执行多次,如果不成功就停止了。retry(3){  //重试3次就停止了sh './start.sh'  // 测试脚本}}}}
}

在这里插入图片描述

pipeline {agent anystages {stage('Deploy') {   //Deploy部署,不是Build构建了steps {// 超时,超过预期的时间,就会自动终止。支付、回调等场景。timeout(time: 10,unit: 'SECONDS'){  //分钟 MINUTESsh './health-check.sh' // 测试脚本}}}}
}

在这里插入图片描述

pipeline {agent anystages {stage('Deploy') {   //Deploy部署,不是Build构建了steps {// 超时,超过预期的时间,就会自动终止。支付、回调等场景。timeout(time: 10,unit: 'SECONDS'){  //分钟 MINUTESsh 'ping www.baidu.com' }}}}
}

在这里插入图片描述
3、钩子函数post,生命周期的函数
pipeline 执行到某个步骤的时候,来做一些事情。

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

在这里插入图片描述

pipeline {agent anystages {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容器工具包 中的任何工具。

pipeline {agent {docker { image 'node:7-alpine' }}stages {stage('Test') {steps {sh 'node --version'}}}
}

在这里插入图片描述

如果是其他环境,就配置其他的运行镜像即可,默认any(linux环境)。
pipeline{agent {docker { image '***:version' }}stages{  // 执行步骤dockerfiledockercomposeshell其他程序相关的命令.....}
}

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

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

在这里插入图片描述
6、多步骤

// 最外层 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” 阶段会等待人工确认,并且在没有人工确认的情况下不会继续执行。

pipeline {agent anystages {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仓库中

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 放到项目下

<?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

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'              }}}
}

在这里插入图片描述
提交到远程,再次测试构建
在这里插入图片描述
开发提交代码后,自动构建并运行测试。
在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/264598.html

相关文章:

  • 50ms时延工业相机
  • CPU缓存一致性问题
  • 35道HTML高频题整理(附答案背诵版)
  • 【powershell】Windows环境powershell 运维之历史文件压缩清理
  • 【Linux】Linux线程概念和线程控制
  • Flink cdc3.0同步实例(动态变更表结构、分库分表同步)
  • 国产Apple Find My认证芯片哪里找,伦茨科技ST17H6x芯片可以帮到您
  • 肺癌相关知识
  • ChimeraX使用教程-安装及基本操作
  • 【小黑嵌入式系统第十一课】μC/OS-III程序设计基础(一)——任务设计、任务管理(创建基本状态内部任务)、任务调度、系统函数
  • Redis一些常用的技术
  • 基于QPainter 绘图图片绕绘制设备中心旋转
  • 计算机网络(4):网络层
  • 动态内存分配(malloc和free​、calloc和realloc​)
  • C语言---井字棋(三子棋)
  • [Kubernetes]3. k8s集群Service详解
  • C++ 指定范围内递增初始化一个vector<int> | Python: list(range(31, 90))
  • 【Java之数据结构与算法】
  • 爬虫scrapy中间件的使用
  • 普冉(PUYA)单片机开发笔记 [完结篇]:使用体会
  • Elasticsearch:生成 AI 中的微调与 RAG
  • ip静态好还是dhcp好?
  • PolarDB-X、OceanBase、CockroachDB、TiDB二级索引写入性能测评
  • Convolutional Neural Network(CNN)——卷积神经网络
  • 鸿蒙开发基本概念
  • Open CV 图像处理基础:(二)从基本概念到实践操作
  • 【MAC】M2 安装docker 与 mysql
  • 轻量级web开发框架Flask本地部署及无公网ip远程访问界面
  • 用最通俗的语言讲解 TCP “三次握手,四次挥手”
  • 使用RedisCacheWriter#clean在线异步地批量扫描匹配删除缓存数据-spring-data-redis