DevOps持续交付之容器化CICD流水线

DevOps持续交付

随着DevOps⼤规模化的落地和应⽤,持续集成以及持续交付已经是⼀种常态的。CI指的是持续集成,使⽤的开源⼯具是Jenkins,CD指的是持续交付和持续部署,⼀个完整的软件开发⽣命周期为:

主要流程可以具体为:

构建阶段->单元测试阶段->部署阶段->⾃动化测试阶段->部署到⽣产环境阶段->度量和验证阶段。

DevOps体系

持续集成

持续集成(Continuous Integration)的⽬的就是让产品可以快速交付,同时还能保 持⾼质量的业务交付。它的核⼼代码集成到主⼲分⽀后,必须通过 ⾃动化测试,只要有⼀个测试⽤例失败,那么就不能集成。这样互联⽹的产品研发,就形成了⼀套标准化的流程。

如上是互联⽹产品交付的基本形态。持续集成指的是频繁地(⼀天多次)将代码集成到主⼲分⽀。它的好处具体有两点:

1、快速发现错误,每完成⼀点更新,就集成到主⼲分⽀,可以快速发现错误, 定位错误也是很容易

2、防⽌分⽀⼤幅度偏离主⼲。如果不是经常集成,主⼲⼜在不断更新,会导致以后集成的难度变⼤,也有可能导致难以集成。

持续交付

持续交付(Continuous delivery)指的是频繁地将软件的新版本,交付给测 试团队或者是客户,以供评审。如果评审通过,代码就进⼊到⽣产阶段 。持续交付可以把它理解为持续集成的下⼀步,它强调的是不管怎么更新,软件 是随时随地都可以进⾏交付

持续部署

持续部署(Continuous deployment)是持续交付的下⼀步,指的是代码通过 评审以后,⾃动部署到⽣产环境。持续部署的⽬标是,代码在任何时刻都是 可以部署的,可以进⼊到⽣产阶段。持续部署的前提是⾃动化测试完成,构建, 部署等步骤。持续部署与持续交付的区别如下所示:

Jenkins

Jenkins环境搭建 

在https://get.jenkins.io/war-stable/2.277.4/的地址下载最新稳定版的Jenkins,下载成功后,把它放在tomcat下的webapps下的⽬录下,然后启动tomcat,启动成功后,在链接地址http://localhost:8080/jenkins/login?from=%2Fjenkins%2F就会显示出登录的信息,密码显示在/Users//.jenkins/secrets/initialAdminPassword的⽬录下,在该⽬录下获取密码,然后输⼊到输⼊框⾥⾯,点击继续。如下图所示:

我们选择推荐安装的插件,就会⾃动安装插件,如下所示: 备注:如果是离线的情况,需要解决的思路使⽤ skip-certificate-check.hpi 插件来解决Jenkins离线的问题。

参数话构建

⾸先需要安装插件Persistent Parameter,Git Parameter,Build With Parameters,Active Choices(动态选择参数,可以根据不同需求选择不同执⾏的的动态参数)。

Git

认识Git 

Git是Linus Torvalds为了帮助管理Linux内核开发⽽开发的⼀个开放源码的版本控制软件,它采⽤了分布式版本库的⽅式,
不必服务器端软件⽀持。可以说它是⼀个开源的分布式版本控制系统,⽤于敏捷⾼效地处理任何⼩或者⼤的项⽬。


集中式&分布式 


集中式 


从中央代码服务器获取具体的代码,把代码下载到⾃⼰的本地,然后把代码,必须在有⽹络的情况下提交到中央服务器。典型的产品是SVN,所谓集中式的版本控制系统,只有⼀个中央数据仓库,如果中央数据仓库瘫痪或者是不可访问的情况下,所有的使⽤者⽆法使⽤SVN,⽆法进⾏提交或者备份⽂件。


分布式 


分布式版本控制系统,在每个使⽤者电脑上就有⼀个完整的数据仓库,没有⽹络依然可以使⽤Git。当然为了团队协作,会把本地数据同步到GitLab服务器或者是GitHub等代码仓库。


Git安装 


需要到https://git-scm.com/downloads进⾏下载,根据具体的操作系统来下载具体的安装包。


Git配置 


system
针对任意登录到Linux系统的⽤户⽣效


