首页 > 其他分享 >Jenkinsfile小笔记

Jenkinsfile小笔记

时间:2023-02-04 11:01:00浏览次数:47  
标签:make agent sh steps 笔记 流水线 Jenkinsfile stage

Jenkinsfile

Jenkins 流水线支持两种语法, 声明式和脚本式流水线. 两种语法都支持持续交付流水线. 两种都可以用来在web UI 或jenkinsfile中定义流水线, 不过通常认为创建一个Jenkinsfile并将其检入源代码控制仓库是最佳实践.

# 声明式流水线
pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building..'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}

# 脚本式流水线
node {
    stage('Build') {
        echo 'Building....'
    }
    stage('Test') {
        echo 'Testing....'
    }
    stage('Deploy') {
        echo 'Deploying....'
    }
}

agent是必须的, 指示jenkins为流水线分配一个执行器和工作区, 没有agent指令的话, 声明式流水线不仅无效, 也无法完成任何工作.
一个合法的声明式流水线还需要stages指令和steps指令, 指示jenkins需要执行什么操作, 在哪个阶段执行.

jenkins将一个项目的开发生命周期的多个阶段(构建, 部署, 测试)绑定在一起. jenkins有许多插件可以用于调用几乎所有常用的构建工具, 例如以下的例子用于从shell中调用make, 基于Windows的系统可以使用bat代替

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'make' 
                archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true 
            }
        }
    }
}

sh调用make命令, 只有命令返回的状态码为0时才会继续, 任何非零的返回码都将使流水线失败.

运行自动化测试是任何成功的持续交付过程的重要组成部分, 因此, jenkins有很多测试记录, 报告和可视化的工具, 由各种插件提供. 当测试失败时, jenkins可以记录这些失败以供汇报以及在web UI 中可视化
以下是一个使用Junit的例子

pipeline {
    agent any

    stages {
        stage('Test') {
            steps {
                /* `make check` 在测试失败后返回非零的退出码;
                * 使用 `true` 允许流水线继续进行
                */
                sh 'make check || true' 
                junit '**/target/*.xml' 
            }
        }
    }
}

使用内联的shell条件sh make || true确保sh步骤总是看到退出码是0, 是Junit步骤有机会捕获和处理测试报告

部署可以隐含很多步骤, 取决于项目或者组织的要求, 可能是从交付件到artifactory服务器, 或着将代码推送到生产系统的任何东西, 在实例流水线的这个阶段, 构建和测试阶段都已经成功执行.部署阶段只有在之前的阶段都成功完成之后才会进行, 否则流水线会自动退出.

pipeline {
    agent any

    stages {
        stage('Deploy') {
            when {
              expression {
                currentBuild.result == null || currentBuild.result == 'SUCCESS' 
              }
            }
            steps {
                sh 'make publish'
            }
        }
    }
}

流水线访问currentBuild.result变量确定是否有任何测试的失败, 在这种情况下, 值为UNSTABLE

使用jenkinsfile 工作

字符串插值

def username = 'Jenkins'
echo 'hello ${username}'
echo "hello Mr. ${username}"

内置变量

