Jenkinsfile

Jenkinsfile 语法
  • 字符串
def username = 'Jenkins'
echo 'Hello Mr. ${username}'
echo "I said, Hello Mr. ${username}"
  • 环境变量
# Jenkins 流水线中可访问的完整的环境变量列表记录在 ``${YOUR_JENKINS_URL}/pipeline-syntax/globals#env``
BUILD_ID: 当前构建的 ID,与 Jenkins 版本 1.597+ 中创建的构建号 BUILD_NUMBER 是完全相同的。
BUILD_NUMBER: 当前构建号,比如 “153”。
BUILD_TAG: 字符串 ``jenkins-${JOB_NAME}-${BUILD_NUMBER}``。可以放到源代码、jar 等文件中便于识别。
BUILD_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 的绝对路径。
1. ## Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}"
            } } }}
2. ## Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any    // agent 必须设置在流水线的最高级。如果设置为 agent none 会失败
    environment { 
        // 使用 returnStdout
        CC = """${sh(
                returnStdout: true,
                script: 'echo "clang"'
            )}"""  // 使用 returnStdout 时,返回的字符串末尾会追加一个空格。可以使用 .trim() 将其移除
        // 使用 returnStatus
        EXIT_STATUS = """${sh(
                returnStatus: true,
                script: 'exit 1'
            )}"""
    }
    stages {
        stage('Example') {
            environment {
                DEBUG_FLAGS = '-g'
            }
            steps {
                sh 'printenv'
            }}  }}
  • 处理凭据
  1. credentials(): 它支持 secret 文本,带密码的用户名,以及 secret 文件凭据
  2. SSH 秘钥或证书 Jenkins 的片段生成器特性
1.1 Secret 文本
environment {
        AWS_ACCESS_KEY_ID     = credentials('jenkins-aws-secret-key-id')
        AWS_SECRET_ACCESS_KEY = credentials('jenkins-aws-secret-access-key')
    }
1.2. 带密码的用户名
environment {
    BITBUCKET_COMMON_CREDS = credentials('jenkins-bitbucket-common-creds')
}
# BITBUCKET_COMMON_CREDS - 包含一个以冒号分隔的用户名和密码,格式为 username:password。
# BITBUCKET_COMMON_CREDS_USR - 附加的一个仅包含用户名部分的变量。
# BITBUCKET_COMMON_CREDS_PSW - 附加的一个仅包含密码部分的变量。
1.3 Secret 文件
# secret 文本和 secret 文件凭据之间的唯一不同是,对于 secret 文本,凭据本身直接输入到 Jenkins 中,而 secret 文件的凭据则原样保存到一个文件中,之后将传到 Jenkins
  • 处理参数
parameters {
        string(name: 'Greeting', defaultValue: 'Hello', description: 'How should I greet the world?')
    }
    stages {
        stage('Example') {
            steps {
                echo "${params.Greeting} World!"
            }
        }
    }
  • 处理故障
post {
        always {
            junit '**/target/*.xml'
        }
        failure {
            mail to: [email protected], subject: 'The Pipeline failed :('
        }
    }
  • 使用多个代理
  • 可选的步骤参数
高级脚本式流水线
  • 并行执行
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 .. */
        }
    }
}

Docker

  • 自定义执行环境
    设计流水线的目的是更方便地使用 Docker镜像作为单个 Stage或整个流水线的执行环境。
  • 容器的缓存数据
    流水线支持 向Docker中添加自定义的参数, 允许用户指定自定义的 Docker Volumes 装在, 这可以用于在流水线运行之间的 agent上缓存数据。在流水线运行期间使用 maven container 缓存 ~/.m2, 从而避免了在流水线的后续运行中重新下载依赖的需求。
pipeline {
    agent {
        docker {
            image 'maven:3-alpine'
            args '-v $HOME/.m2:/root/.m2'
        }
    }
  ....
}
  • 使用多个容器
    Docker和流水线的结合允许 Jenkinsfile 通过将 agent {} 指令和不同的阶段结合使用 multiple 技术类型。
  • 使用Dockerfile agent { dockerfile true }
  • 指定Docker标签
脚本化流水线的高级用法
  • 一个 "sidecar" 运行 MySQL, 另一个提供执行环境 , 通过使用Docker 容器链接
node {
    checkout scm
    docker.image('mysql:5').withRun('-e "MYSQL_ROOT_PASSWORD=my-secret-pw"') { c ->
        docker.image('mysql:5').inside("--link ${c.id}:db") {
            /* Wait until mysql service is up */
            sh 'while ! mysqladmin ping -hdb --silent; do sleep 1; done'
          /* Run some tests which require MySQL */
            sh 'make check'
        }
        docker.image('centos:7').inside("--link ${c.id}:db") {
            /*
             * Run some tests which require MySQL, and assume that it is
             * available on the host name `db`
             */
            sh 'make check'
        }
    }
}
  • 构建容器
node {
    checkout scm
    def dockerfile = 'Dockerfile.test'
    def customImage = docker.build("my-image:${env.BUILD_ID}", "-f ${dockerfile} ./dockerfiles") 
}
  • 使用远程 Docker 服务器