global
全局,只针对当前登录的⽤户⽣效,git配置写⼊~/.config/config


local
本地,只针对某⼀个⽂件夹⽣效。
⼀般配置的时候,使⽤的是全局配置,建议使⽤全局配置的⽅式。具体配置name和email如下:

在mac的系统中,配置信息就会写在该⽬录下cat ~/.gitconfig 查看显示全局的配置信息,使⽤到的命令为:

Git核⼼原理 

操作的⼀般都是⼯作⽬录,如果执⾏了git add的命令后,那么就会从⼯作区进⼊到暂存区,如果再执⾏了git commit的命令后,等于是从暂存区进⼊到本地仓库,如果再执⾏git push,就是从本地仓库进⼊到原地仓库。本地仓库主要记录的是所有⽂件的修改,删除,这些Git都会记录下来,⽬的是可以进⾏历史回退,追踪信息。 

Git使⽤

  • 本地已有代码,需要使⽤git来进⾏管理
  • 本地没有代码,需要创建⼀个新的git版本仓库
  • 本地没有代码,也没有仓库,去GitLab平台下载⼀个git版本代码仓库.使⽤到的命令为git clone

创建仓库的命令为:git init

Git命令

git本地仓库,就是⼀个git的版本库,也就是说在代码⽬录下的⼀个.git的⽂件夹,这就是管理⽂件信息的⽬录,也是git核⼼的本地仓库。github是共有代码托管平台,⽽Gitlab是私有代码托管平台。
A、本地有代码进⾏管理
直接到这个⽬录,执⾏git init就可以创建本地仓库了,那么后⾯的所有代码修改,都会记录相关的信息。
B、需要新创建本地仓库
git init来创建新的仓库信息。具体创建的过程如下:

C、托管平台下载
git clone来创建代码仓库,在公司⾥⾯很多时候使⽤的是这种⽅式。 

Git⽣命周期

它的⽣命周期可以完整的描述为:
git init #⽣成git⼯作区
git status #掌握git⼯作区的信息
git add #确认需要添加以及跟踪的⽂件
git commit -m "注释信息"#提交到本地仓库

Git⽂件命名 

在git中对⽂件进⾏重命名,因为修改都会进⾏监测到,那么操作的步骤为:如果使⽤常规的命令mv,那么就⼜需要进⾏add和commit的过程,这个过程可以说是有了删除的操作,也进⾏创建的过程,我们可以使⽤git mv的命令来轻松的解决,命令为:

修改⽂件名称后,也是需要进⾏提交到本地仓库的,也就是使⽤git commit -m的命令

Git的log 

查看Git的⽇志信息,主要使⽤到的命令具体汇总如下:
        git log --oneline #查看简陋的信息
        git log
        git log -1 #显示最新的⼀条提交记录信息
        git log --all --graph #查看提交的版本演变
        git reflog #记录git所有的操作,包含了提交以及回退

Git回退

git的版本管理是通过指针来进⾏管理的,这个指针就是HEAD,那么也就是说HEAD表示当前版本,HEAD^表示的是上⼀个版本,HEAD^^表的是上上个版本。

        git reset --hard 版本ID
        git reset --hard HEAD管理

备注:结合git reflog,可以回到过去,也是可以到未来的版本信息,也就是回退了,也是可以还原回去的

Git Stash

git stash可以称为临时空间。它的使⽤场景主要可以总结为:git stash就是把暂存区未提交的内容,临时存放到⼀个区域,⽅便⽇后取回来再次使⽤。场景可以描述为:修改⼀个⽂件后,进⾏了git add fileName⽂件,但是不进⾏具体的commit,这个时候可能需要⼲其他的事,⽐如需要修复线上的紧急bug,那么就需要把这个临时的存放到⼀个区域。具体命令如下:

localhost:learnGit liwangping$ git add index.py
localhost:learnGit liwangping$ git status
位于分⽀ master
要提交的变更:
(使⽤ "git restore --staged <⽂件>..." 以取消暂存)
修改:     index.py
localhost:learnGit liwangping$ git stash save "保存新增的⽂件信息"
保存⼯作⽬录和索引状态 On master: 保存新增的⽂件信息
localhost:learnGit liwangping$ git status
位于分⽀ master
⽆⽂件要提交,⼲净的⼯作区

