CI/CD :Pipeline
pipeline
1 开发模式
瀑布模型:
敏捷开发:
DevOps
DevOps是敏捷研发中持续构建(Continuous Build,CB)、持续集成(Continuous Integration,CI)、持续交付(Continuous Delivery,CD)的自然延伸,从研发周期向右扩展到部署、运维,不仅打通研发的“需求、开发与测试”各个环节,还打通“研发”与“运维”。
2 Pipeline
Pipeline 即流水线,是 jenkins2.X 的新特性,是 jenkins 官方推荐使用的持续集成方案。使用 jenkins DSL
和 Groovy
语言编写程序,用户可以定义流水线并执行各种任务。
Pipeline 有两种语法,分别是声明式和脚本式
//声明式
pipeline {
agent any
stages {
stage('Build') {
steps {
// TODO
}
}
stage('Test') {
steps {
// TODO
}
}
stage('Deploy') {
steps {
// TODO
}
}
}
}
//脚本式
node {
stage('Build') {
// TODO
}
stage('Test') {
// TODO
}
stage('Deploy') {
// TODO
}
}
agent:指明流水线运行节点,可用参数
- any :在任何可用的机器上执行pipeline
- none :当在pipeline顶层使用none时,每个stage需要指定相应的agent
- label:在指定的机器上运行pipeline或者stage,
stage:表示这个Pipeline的某一个执行阶段
steps: 包含一个或者多个在stage块中执行的step序列
environment:指定一系列键值对,作为全局环境变量或阶段局部环境变量
options:允许在Pipeline本身内配置Pipeline专用选项
- buildDiscarder:持久化工件和控制台输出,用于最近Pipeline运行的具体数量。例如:options { buildDiscarder(logRotator(numToKeepStr: '1')) }
- disableConcurrentBuilds:不允许并行执行Pipeline。可用于防止同时访问共享资源等。例如:options { disableConcurrentBuilds() }
- skipDefaultCheckout:在agent指令中默认跳过来自源代码控制的代码。例如:options { skipDefaultCheckout() }
- skipStagesAfterUnstable:一旦构建状态进入了“不稳定”状态,就跳过阶段。例如:options { skipStagesAfterUnstable() }
- timeout:设置Pipeline运行的超时时间,之后Jenkins应该中止Pipeline。例如:options { timeout(time: 1, unit: 'HOURS') }
- retry:失败后,重试整个Pipeline指定的次数。例如:options { retry(3) }
- timestamps:预处理由Pipeline生成的所有控制台输出运行时间与发射线的时间。例如:options { timestamps() }
parameters:提供触发pipeline时的参数列表
trigger:定义了触发pipeline的方式
tools:自动安装工具
when:允许Pipeline根据给定的条件确定是否执行该阶段
- branch:当正在构建的分支与给出的分支模式匹配时执行stage,例如:
when { branch 'master' }
。请注意,这仅适用于多分支Pipeline。- environment:当指定的环境变量设置为给定值时执行stage,例如:
when { environment name: 'DEPLOY_TO', value: 'production' }
- expression:当指定的Groovy表达式求值为true时执行stage,例如:
when { expression { return params.DEBUG_BUILD } }
- not:当嵌套条件为false时执行stage。必须包含一个条件。例如:
when { not { branch 'master' } }
- allOf:当所有嵌套条件都为真时,执行stage。必须至少包含一个条件。例如:
when { allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } }
- anyOf:当至少一个嵌套条件为真时执行stage。必须至少包含一个条件。例如:
when { anyOf { branch 'master'; branch 'staging' } }
post:可以根据pipeline的状态来执行一些操作
- always:运行,无论Pipeline运行的完成状态如何。
- changed:只有当前Pipeline运行的状态与先前完成的Pipeline的状态不同时,才能运行。
- failure:仅当当前Pipeline处于“失败”状态时才运行,通常在Web UI中用红色指示表示。
- success:仅当当前Pipeline具有“成功”状态时才运行,通常在具有蓝色或绿色指示的Web UI中表示。
- unstable:只有当前Pipeline具有“不稳定”状态,通常由测试失败,代码违例等引起,才能运行。通常在具有黄色指示的Web UI中表示。
- aborted:只有当前Pipeline处于“中止”状态时,才会运行,通常是由于Pipeline被手动中止。通常在具有灰色指示的Web UI中表示。
3 搭建流水线
3.1 jenkins流水线
然后编写流水线语句
pipeline {
agent any
environment{
command = "curl"
}
stages {
stage('执行步骤1') {
steps{
echo 'the number one start'
sh "whoami"
sh "$command www.baidu.com"
}
}
stage('执行步骤2'){
steps{
echo 'the number two start'
sh "javac -version"
}
}
}
post{
success{
echo 'pipeline success'
}
}
}
3.2 GItLab流水线
在一个项目中,GitLab CI/CD 流水线通过使用名为 .gitlab-ci.yml
的 YAML 格式文件进行配置。配置参数如下:
参数 | 作用描述 |
---|---|
script | script是job所需要的唯一必须的参数。它是一个由Runner执行的shell脚本 |
image | 用于指定用于job的Docker镜像。 |
services | 用于指定服务的Docker镜像,链接到镜像中指定的基本镜像。 |
before_script | 用于定义应在所有作业(包括部署作业)之前运行但在恢复工件之后运行的命令。这可以是数组或多行字符串。 |
after_script | 用于定义将在所有作业(包括失败的作业)之后运行的命令。这必须是数组或多行字符串。 |
stages | 用于定义可由作业使用的阶段,并在全范围内定义。 |
stage | stage是按工作定义的,依赖于全局定义的阶段。它允许将作业分组到不同的阶段,并且同一阶段的作业并行执行(受特定条件限制)。 |
only | 定义作业将运行的分支(branches)和标记(tags)的名称。 |
except | 定义作业不会运行的分支和标记的名称。 |
tags | 用于从允许运行此项目的所有运行程序列表中选择特定的运行程序。 |
allow_failure | 允许作业失败而不会影响CI套件的其余部分。除手动作业外,默认值为false。 |
when | 用于实现在发生故障或尽管发生故障时运行的作业。取值:on_success,on_failure,always ,manual |
environment | 用于定义作业部署到特定环境。如果指定了环境且该名称下没有环境,则将自动创建一个新环境。 |
cache | 用于指定应在作业之间缓存的文件和目录列表。您只能使用项目工作区内的路径。 |
artifacts | 用于指定文件和目录的列表,这些文件和目录应在成功,失败或始终作业时附加到作业。作业完成后,工件将被发送到GitLab,并可在GitLab UI中下载。 |
dependencies | 此功能应与工件结合使用,并允许您定义要在不同作业之间传递的工件。 |
coverage | 允许您配置从作业输出中提取代码覆盖率的方式。 |
retry | 允许您配置在发生故障时重试作业的次数。 |
parallel | 允许您配置并行运行的作业实例数。该值必须大于或等于二(2)且小于或等于50。 |
trigger | 允许您定义下游流水线触发器。当GitLab启动从触发器定义创建的作业时,将创建下游流水线 |
include | 使用include关键字,您可以允许包含外部YAML文件。 include要求外部YAML文件具有扩展名.yml或.yaml,否则将不包括外部文件。 |
extends | 定义了使用extends的作业将继承的作业名称。 |
pages | 用于将静态内容上传到GitLab,可用于为您的网站提供服务。它具有特殊语法,因此必须满足以下两个要求:任何静态内容都必须放在public/目录下。必须定义具有public/目录路径的工件。 |
variables | GitLab CI/CD允许您在.gitlab-ci.yml中定义变量,然后在作业环境中传递。 它们可以在全局和每个作业设置。 |
编写语句:
variables: #定义变量
cmd: "curl"
before_script:
- echo test demo
- res = 'hello word'
stages: # 列出使用阶段
- build
- test
- deploy
build-job:
stage: build
script:
- echo "BUILD start"
- $cmd www.baidu.com
- echo ${res}
unit-test-job:
stage: test
script:
- echo "Test start."
- sleep 5
deploy-job:
stage: deploy
script:
- echo "Deploy start"
- javac -version
pre-job:
stage: .pre
script:
- echo ".pre start"
post-job:
stage: .post
script:
- echo ".post start"
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)