BUILD_ID 当前构建的ID
BUILD_NUMBER 当前构建号
BUILD_TAG 字符串 ``jenkins-${JOB_NAME}-${BUILD_NUMBER}``
BILD_URL 可以定位此次构建结果的 URL(比如 http://buildserver/jenkins/job/MyJobName/17/ )
EXECUTOR_NUMBER 用于识别执行当前构建的执行者的唯一编号(在同一台机器的所有执行者中)。这个就是你在“构建执行状态”中看到的编号,只不过编号从 0 开始,而不是 1。
JAVA_HOME 如果你的任务配置了使用特定的一个 JDK,那么这个变量就被设置为此 JDK 的 JAVA_HOME。当设置了此变量时,PATH 也将包括 JAVA_HOME 的 bin 子目录。
JENKINS_URL Jenkins 服务器的完整 URL,比如 https://example.com:port/jenkins/ (注意:只有在“系统设置”中设置了 Jenkins URL 才可用)。
JOB_NAME 本次构建的项目名称,如 “foo” 或 “foo/bar”。
NODE_NAME 运行本次构建的节点名称。对于 master 节点则为 “master”。
WORKSPACE workspace 的绝对路径。

设置环境变量

声明式流水线支持environment指令, 脚本式流水线必须使用withEnv

# 声明式
pipeline {
    agent any
    environment { 
        CC = 'clang'
    }
    stages {
        stage('Example') {
            environment { 
                DEBUG_FLAGS = '-g'
            }
            steps {
                sh 'printenv'
            }
        }
    }
}
# 脚本式
node {
    withEnv(["PATH+MAVEN=${tool 'M3'}/bin"]) {
        sh 'mvn -B verify'
    }
}

定义在最高层的pipeline的environment指令适用于流水线的所有步骤, 定义在stage中的environment指令适用于stage中的步骤

动态环境变量

pipeline {
    agent any 
    environment {
        // 使用 returnStdout
        CC = """${sh(
                returnStdout: true,
                script: 'echo "clang"'
            )}""" 
        // 使用 returnStatus
        EXIT_STATUS = """${sh(
                returnStatus: true,
                script: 'exit 1'
            )}"""
    }
    stages {
        stage('Example') {
            environment {
                DEBUG_FLAGS = '-g'
            }
            steps {
                sh 'printenv'
            }
        }
    }
}

agent 必须设置在流水线的最高级, 如何设置为agent none会失败
使用returnStdout时, 返回的字符串末尾会追加一个空格, 可以使用.trim()将其移除

处理凭据

pipeline {
    agent {
        // 此处定义 agent 的细节
    }
    environment {
        AWS_ACCESS_KEY_ID     = credentials('jenkins-aws-secret-key-id')
        AWS_SECRET_ACCESS_KEY = credentials('jenkins-aws-secret-access-key')
    }
    stages {
        stage('Example stage 1') {
            steps {
                // 
            }
        }
        stage('Example stage 2') {
            steps {
                // 
            }
        }
    }
}

带密码的用户名

environment {
    BITBUCKET_COMMON_CREDS = credentials('jenkins-bitbucket-common-creds')
}

实际设置了三个环境变量
BITBUCKET_COMMON_CREDS - 包含一个以冒号分隔的用户名和密码,格式为 username:password。
BITBUCKET_COMMON_CREDS_USR - 附加的一个仅包含用户名部分的变量。
BITBUCKET_COMMON_CREDS_PSW - 附加的一个仅包含密码部分的变量。

处理参数

pipeline {
    agent any
    parameters {
        string(name: 'Greeting', defaultValue: 'Hello', description: 'How should I greet the world?')
    }
    stages {
        stage('Example') {
            steps {
                echo "${params.Greeting} World!"
            }
        }
    }
}

处理故障

pipeline {
    agent any
    stages {
        stage('Test') {
            steps {
                sh 'make check'
            }
        }
    }
    post {
        always {
            junit '**/target/*.xml'
        }
        failure {
            mail to: [email protected], subject: 'The Pipeline failed :('
        }
    }
}

使用多个agent

pipeline {
    agent none
    stages {
        stage('Build') {
            agent any
            steps {
                checkout scm
                sh 'make'
                stash includes: '**/target/*.jar', name: 'app' 
            }
        }
        stage('Test on Linux') {
            agent { 
                label 'linux'
            }
            steps {
                unstash 'app' 
                sh 'make check'
            }
            post {
                always {
                    junit '**/target/*.xml'
                }
            }
        }
        stage('Test on Windows') {
            agent {
                label 'windows'
            }
            steps {
                unstash 'app'
                bat 'make check' 
            }
            post {
                always {
                    junit '**/target/*.xml'
                }
            }
        }
    }
}

流水线并行

stage('Build') {
    /* .. snip .. */
}

stage('Test') {
    parallel linux: {
        node('linux') {
            checkout scm
            try {
                unstash 'app'
                sh 'make check'
            }
            finally {
                junit '**/target/*.xml'
            }
        }
    },
    windows: {
        node('windows') {
            /* .. snip .. */
        }
    }
}

标签:make,agent,sh,steps,笔记,流水线,Jenkinsfile,stage
From: https://www.cnblogs.com/Chinori/p/17091080.html

相关文章

  • Android笔记--Room增删改查
    添加查询删除修改......
  • Android笔记--Jetpack Room
    JetpackRoom使用Room简化数据库操作:(基于SQLite)在使用Room之前:使用Room框架有以下几个步骤:1、实体类加@Entity注解@PrimaryKey(autoGenerate=true)是自动增长的意......
  • Paraview学习笔记(3)
    Exercise3-Time-dependentVisualization Animatingacontourvalue在这个练习中,我们将研究与时间相关的数据。我们使用的数据是通过计算机模拟珊瑚生长产生的。所......
  • Paraview学习笔记(2)
    Exercise2-ATornadosimulationImportingandpreparingthedata在这个练习中,我们将看一看模拟龙卷风中的风的结果。相关数据集包含常规3D网格(所谓的流场)上的速度......
  • 【笔记】进制转换
    代码:1.任意2~36进制数转换为10进制数intr/*转换为十进制的进制*/,i=0,ans=0;stringn;//要转的数cin>>r>>n;//1.2~10进制while(n.size()!=i){an......
  • 使用 Docker 搭建思源笔记
    安装思源笔记su-cdmkdirsy-spacechown-R1000:1000/root/sy-spacedockerrun-v/root/sy-space:/siyuan/workspace-p6806:6806-u1000:1000b3log/siyuan......
  • 数学分析笔记【7】 实数完备性
    实数完备性实数完备性由六个等价的命题阐述。它们分别是:确界原理、单调有界定理、区间套定理、有限覆盖定理、聚点定理以及柯西收敛准则。证明它们等价的方法如下图:......
  • Shader入门精要笔记 - CH10_物体表面照出周围环境
     要点1)漫反射和高光发射都是光照到物体表面,然后光反射到人眼2)环境反射是周边环境的画面照到物体表面, 然后环境的画面反射到人眼 贴图漫反射(MainTex)+ 高光......
  • Paraview学习笔记(1)
    前言Paraview是一个开源的,多平台的科学可视化工具以及数据分析程序。本教程基于Paraview5.10版本。Exercise1-CTscanofaboy在第一个练习中,我们将观察一个男孩的......
  • C++ Primer 5th 阅读笔记:前言
    机器效率和编程效率Itsfocus,andthatofitsprogrammingcommunity,haswidenedfromlookingmostlyatmachineefficiencytodevotingmoreattentiontoprogram......