⼲完其他事后,可以再把stash区域的⽂件恢复回来,使⽤到的命令具体为:
git stash list #查看stash区域的⽂件信息

git stash pop #恢复最新的stash进度到⼯作区

 

git stash pop stash_id#恢复指定的stash的进度 

git stash clear #清空所有存储的stash进度

Git分⽀管理

master是主⼲分⽀,⼀般我们的分⽀可以分为test dev stage的分⽀。分⽀涉及的命令具体如下
        git branch #查看当前的分⽀
        git branch test #创建⼀个测试分⽀
        git checkout test #切换分⽀
        git checkout -b 分⽀名称#创建新的分⽀并且⽴即切换到新的分⽀信息
        git branch -D 分⽀名称
        git merge 分⽀名称#分⽀的合并信息,如下就是显示的是把test的分⽀代码合并到master的分⽀

Git冲突解决 

git merge分⽀合并的时候,就需要解决各个冲突的问题,那么下⾯就具体的说明怎么样来解决冲突的问题。

git merge dev
⾃动合并 index.py
冲突(内容):合并冲突于 index.py
⾃动合并失败,修正冲突然后提交修正的结果。
localhost:learnGit liwangping$
如下是显示出图的⽂件内容信息,具体如下:
<<<<<<< HEAD
def func():
   print("this is a test branch")

针对合并出现如上的问题,解决的思路是:
出现冲突
查看冲突⽂件的内容
怎么修改⽂件,就需要⼈为处于进去
修改完成后,再针对⽂件进⾏add和commit的操作
Git标签 
git tag可以理解为:这对每个版本加上⼀个标签。标签涉及到的命令具体可以总结为:
git tag -a tagName -m 标签注释:创建⼀个标签,并且加上注释
git tag #查看标签信息
git log --decorate #查看标签的详细信息
git log --oneline --decorate #命令如上是⼀样的
git tag -a标签名称 commitID -m 标签注释
git show tagName #查看标签的具体详细的信息
Gitlab 
Gitlab环境搭建 
代码版本的管理是持续集成⾥⾯很重要的⼀个环节,在现代企业⾥⾯,对代码的管理都是通过Gitlab来进⾏管理
的。Gitlab是基于Ruby的代码来进⾏开发的。下⾯具体演示下Gitlab的安装。在Linux中安装Gitlab的依赖项,具体
为:
针对防⽕墙的处理,具体如下:
下来进⾏下载安装:
=======
def func():
   print("this is a dev branch")
>>>>>>> dev

针对合并出现如上的问题,解决的思路是:
        出现冲突
        查看冲突⽂件的内容
        怎么修改⽂件,就需要⼈为处于进去
        修改完成后,再针对⽂件进⾏add和commit的操作

Git标签

git tag可以理解为:这对每个版本加上⼀个标签。标签涉及到的命令具体可以总结为:
        git tag -a tagName -m 标签注释:创建⼀个标签,并且加上注释
        git tag #查看标签信息
        git log --decorate #查看标签的详细信息
        git log --oneline --decorate #命令如上是⼀样的
        git tag -a标签名称 commitID -m 标签注释
        git show tagName #查看标签的具体详细的信息

Gitlab

Gitlab环境搭建

代码版本的管理是持续集成⾥⾯很重要的⼀个环节,在现代企业⾥⾯,对代码的管理都是通过Gitlab来进⾏管理的。Gitlab是基于Ruby的代码来进⾏开发的。下⾯具体演示下Gitlab的安装。在Linux中安装Gitlab的依赖项,具体为:

yum install curl policycoreutils openssh-server openssh-clients
systemctl enable sshd
systemctl start sshd
yum install postfix
systemctl enable postfix
systemctl start postfix
yum install -y policycoreutils-python

针对防⽕墙的处理,具体如下: 

firewall-cmd --permanent --add-service=http 
systemctl reload firewalld

下来进⾏下载安装:

wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-
ce/packages/el/7/gitlab-ce-12.0.2-ce.0.el 7.x86_64.rpm/download.rpm
rpm -i gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm 

启动gitlab:

gitlab-ctl reconfigure
#就会启动gitlab,⾸次启动时间⽐较⻓ 

