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 anystages{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 anystages{stage('Code Pull') {steps {git 'http://47.95.142.233/wuya/app.git'}}stage('Code Check') {steps {withSonarQubeEnv('SonarScanner') {sh '''mvn packagemvn 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/dockerdocker-compose down sleep 6sdocker rmi app:0.0.1-SNAPSHOTsleep 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/dockerdocker-compose up -d '''}}stage('smoke test'){steps{sh '''cd src/main/dockersleep 10spython3 -m pytest -v test_springboot.py'''}}}
}
下来我们开始构建镜像,其实我们构建的过程,第⼀步主要就是打包镜像,第⼆步就是⾃动化测试的启动镜像,第三个步骤就是验证部署的服务这部分,这部分也是可以理解为⼀个冒烟测试的过程。具体构建后输出的结果信息如下:

相关文章:
DevOps持续交付之容器化CICD流水线
DevOps持续交付 随着DevOps⼤规模化的落地和应⽤,持续集成以及持续交付已经是⼀种常态的。CI指的是持续集成,使⽤的开源⼯具是Jenkins,CD指的是持续交付和持续部署,⼀个完整的软件开发⽣命周期为: 主要流程可以具体为: 构建阶段…...
Linux/Unix/国产化操作系统常用命令(二)
目录 后CentOS时代国产化操作系统国产化操作系统有哪些常用Linux命令关于Linux的LOGO 后CentOS时代 在CentOS 8发布后,就有了一些变化和趋势,可以说是进入了"后CentOS时代"。这个时代主要表现在以下几个方面: CentOS Stream的引入…...
基于SpringBoot的智慧生活商城系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的智慧生活商城系统,java…...
Vue框架引入Axios
首先已经创建好了 Vue 框架,安装好了 node.js。 没有完成的可按照此博客搭建:搭建Vue项目 之后打开终端,使用命令。 1、命令安装 axios 和 vue-axios npm install axios --save npm install vue-axios --save2、package.json 查看版本 在 p…...
EasyExcel 通过模板 导入、导出、下载模板
EasyExcel 通过模板 导入、导出、下载模板 import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor;import javax.validation.constraints.NotBlank; import javax.validation.constraints.Pattern; import java.io.…...
SAP ABAP通过代码解锁SM12中被锁定目标<转载>(RFC: ENQUEUE_READ和 ENQUE_DELETE)
原文链接:https://blog.csdn.net/sinat_38119716/article/details/121406275 备注 RFC:ENQUEUE_READ 读取的是SM12的数据 RFC:ENQUEUE_READ2 读取的是SMENQ的数据 SM12 和 SMENQ 的数据其实是一样的,只是一个是旧的TCODE 一个是新的 解锁用的都是RFC: …...
跳跃表原理及实现
一、跳表数据结构 跳表是有序表的一种,其底层是通过链表实现的。链表的特点是插入删除效率高,但是查找节点效率很低,最坏的时间复杂度是O(N),那么跳表就是解决这一痛点而生的。 为了提高查询效率,我们可以给链表加上索…...
详解Vue3中的鼠标事件mousemove、mouseover和mouseout
本文主要介绍Vue3中的常见鼠标事件mousemove、mouseover和mouseout。 目录 一、mousemove——鼠标移动事件二、mouseover——鼠标移入事件三、mouseout——鼠标移出事件 下面是Vue 3中常用的鼠标事件mousemove、mouseover和mouseout的详解。 一、mousemove——鼠标移动事件 鼠…...
Java:socket编程
目录 1、主程序 2、socket任务类 3、jdbc任务类 4、tomcat-jdbc连接池 5、jar包依赖 1、主程序 创建2个线程池,一个用于管理socket连接,一个用来管理jdbc连接。 package socket;import java.io.IOException; import java.net.ServerSocket; import…...
哨兵1号回波数据(L0级)FDBAQ压缩算法详解
本专栏目录: 全球SAR卫星大盘点与回波数据处理专栏目录-CSDN博客 1. 全球SAR卫星回波数据压缩算法统计 各国的SAR卫星的压缩算法按照时间轴排列如下: 可以看出传统的分块BAQ压缩算法(上图粉色)仍然是主流,哨兵1号其实也有传统的BAQ压缩模式。 本文介绍哨兵1号用的FDBAQ算…...
盾构机数据可视化监控平台 | 图扑数字孪生
2002 年,中国 863 计划把盾构机列为国家关键技术,以国家力量为主导,集中力量进行盾构机专项研究。在 2008 年,中国成功研制出属于自己的国产盾构机——中国中铁一号,同时还打通了天津地铁 1500m 的隧道。此举更彻底地打破了国内盾…...
计算机网络课程设计-企业网三层架构
(单人版) 摘 要 本篇报告主要解决了为一家名为西宫的公司网络搭建问题,该网络采用企业网三层架构对完了过进行设计。首先使用以太网中继,主要使用VLAN划分的技术来划定不同部门。使用MSTP对每个组配置生成树,防止交换机…...
Docker上传镜像到Harbor
上传镜像到Harbor 给镜像打上标签 语法 docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/] docker tag eureka:v1 127.0.0.1:85/tensquare/eureka:v1推送镜像 docker push 127.0.0.12:85/tensquare/eureka:v1如果出现以下错误,是因为Docker没有把Har…...
mfc100u.dll文件丢失了要怎么解决?修复mfc100u.dll详细指南
mfc100u.dll文件丢失了要怎么解决?首先让我们扒一扒什么是 mfc100u.dll。这玩意儿是 Microsoft Visual Studio 2010 的一部分,它就像一款程序生活中不可或缺的零件,没了它,程序肯定跑不起来。想想看,没有一个重要的零件ÿ…...
【ArcGIS微课1000例】0084:甘肃积石山地震震中100km范围内历史灾害点分布图(2005-2020)
甘肃积石山地震震中100km范围内历史灾害点分布图(2005-2020)。 文章目录 一、成果预览二、实验数据三、符号化四、地图整饰一、成果预览 本实验最终效果图如下所示: 二、实验数据 以下数据可以从本专栏配套的实验数据包中0084.rar中获取。 1. 历史灾害数据。为2005-2020时…...
java SSM拖拉机售后管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
一、源码特点 java SSM拖拉机售后管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源 代码和数据库,系统主要…...
侯捷C++ 2.0 新特性
关键字 nullptr and std::nullptr_t auto 一致性初始化:Uniform Initialization 11之前,初始化方法包括:小括号、大括号、赋值号,这让人困惑。基于这个原因,给他来个统一,即,任何初始化都能够…...
计算机网络——基础知识汇总(八)
个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…...
DIA数皆智能客户体验管理CEM获伊利“健康+AI”生态创新大奖
DIA数皆智能客户体验管理CEM获伊利“健康AI”生态创新大奖 数皆智能再获殊荣! 北京,2023年12月26日 — 在全球瞩目的伊利集团“健康AI”生态创新大赛中,上海数皆智能技术有限公司大放异彩,其创新领先的“智能化客户体验管理CEM&a…...
linux 休眠唤醒中设备、总线、用户进程、内核线程调试分析流程
一、suspending consoles打印 代码位置:Kernel/power/suspend.c 函数调用流程:devices_and_enter(suspend_state_t state) --> suspend_console(); void suspend_console(void) { if (!console_suspend_enabled) 注释这一行,可以看到…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

