• 【自动化持续集成必备基础】pipeline常用功能


    简介

    pipeline是一套运行在jenkins上的工作流框架,可以实现复杂流程的编排和可视化运行

    pipeline支持两种语法:Declarative Pipeline(声明式流水线)和Scripted Pipeline (脚本式流水线)

    本文重点介绍主流的声明式流水线

    创建流水线项目

    Jenkins中如果要使用pipeline流水线的话,必须安装pipeline插件

    创建一个流水线项目

    pipeline结构(声明式)

    基础结构

    1. pipeline {
    2. agent any
    3. stages {
    4. stage("stage") {
    5. steps {
    6. echo "hello pipeline"
    7. }
    8. }
    9. }
    10. }

    持续集成结构(部分)

    1. pipeline {
    2. agent any
    3. stages {
    4. stage('pull project code') {
    5. steps {
    6. sh 'echox pull project code'
    7. }
    8. }
    9. stage('mvn package') {
    10. steps {
    11. sh 'echo mvn package'
    12. }
    13. }
    14. stage('build and push image') {
    15. steps {
    16. sh 'echo build and push image'
    17. }
    18. }
    19. stage('deploy to k8s') {
    20. steps {
    21. sh 'echo deploy to k8s'
    22. }
    23. }
    24. stage('pull autotest code') {
    25. steps {
    26. sh 'echo pull autotest code'
    27. }
    28. }
    29. stage('run autotest') {
    30. steps {
    31. sh 'echo run autotest'
    32. }
    33. }
    34. stage('allure report') {
    35. steps {
    36. sh 'echo allure report'
    37. }
    38. }
    39. }
    40. }

    pipeline结构解析:pipeline

    声明式流水线根节点,也是声明式流水线的开始

    pipeline {}
    
    

    pipeline结构解析:agent

    agent指定流水线运行在哪个环境之中,有如下选项: 

    any:在任何环境中执行流水线

    1. pipeline {
    2. agent any
    3. }

    none:表示没有全局的agent配置,每个stage需要指定自己的agent

    1. pipeline {
    2. agent none
    3. stages {
    4. stage('allure report'){
    5. agent any
    6. }
    7. }
    8. }


    node:指定在某个标签的节点上运行

    1. pipeline {
    2. agent none
    3. stages {
    4. stage('allure report'){
    5. agent { label 'allureReport-slave-label' }
    6. }
    7. }
    8. }

    Dockerfile:通过dockerfile创建镜像并运行容器,在这个容器中运行,用的不多

    docker:在docker中运行


    k8s:运行在某一个k8s集群中,可以实现动态slave,示例:https://www.cnblogs.com/uncleyong/p/16721826.html

    pipeline结构解析:stages、stage

    stages:所有阶段的集合

    stage:某一个阶段,stage的名称要唯一

    pipeline结构解析:steps

    steps:某个阶段要运行的具体步骤,包含一个或多个步骤

    示例:

    1. pipeline {
    2. agent any
    3. stages {
    4. stage('pull project code') {
    5. steps {
    6. sh """
    7. echo "pull project code"
    8. pwd
    9. """
    10. }
    11. }
    12. }
    13. }

    pipeline结构解析:post

    可以定义在pipeline或stage中,根据运行状态来匹配做一些操作,主要状态:

    1. always:无论状态如何,都会运行该post中的指令
    2. success:只有成功时才运行
    3. failure:只有失败才运行
    4. aborted:只有取消运行时才运行
    5. unstable:只有运行不稳定时才运行

    post和stages平级

    示例:

    1. pipeline {
    2. agent any
    3. stages {
    4. stage('pull project code') {
    5. steps {
    6. sh 'echox pull project code'
    7. }
    8. }
    9. stage('mvn package') {
    10. steps {
    11. sh 'echo mvn package'
    12. }
    13. }
    14. stage('build and push image') {
    15. steps {
    16. sh 'echo build and push image'
    17. }
    18. }
    19. stage('deploy to k8s') {
    20. steps {
    21. sh 'echo deploy to k8s'
    22. }
    23. }
    24. stage('pull autotest code') {
    25. steps {
    26. sh 'echo pull autotest code'
    27. }
    28. }
    29. stage('run autotest') {
    30. steps {
    31. sh 'echo run autotest'
    32. }
    33. }
    34. stage('allure report') {
    35. steps {
    36. sh 'echo allure report'
    37. }
    38. }
    39. }
    40. post {
    41. always {
    42. echo "发送邮件"
    43. }
    44. }
    45. }

    虽然前面都失败了,但是最后post是运行了的

     

    post也可以和steps平级,参考stage("allure report"):https://www.cnblogs.com/uncleyong/p/16721826.html

    pipeline结构解析:environment

    设置流水线的环境变量,可以定义在pipeline中作为全局变量,也可以配置在stage中作为该stage的环境变量。

    示例:

    1. pipeline {
    2. agent any
    3. environment {
    4. HARBOR_ADDRESS = "192.168.117.160"
    5. IMAGE_NAME = "gift"
    6. NAMESPACE = "gift"
    7. }
    8. stages {
    9. stage('pull project code') {
    10. steps {
    11. sh """
    12. echo "${HARBOR_ADDRESS}"
    13. echo "${IMAGE_NAME}"
    14. echo "${NAMESPACE}"
    15. """
    16. }
    17. }
    18. }
    19. }

    结果

    pipeline结构解析:options

    jenkins流水线支持很多内置指令,可以写在pipeline顶层,也可以写在stage中

    常用指令:

    1. retry:流水线失败后重试次数,options { retry(2) }
    2. timeout:设置流水线的超时时间,超时后job会自动终止,options{ timeout(time: 10, unit: 'SECONDS') }
    3. timestamps:jenkins控制台输出时间戳,options { timestamps() }

    示例:

    1. pipeline {
    2. agent any
    3. environment {
    4. HARBOR_ADDRESS = "192.168.117.160"
    5. IMAGE_NAME = "gift"
    6. NAMESPACE = "gift"
    7. }
    8. stages {
    9. stage('pull project code') {
    10. options {
    11. timeout(time: 10, unit: 'SECONDS')
    12. timestamps()
    13. }
    14. steps {
    15. sh """
    16. echo "${HARBOR_ADDRESS}"
    17. sleep 11
    18. echo "${IMAGE_NAME}"
    19. echo "${NAMESPACE}"
    20. """
    21. }
    22. }
    23. }
    24. }

    结果

    pipeline结构解析:parameters

    参数化构建,常用参数类型:

    1. string:字符串类型的参数
    2. text:文本型参数,用于定义多行文本内容的变量
    3. booleanParam:布尔型参数
    4. choice:选择型参数

    示例

    1. pipeline {
    2. agent any
    3. environment {
    4. HARBOR_ADDRESS = "192.168.117.160"
    5. IMAGE_NAME = "gift"
    6. NAMESPACE = "gift"
    7. }
    8. parameters {
    9. string(name: 'StringName', defaultValue: 'jack', description: 'string')
    10. text(name: 'TextName', defaultValue: '', description: 'text')
    11. booleanParam(name: 'booleanParamName', defaultValue: true, description: 'booleanParam')
    12. choice(name: 'ChoiceName', choices: ['test', 'dev', 'product'], description: 'choice')
    13. }
    14. stages {
    15. stage('pull project code') {
    16. options {
    17. timestamps()
    18. }
    19. steps {
    20. sh """
    21. echo "${params.StringName}"
    22. echo "${params.TextName}"
    23. echo "${params.booleanParamName}"
    24. echo "${params.ChoiceName}"
    25. """
    26. }
    27. }
    28. }
    29. }

    构建一次后,才会出现下面的按钮

    默认值

    修改默认值

    结果

    pipeline结构解析:when

    when允许pipeline根据给定的条件确定是否执行该stage,when必须至少包含一个条件

    常用的内置条件:

    1. environment:当指定的环境变量和给定的变量匹配时执行这个stage
    2. equals:当期望值和实际值相同时执行这个stage
    3. expression:当指定的表达式为True时执行这个stage
    4. not:当嵌套条件出现错误时执行这个stage
    5. allOf:当所有的嵌套条件都为True时执行这个stage
    6. anyOf:当至少有一个嵌套条件为True时执行这个stage
    environment
    1. pipeline {
    2. agent any
    3. environment {
    4. RunTag = "v1"
    5. }
    6. stages {
    7. stage('pull project code') {
    8. steps {
    9. sh 'echo pull project code'
    10. }
    11. }
    12. stage('mvn package') {
    13. steps {
    14. sh 'echo mvn package'
    15. }
    16. }
    17. stage('build and push image') {
    18. steps {
    19. sh 'echo build and push image'
    20. }
    21. }
    22. stage('deploy to k8s') {
    23. steps {
    24. sh 'echo deploy to k8s'
    25. }
    26. }
    27. stage('pull autotest code') {
    28. when {
    29. environment name: 'RunTag', value: 'v2'
    30. }
    31. steps {
    32. sh 'echo pull autotest code'
    33. }
    34. }
    35. stage('run autotest') {
    36. steps {
    37. sh 'echo run autotest'
    38. }
    39. }
    40. stage('allure report') {
    41. steps {
    42. sh 'echo allure report'
    43. }
    44. }
    45. }
    46. }

    修改,RunTag = "v2",则下面pull autotest code会执行  

    expression

    参考:https://www.cnblogs.com/uncleyong/p/16721826.html

    pipeline结构解析:parallel

    在声明式流水线中可以使用parallel字段实现并行构建

    示例

    1. pipeline {
    2. agent any
    3. stages {
    4. stage('s1') {
    5. steps {
    6. sh 'echo s1'
    7. }
    8. }
    9. stage('s2') {
    10. parallel {
    11. stage('parallel-1'){
    12. steps{
    13. echo "parallel-1"
    14. }
    15. }
    16. stage('parallel-2'){
    17. steps{
    18. echo "parallel-2"
    19. }
    20. }
    21. }
    22. }
    23. stage('s3') {
    24. steps {
    25. sh 'echo s3'
    26. }
    27. }
    28. }
    29. }

    结果:

    修改脚本,让其中一个并行操作失败

    1. pipeline {
    2. agent any
    3. stages {
    4. stage('s1') {
    5. steps {
    6. sh 'echo s1'
    7. }
    8. }
    9. stage('s2') {
    10. parallel {
    11. stage('parallel-1'){
    12. steps{
    13. echo "parallel-1"
    14. }
    15. }
    16. stage('parallel-2'){
    17. steps{
    18. echox "parallel-2"
    19. }
    20. }
    21. }
    22. }
    23. stage('s3') {
    24. steps {
    25. sh 'echo s3'
    26. }
    27. }
    28. }
    29. }

    结果:

    其中一个并行操作失败,其它并行操作不受影响,但是并行操作所属stage后面的stage会失败

    由于两个并行操作很快,为了验证其它并行操作不受影响,我们在正确的并行操作中加个休眠,这样保证失败的并行操作先执行

    1. pipeline {
    2. agent any
    3. stages {
    4. stage('s1') {
    5. steps {
    6. sh 'echo s1'
    7. }
    8. }
    9. stage('s2') {
    10. parallel {
    11. stage('parallel-1'){
    12. steps{
    13. sleep 10
    14. echo "parallel-1"
    15. }
    16. }
    17. stage('parallel-2'){
    18. steps{
    19. echox "parallel-2"
    20. }
    21. }
    22. }
    23. }
    24. stage('s3') {
    25. steps {
    26. sh 'echo s3'
    27. }
    28. }
    29. }
    30. }

    可以看到,失败的并行操作先执行完了

    最后结果:

    之所以会是上面的结果(其中一个并行操作出问题,其它并行操作不受影响,但是后面非并行的stage会失败),是因为failFast默认为false

    我们将failFast的值改为true,此时,其它并行操作就会是aborted状态(中止,取消运行)

    1. pipeline {
    2. agent any
    3. stages {
    4. stage('s1') {
    5. steps {
    6. sh 'echo s1'
    7. }
    8. }
    9. stage('s2') {
    10. failFast true
    11. parallel {
    12. stage('parallel-1'){
    13. steps{
    14. sleep 10
    15. echo "parallel-1"
    16. }
    17. }
    18. stage('parallel-2'){
    19. steps{
    20. echox "parallel-2"
    21. }
    22. }
    23. }
    24. }
    25. stage('s3') {
    26. steps {
    27. sh 'echo s3'
    28. }
    29. }
    30. }
    31. }

    结果:

    再添加一个并行操作

    1. pipeline {
    2. agent any
    3. stages {
    4. stage('s1') {
    5. steps {
    6. sh 'echo s1'
    7. }
    8. }
    9. stage('s2') {
    10. failFast true
    11. parallel {
    12. stage('parallel-1'){
    13. steps{
    14. sleep 10
    15. echo "parallel-1"
    16. }
    17. }
    18. stage('parallel-2'){
    19. steps{
    20. echox "parallel-2"
    21. }
    22. }
    23. stage('parallel-3'){
    24. steps{
    25. echo "parallel-3"
    26. }
    27. }
    28. }
    29. }
    30. stage('s3') {
    31. steps {
    32. sh 'echo s3'
    33. }
    34. }
    35. }
    36. }

    结果:下面并行任务3仍然执行了,是因为执行太快导致的

     

    流水线语法生成器:工具生成

    jenkins为我们提供了一个流水线步骤自动生成器,打开创建的pipeline任务,点击流水线语法

    使用下面两个菜单帮我们生成部分脚本

    片段生成器:各种插件的pipeline脚本生成

    Declarative Directive Generator:声明式指令生成器

    示例1(插件):git

    结果:

    git branch: 'test', changelog: false, credentialsId: 'qzcsbj_gitlab', poll: false, url: 'git@192.168.117.180:qzcsbj/gift.git'
    
    

    branch默认为master,changelog和poll默认为true

    示例2(指令):环境变量

    结果:

    1. environment {
    2. HARBOR_ADDRESS = "192.168.117.160"
    3. IMAGE_NAME = "gift"
    4. NAMESPACE = "gift"
    5. }

    ★★★★★【推荐】企业级自动化持续集成:pipeline综合应用

    可以整合python、java等自动化框架

    git + gitlab + jenkins + pipeline + maven + harbor + docker + k8s

    详见:https://www.cnblogs.com/uncleyong/p/16721826.html

    【热门测试技术,自学提升推荐】项目实战(自动化、性能)、简历、笔试面试、职业规划

    https://www.cnblogs.com/uncleyong/p/15777706.html

    【bak】

    原文会持续更新,原文地址:https://www.cnblogs.com/uncleyong/p/16705620.html

  • 相关阅读:
    UNIX环境高级编程 学习笔记 第二十一章 与网络打印机通信
    内蒙古海天公司企业网的规划与设计
    电气专业发展到头了?
    3GPP-LTE Band6标准定义频点和信道(V17.3.0 (2022-09)
    【CKS】考试之 sysdig
    迈向100倍加速:全栈Transformer推理优化
    .NET静态代码织入——肉夹馍(Rougamo) 发布1.2.0
    数据结构与算法训练:第二十七、二十八弹
    如何评价GPT-4o?
    jenkins关联github
  • 原文地址:https://blog.csdn.net/weixin_44896406/article/details/128059575