启动后,在浏览器访问,默认端⼝是80,⾸次显示的⻚⾯:

在后⾯的启动中,就没有⾸次启动那么⻓的时间了,启动的命令为:

gitlab-ctl start 

ssh-key配置

下来是配置ssh,以及本地提交代码到Gitlab,具体配置如下:

下来配置user和email,具体如下:

然后会在当前的⽬录下⽣成.ssh的⽬录,进⼊后,可以看到对应的⽂件。把id_rsa.pub的内容复制,然后加到Gitlab的密钥中,具体如下: 

点击AddKey进⾏添加,然后就会出现如下的界⾯信息:

 下来在Gitlab上创建项⽬,然后把本地的代码提交上去。

localhost:saas $ git log
commit 42ed46bce3d68c03b9c52f47742e17c6a9a9a11a (HEAD -> master)
Author: wuya <759178811@qq.com>
Date:   Wed Jun 16 15:41:35 2021 +0800
this is a test code
commit 87c9cc43f0f5dfd80baeb9db8669622f81475db8 (origin/master, origin/HEAD)
Author: wuya <759178811@qq.com>
Date: Wed Jun 16 15:36:03 2021 +0800
Initial commit
localhost:saas $ git push
Username for 'http://47.95.142.233': 759178811@qq.com
Password for 'http://759178811@qq.com@47.95.142.233':

然后就会在Gitlab的系统⾥⾯看到提交的代码,具体如下:
Gitlab之CI&CD 
基于Gitlba-ci的需要安装gitlab-ci的插件,安装的命令为:
执⾏如上命令后显示如下的信息:
枚举对象: 4, 完成.
对象计数中: 100% (4/4), 完成.
使⽤ 8 个线程进⾏压缩
压缩对象中: 100% (3/3), 完成.
写⼊对象中: 100% (3/3), 327 字节 | 327.00 KiB/s, 完成. 总共 3 (差异 0),复⽤ 0 (差异 0)
To http://47.95.142.233/wuya/saas.git 87c9cc4..42ed46b master -> master

然后就会在Gitlab的系统⾥⾯看到提交的代码,具体如下:

Gitlab之CI&CD 

基于Gitlba-ci的需要安装gitlab-ci的插件,安装的命令为:

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-
runner/script.rpm.sh | bash

安装成功后下来进⾏插件的安装,安装的命令为:

yum install gitlab-ci-multi-runner -y
#执⾏后输出的信息为:
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
runner_gitlab-ci-multi-runner/x86_64/signature
|  862 B  00:00:00
runner_gitlab-ci-multi-runner/x86_64/signature
| 1.0 kB  00:00:00 !!!
runner_gitlab-ci-multi-runner-source/signature
|  862 B  00:00:00
runner_gitlab-ci-multi-runner-source/signature
|  951 B  00:00:00 !!!
Package gitlab-ci-multi-runner-9.5.1-1.x86_64 already installed and latest version

 下来查看gitlab-ci-multi-runner是否可以正常的启动以及它的状态,具体如下:

下来进⾏gitlab-ci的注册,注册需要获取到具体的URL和TOKEN的信息,步骤为:

  • 打开项⽬
  • 在项⽬⾥⾯选择settings⾥⾯的CICD

然后选择Runners,如下所示:

下来进⾏CICD的注册的信息,具体命令为:

[root@iz2ze4dcz1c36xtn6io522z ~]# gitlab-ci-multi-runner  register
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://47.95.142.233/
Please enter the gitlab-ci token for this runner:
   9pzo1oicss-T6f7nVz_Q
Please enter the gitlab-ci description for this runner:
   [iz2ze4dcz1c36xtn6io522z]:
Please enter the gitlab-ci tags for this runner (comma separated):
   test
Whether to run untagged builds [true/false]:
[false]:
Whether to lock Runner to current project [true/false]:
[false]:
Registering runner... succeeded                     runner=9pzo1oic
Please enter the executor: docker, parallels, shell, ssh, docker+machine, docker-ssh,
virtualbox, docker-ssh+machine, kubernetes:
shell
Runner registered successfully. Feel free to start it, but if it's running already the
config should be automatically reloaded!

 注册成功后,就可以在Gitlab⾥⾯进⾏基于shell的⽅式来进⾏CICD的交互了。下⾯来看是否注册成功,具体如下:

在Gitlab的CICD中也就能看到刚才注册成功的CI的信息了,如下所示:

下来在具体的项⽬⾥⾯增加⼀个.gitlab-ci.yml的⽂件来进⾏,具体如下:

 下来在具体的项⽬⾥⾯增加⼀个.gitlab-ci.yml的⽂件来进⾏,具体如下: 

实际案例知行命令行如下

保存提交后再次到项⽬的CICD⾥⾯,就可以看到我们新增的CICD,具体如下: 

我们再次查看执⾏的结果信息,如下所示:

 基于GitLab的框架执⾏

下来我们在Gitlab⾥⾯执⾏测试框架的代码,整体代码的结构图具体如下:

我们需要在执⾏的服务器安装需要的第三⽅的库,安装好后,在.gitlab-ci.yml⽂件⾥⾯编写如下内容:

下来我们就可以看到它会在gitlab⾥⾯被执⾏,具体执⾏结果的信息如下所示:

 Running with gitlab-ci-multi-runner 9.5.1 (96b34cc)
on iz2ze4dcz1c36xtn6io522z (Td6rjStK)
Using Shell executor...
Running on iz2ze4dcz1c36xtn6io522z...
Fetching changes...
Removing tests/.pytest_cache/
Removing tests/__pycache__/test_login_token_book.cpython-37-pytest-5.4.3.pyc
Skipping Git submodules setup
$ cd tests/
$ python3 -m pytest -v test_login_token_book.py

 
Jenkins整合Gitlab 
Jenkins&Gitlab通信 
在Jenkins的系统管理中,找到Gitlab,然后配置Connection name,以及填写Gitlab服务的地址信息,具体如下:
下来需要配置认证授权的信息,也就是说从Jenkins获取Gitlab的代码,在Gitlab的Settings中,找到Access
Tokens,具体如下:
============================= test session starts ==============================
platform linux -- Python 3.7.1, pytest-5.4.3, py-1.10.0, pluggy-0.13.1 --
/usr/bin/python3
collecting ... collected 6 items
test_login_token_book.py::test_login_book[datas0] PASSED    [ 16%]
test_login_token_book.py::test_login_book[datas1] PASSED    [ 33%]
test_login_token_book.py::test_login_book[datas2] PASSED    [ 50%]
test_login_token_book.py::test_login_book[datas3] PASSED    [ 66%]
test_login_token_book.py::test_login_book[datas4] PASSED    [ 83%]
test_login_token_book.py::test_login_book[datas5] PASSED    [100%]
============================== 6 passed in 1.12s ===============================
Job succeeded

Jenkins整合Gitlab 

Jenkins&Gitlab通信

在Jenkins的系统管理中,找到Gitlab,然后配置Connection name,以及填写Gitlab服务的地址信息,具体如下:

下来需要配置认证授权的信息,也就是说从Jenkins获取Gitlab的代码,在Gitlab的Settings中,找到AccessTokens,具体如下:

 

然后选择不同的权限,来⽣成⼀个token的授权信息,拿到该信息后,在Jenkins的系统管理的GitLab的填写token的信息,然后点击添加,具体如下:

添加后的信息如下所示: 

下来点击右边的Test Connection来进⾏测试,具体测试结果如下所示:

⾃动触发构建

我们期望的⽬的是⾃动push后,进⾏智能化的构建,⽽不需要设置什么定时任务或者是⼿动触发构建,下⾯具体详细的来说这部分的应⽤。

Jenkins插件安装

在CI中安装插件Gitlab hooks,具体的插件名称为:GitLab,Gitlab Hook Plugin,Git,Git client。

Jenkins配置

在项⽬的代码管理中,把分⽀部分取消,也就是任意分⽀提交都是能够进⾏⾃动触发的,如下所示:

在Jenkins中选择要触发的项⽬,如saas的项⽬,然后点击配置,在构建触发器中选择Build when a change is pushed to GitLab,如下所示: 

然后点击⾼级,到Secret token中点击Generate,就会⾃动⽣成Secret token的信息,如下所示:

备注:需要记住的是GitLab Web Hook的URL地址信息和Secure token的信息,切记。 