node {
    checkout scm
    docker.withServer('tcp://swarm.example.com:2376', 'swarm-certs') {
        docker.image('mysql:5').withRun('-p 3306:3306') {
            /* do things */
        }
    }
}
  • 使用自定义注册表
node {
    checkout scm
    docker.withRegistry('https://registry.example.com', 'credentials-id') {
        def customImage = docker.build("my-image:${env.BUILD_ID}")
        /* Push the container to the custom Registry */
        customImage.push()
    }
}
  • 扩展共享库
    全局共享库配置: Manage Jenkins » Configure System » Global Pipeline Libraries

  • 流水线开发工具
    Blue Ocean 编辑器,命令行流水线linter, IDE 集成

  • 流水线语法

  • 规模 Pipelines
    如何设置速度/持久性设置?
    有 3 种方式配置持久性设置:

    1. Globally, 在 "管理Jenkins" > "系统配置"下你可以选择一个全局默认 durability设置 , 标记 "流水线速度/持久性设置"。 你可以使用下面这些更具体的设置覆盖这些内容。
    2. Per pipeline job: 在作业配置的顶部, 标记 "自定义流水线速度/持久性级别" - 它会覆盖全局设置。或者, 使用 "属性" 步骤 - 该设置将会应用到该步骤执行后的下一次运行(相同的结果)。
    3. Per-branch for a multibranch project: 配置自定义分支属性策略 (在SCM下)并为自定义流水线速度/持久性级别添加属性。它会覆盖全局设置。 你还可以使用 "属性" 步骤来覆盖设置,但请记住,你可能需要再次运行该步骤来撤销该设置。

术语

  • Agent
    代理通常是一个机器或者容器, 它连接到 Jenkins 的主服务器并在主服务器的指示下执行任务。

  • Artifact
    在 Build 或 Pipeline 运行期间生成的一个不可变文件,该文件被 archived到Jenkins Master 供用户在之后进行检索。

  • Build
    Project 的单个执行结果

  • Cloud
    一个提供动态 Agent 配置和分配的系统配置, 如由 Azure VM Agents 或 Amazon EC2 插件提供的配置。

  • Core
    主要的 Jenkins 应用程序 (jenkins.war) which 提供基本的 web UI, 配置, 和 Plugins构建的基础。

  • Downstream
    一个已配置的 Pipeline 或 Project,它作为一个单独的流水线或项目执行的一部分被触发。

  • Executor
    一个工作的执行位置 ,由 Node 上的 Pipeline 或 Project 定义。一个节点可能由0或多个配置的执行器,它对应 有多少并发项目或流水线能够在此节点上执行。

  • Fingerprint
    被认为是全局唯一的一个散列,用于追踪 Artifact 或其他跨多个 Pipelines 或 Projects 的实体的使用。

  • Folder
    用于 Pipelines 和/或 Projects 的组织容器, 类似于文件系统的文件夹。

  • Item
    web UI中的一个实体, 对应于以下任一个: Folder , Pipeline , 或 Project 。

  • Job
    一个不赞成使用的一个术语, Project的同义词。

  • Label
    用于分组Agents的用户定义的文本, 通常使用类似的功能和功能。例如, 基于 Linux代理的linux或者Docker-capable代理的docker

  • Master
    中心, 协调保存配置, 加载插件,和呈现给Jenkins各种用户界面的过程。

  • Node
    一种机器,他是Jenkins环境的一部分,能够执行 Pipelines 或 Projects 。 Master 和 Agents 都被认为是节点。

  • Project
    应该执行的工作的用户配置描述 , 比如 构建一个软件, 等等。

  • Pipeline
    连续交付流水线的一个用户定义模型, 了解更请阅读本手册的 Pipeline chapter 。

  • Plugin
    Jenkins功能的扩展,由Jenkins 核心 分别提供。

  • Publisher
    完成所有已配置的发布报告, 发送通知等 Steps 之后 Build 的部分。

  • stage
    stage 是流水线的一部分, 用于定义整个流水线的概念上不同的子集, 例如: "Build", "Test", 和 "Deploy", 他们被许多插件用于可视化或呈现Jenkins流水线状态/进展。

  • Step
    一个单一的任务; 从根本上,步骤告诉Jenkins在一个 Pipeline 或 Project 中要做 what

  • Trigger
    触发一个新的 Pipeline 运行或 Build 的标准。

  • Update Center
    托管了插件和插件元数据的库,用来支持在Jenkins内部安装插件。

  • Upstream
    一个已配置 Pipeline 或 Project,它 触发一个流水线或项目作为执行的一部分。

  • Workspace
    A disposable directory 在 Node 文件系统的一次性目录, 其中工作可以通过 Pipeline 或 Project 完成。在 Build 或 Pipeline 运行完成之后, 工作区通常会保留在适当的位置。除非在Jenkins Master上设置了 特定的工作区清理策略。

你可能感兴趣的:(Jenkinsfile)