WebHook配置

在Gitlab的saas⼯程中,点击Settings中的Itergrations,如下所示:

然后填写Web Hook的URL地址和Secure token的信息,如下所示:

主要填写正确的Web Hook地址和Secure token信息后,其他的都是默认的,最后点击

Add webhook添加按钮,添加成功就会显示这些信息: 

点击Push events后,就会⾃动触发远程的Jenkins项⽬执⾏

⾃动触发实战

下⾯我们到saas下编辑代码后,进⾏push,就会⾃动触发执⾏,如下所示:

持续流⽔线

配置⽅式

在⼀个产品经过技术内部评审和⽅案评审后,以及到后⾯的⽅案评审和转测阶段,交付给测试后,测试这边会进⾏多个不同阶段的验证,这个阶段具体为:
unitTest-->smoke测试-->外部API测试阶段-->API⾃动化测试-->UI⾃动化测试,设计到的⼯程具体可以展示为:

安装插件Parameterized Trigger plugin,Delivery Pipeline Plugin,Build Pipeline Plugin后,依次来设置它的顺序,设置步骤为增加构建后操作步骤⾥⾯选择“构建 其他⼯程”,选择下⼀个需要执⾏的⼯程,具体如下:

下来增加新的试图信息,也就是测试流⽔线,具体为:

然后出发执⾏初始化的项⽬,也就是UnitTest,执⾏后,它的结果信息为:

开始管道式流⽔式的执⾏,当然试图模式也可以使⽤另外⼀种⻛格,具体如下:

脚本⽅式

上⾯的⽅式都是通过配置的⽅式,我们创建流⽔线式的⼯程,然后编写Pipeline的脚本,具体如下:

pipeline{
    agent any
        stages{
            stage('unitTest')
            {
                steps{
                    script{
                        'cd /Applications/devOps/CICD/saas'
                        'python3 -m pytest -v test_login.py'
                    }
                }
            }
            stage('smokeApi'){
                steps{
                    script{
                        'cd /Applications/devOps/CICD/saas'
                        'python3 -m pytest -v test_login.py' 
                    }
                }
            }
            stage('thridApi'){
                steps{
                    script{
                        'cd /Applications/devOps/CICD/saas'
                        'python3 -m pytest -v test_login.py' 
                    }
                }
            }
            stage('apiTest'){
                steps{
                    script{
                        'cd /Applications/devOps/CICD/saas'
                        'python3 -m pytest -v test_login.py' 
                    }


                }
            }
            stage('uiTest'){
                steps{
                    script{
                        'cd /Applications/devOps/CICD/saas'
                        'python3 -m pytest -v test_login.py' 
                    }
                }
            }
        }
}

然后执⾏,⻅执⾏的过程信息:

报告&通知整合 

在测试代码执⾏后,我们需要得到测试执⾏的结果信息以及执⾏过程中,如果出现其他的问题希望能够得到回应。测试报告我们可以把Pytest与Allure整合起来,⽽通知可以和钉钉整合起来。下⾯具体说明这部分的配置以及案例应⽤实战。

Allure报告
配置应⽤

⾸先需要在Jenkins中安装Allure Jenkins Plugin的插件,安装插件成功后。在“全局⼯具配置”的Allure中,选择⾃动 安装Allure,具体如下所示:

下来在“系统配置”的Allure Report中配置它的全局变量,信息具体如下:

案例实战

下来在CI的⼯程中,在构建中需要带上配置的Allure的信息,具体执⾏的命令为:

 cd tests
python3 -m pytest -v -s  test_login_token_book.py --alluredir ${WORKSPACE}/report

在构建后操作⾥⾯选择Allure Report,在Path⾥⾯填写report的关键字,切记,项⽬的⼯程⽬录⼀定得要有report的⽂件夹信息,配置信息具体如下所示:

点击构建后,就会在⼯程的详细⾥⾯显示Allure Report的报告信息,具体如下所示:

点击Allure Report,就会显示具体的测试报告信息。

企业级的CICD

基于Docker的CICD 

⾃动化部署&验证

下⾯我们可以把⾃动构建镜像,以及⾃动启动服务,和⾃动化验证测试服务的过程,完全结合Jenkins持续集成的流⽔线,完全实现⾃动化的部署和过程。

pipeline

在Jenkins持续集成的⼯具⾥⾯创建Pipeline的项⽬,设计到的脚本具体如下:

pipeline{
    agent any
    stages{
        stage('Code Pull') {
            steps {
               git 'http://47.95.142.233/wuya/app.git'
            }
        }
       stage('Code Check') {
            steps {
                withSonarQubeEnv('SonarScanner') {
                    sh '''
                    mvn package
                    mvn clean install -Dmaven.test.skip=true 
org.sonarsource.scanner.maven:sonar-maven-plugin:3.6.1.1688:sonar
                    '''}
            }

        }
        stage('container init'){
            steps{
                sh '''cd src/main/docker
                 docker-compose down 
                 sleep 6s
                 docker rmi app:0.0.1-SNAPSHOT
                 sleep 10s
                 '''
            }
        }
        stage('build the image'){
            steps{
                sh '''
                mvn clean package  -Dmaven.test.skip=true   docker:build'''
            }
        }
        stage('run the container'){
            steps{
                sh '''cd src/main/docker
                docker-compose up -d '''
            }
        }
        stage('smoke test'){
            steps{
                sh '''cd src/main/docker
                sleep 10s
                python3 -m pytest -v test_springboot.py'''
            }
        }
    }
}

下来我们开始构建镜像,其实我们构建的过程,第⼀步主要就是打包镜像,第⼆步就是⾃动化测试的启动镜像,第三个步骤就是验证部署的服务这部分,这部分也是可以理解为⼀个冒烟测试的过程。具体构建后输出的结果信息如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/281296.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

12.26

key_it.c #include"key_it.h" void led_init() {// 设置GPIOE/GPIOF时钟使能RCC->MP_AHB4ENSETR | (0x3 << 4);// 设置PE10/PE8/PF10为输出模式GPIOE->MODER & (~(0x3 << 20));GPIOE->MODER | (0x1 << 20);GPIOE->MODER & (~…

如何在iterm2的命令行中快速移动

文章目录 一、打开Preferences设置二、进行key的映射三、修改键值四、参考文献 一、打开Preferences设置 二、进行key的映射 三、修改键值 四、参考文献 Mac下iTerm2光标按照单词快速移动设置

【回顾 展望】我的2023年度总结

2023年度关键词 学生时代终将绕不开的学习我的健身水平何时能重回巅峰&#xff1f;对生活前所未有的渴望接下来的2024是否能够微笑面对 最近发现了一个比较有意思的事&#xff0c;各大APP都在推我在这个APP的使用方面的2023年度总结&#xff0c;各个up主&#xff0c;也都在发各…

开发知识点-JAVA图形化-JavaFX

JavaFX JavaFX通用漏洞利用工具开发从无到无环境配置vscode配置JavaFX JavaFX基本程序结构创建项目新建一个包新建入口类&#xff08;主类&#xff09;新建&#xff08;FX&#xff09;label标签 创建按钮 JavaFX应用的 Stage窗口JavaFX应用的 Scene 场景类Node UI控件的通用属性…

纯CSS3制作优惠券线性UI效果

纯CSS3制作优惠券线性UI效果-遇见你与你分享

自激振荡电路笔记 电弧打火机

三极管相关 三极管的形象描述 二极管 简单求解&#xff08;理想&#xff09; 优先导通&#xff08;理想&#xff09; 恒压降 稳压管&#xff08;二极管plus&#xff09; 基础工作模块 理想稳压管的工作特性 晶体管之三极管(“两个二极管的组合” ) 电弧打火机电路 1.闭合开…

nodejs微信小程序+python+PHP的冷链物流配送系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

推荐几个开源HTTP服务接口快速生成工具

在现在流行微服务、前后端分离软件开发架构下&#xff0c;基于标准RESTful/JSON的HTTP接口已经成为主流。在实际业务中有很多需要快速开发调用数据服务接口的需求&#xff0c;但团队中缺乏专业的后端开发人员&#xff0c;比如&#xff1a; &#xff08;1&#xff09;数据库表已…

Java定时器

目录 什么是定时器&#xff1f; 如何使用定时器&#xff1f; schedule Timer的构造方法 cancel 定时器的模拟实现 思路分析 实现过程 完整代码 什么是定时器&#xff1f; 定时器&#xff1a;即在设定的时间时执行某事的设备&#xff08;例如闹钟&#xff0c;在指定的时…

python期刊稿件在线投稿系统q2ud0

本系统的用户可分为管理员、投稿者、审稿人和编辑四个用户角色组成。管理员可以管理系统内所有功能&#xff0c;主要有个人中心、投稿者管理、审稿人管理、编辑管理、个人稿件管理、审核稿件管理、稿件信息管理、类型管理等功能&#xff1b;编辑登录系统主要有个人中心、审核稿…

大模型训练过程概述

上图来自 Andrej Karpathy&#xff0c;深度学习的大拿&#xff0c;目前在Tesla。这张图的信息量相当大&#xff0c;通过该图能让我们对大模型的整个训练过程有一个总体的了解。 从该图可知大模型训练主要有4步&#xff1a; Pretraining — 预训练阶段 Supervised Finetuning&…

透过许战海矩阵洞察安记食品增长战略

引言&#xff1a;安记食品如果想实施增长战略&#xff0c;建议深耕招牌产品,走向全国市场,目前招牌产品咖哩和复合调味粉市场空间没有被全面释放出来,需要科学的产品战略作为支撑。安记食品选择功能性产品方向是正确的,但“功能性”需要一个大品类作为载体,牛奶,饮料是最大的载…

C# Onnx yolov8n forklift detection

目录 效果 模型 项目 代码 下载 C# Onnx yolov8n forklift detection 效果 模型 Model Properties ------------------------- date&#xff1a;2023-12-25T16:22:05.530078 author&#xff1a;Ultralytics task&#xff1a;detect license&#xff1a;AGPL-3.0 https:/…

牛客网SQL训练4—SQL进阶挑战

文章目录 一、增删改操作1. 插入记录2. 更新记录3. 删除记录 二、表与索引操作1. 表的创建、修改与删除2. 索引的创建、删除 三、聚合分组查询1. 聚合函数2. 分组查询 四、多表查询1. 嵌套子查询2. 合并查询3. 连接查询 五、窗口函数1. 专用窗口函数2. 聚合窗口函数 六、其他常…

分布式【4. 什么是 CAP?】

什么是 CAP&#xff1f; C 代表 Consistency&#xff0c;一致性&#xff0c;是指所有节点在同一时刻的数据是相同的&#xff0c;即更新操作执行结束并响应用户完成后&#xff0c;所有节点存储的数据会保持相同。 A 代表 Availability&#xff0c;可用性&#xff0c;是指系统提…

开源radishes高仿网易云音乐完整源码,可试听和下载“灰色”歌曲,跨平台的无版权音乐平台

源码介绍 Radishes是项目名称&#xff0c;是由萝卜翻译而来。可以在这里试听和下载“灰色”歌曲&#xff0c;是一个可以跨平台的无版权音乐平台。 萝卜音乐界面和功能参考 windows 网易云音乐界面和 ios 的网易云音乐 安装依赖 cd radishes/ yarn bootstrap 运行项目 web:…

【回溯】0-1背包Python实现

文章目录 [toc]问题描述形式化描述 回溯法时间复杂性Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;回溯法 问题描述 给定 n n n种物品和一背包&#xff0c;物品 i i i的重量是 w i w_{i} wi​&#xff0c;其价值为 v i v_{i} vi​&#xff0c;背包的容量为 c …

力扣每日一题99:恢复二叉搜索树

题目 给你二叉搜索树的根节点 root &#xff0c;该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下&#xff0c;恢复这棵树 。 示例 1&#xff1a; 输入&#xff1a;root [1,3,null,null,2] 输出&#xff1a;[3,1,null,null,2] 解释&#xff1a;3 不能是 1 …

vue保姆级教程----组件之间的参数传递

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

QT 输入框输入限制 正则表达式限制 整理

在使用 输入数值时&#xff0c;经常遇到限制其范围的需要&#xff0c;比如角太阳高度角范围为[-90,90]&#xff0c;经度值范围[-180,180]&#xff0c;方位角范围[0,360]。Qt提供了QIntValidator和QDoubleValidator可以限定数值输入范围&#xff0c;如使用QIntValidator限制整数…