Azure DevOps Services
Jenkins 是一种开源自动化服务器,传统上由企业在其自己的数据中心安装,并在本地进行管理。 许多提供商还提供托管的 Jenkins 托管。
或者,Azure Pipelines 是云原生持续集成管道,提供多阶段管道的管理,并生成托管在云中的代理虚拟机。
Azure Pipelines 提供完全本地选项以及Azure DevOps Server,适用于那些有合规性或安全问题的客户,这些客户需要在企业数据中心内保留代码和生成。
此外,Azure Pipelines 还支持混合云和本地模型。 Azure Pipelines 可以管理生成和发布业务流程,并启用云中和本地安装的生成代理。
本文档提供了将 Jenkins 管道配置转换为 Azure Pipelines 的指南、有关移动基于容器的生成和选择生成代理、映射环境变量以及如何处理生成管道的成功和失败的信息。
配置
你将找到一个熟悉的从 Jenkins 声明性管道到 Azure Pipelines YAML 配置的转换。 这两者在概念上相似,支持“配置即代码”,并允许将配置检查到版本控制系统中。 但是,与 Jenkins 不同,Azure Pipelines 使用行业标准 YAML 来配置生成管道。
Jenkins 和 Azure Pipelines 之间的概念及其配置方式相似。 Jenkinsfile 列出了生成过程的一个或多个 阶段 ,每个阶段都包含按顺序执行的一个或多个 步骤 。 例如,“生成”阶段可能会运行任务来安装生成时依赖项,然后执行编译步骤。 而“测试”阶段可能会针对生成阶段中生成的二进制文件调用测试工具。
例如:
Jenkinsfile
pipeline {
agent none
stages {
stage('Build') {
steps {
sh 'npm install'
sh 'npm run build'
}
}
stage('Test') {
steps {
sh 'npm test'
}
}
}
}
jenkinsfile 可以轻松地转换为 Azure Pipelines YAML 配置,其中包含对应于每个阶段的 作业 ,以及每个作业中要执行的步骤:
azure-pipelines.yml
jobs:
- job: Build
steps:
- script: npm install
- script: npm run build
- job: Test
steps:
- script: npm test
视觉对象配置
如果不将 Jenkins 声明性管道与 Jenkinsfile 配合使用,而是使用图形界面来定义生成配置,则可能更熟悉 Azure Pipelines 中的经典编辑器。
Container-Based生成
在生成管道中使用容器可以在 Docker 映像中生成和测试,该映像具有管道所需的确切依赖项(已配置)。 这样就不必包含安装更多软件或配置环境的生成步骤。 Jenkins 和 Azure Pipelines 都支持基于容器的生成。
此外,Jenkins 和 Azure Pipelines 都允许使用 -v
docker 标志将主机代理上的生成目录共享到容器卷。 这使你可以将多个生成作业链接在一起,这些作业可以使用同一源并写入到同一输出目录。 在堆栈中使用许多不同的技术时,这特别有用;你可能希望使用 .NET Core 容器生成后端,并使用 TypeScript 容器生成前端。
例如,若要在 Ubuntu 20.04 (“Focal”) 容器中运行生成,请在 Ubuntu 22.04 (“Jammy”) 容器中运行测试:
Jenkinsfile
pipeline {
agent none
stages {
stage('Build') {
agent {
docker {
image 'ubuntu:focal'
args '-v $HOME:/build -w /build'
}
}
steps {
sh 'make'
}
}
stage('Test') {
agent {
docker {
image 'ubuntu:jammy'
args '-v $HOME:/build -w /build'
}
}
steps {
sh 'make test'
}
}
}
}
Azure Pipelines 提供 容器作业 ,使你能够在容器中运行生成:
azure-pipelines.yml
resources:
containers:
- container: focal
image: ubuntu:focal
- container: jammy
image: ubuntu:jammy
jobs:
- job: build
container: focal
steps:
- script: make
- job: test
dependsOn: build
container: jammy
steps:
- script: make test
此外,Azure Pipelines 还提供一个 Docker 任务 ,可用于运行、生成或推送映像。
代理选择
Jenkins 使用 agent
选项提供生成代理选择,以确保生成管道或管道的特定阶段在特定生成代理计算机上运行。 同样,Azure Pipelines 提供了许多选项来配置生成环境的运行位置。
托管代理选择
Azure Pipelines 为 Linux、Windows 和 macOS 版本提供云托管的生成代理。 若要选择生成环境,可以使用
vmimage
关键字 (keyword) 。 例如,选择 macOS 内部版本:
pool:
vmimage: macOS-latest
此外,还可以指定 container
并指定 docker 映像,以便对生成运行方式进行精细控制。
本地代理选择
如果在本地托管生成代理,则可以基于计算机的体系结构或已安装的软件来定义生成代理的“功能”。 例如,如果已设置具有java
功能的本地生成代理,则可以使用 关键字 (keyword) 确保作业在该demands
代理上运行:
pool:
demands: java
环境变量
在 Jenkins 中,通常为整个管道定义环境变量。 例如,设置两个环境变量和 CONFIGURATION=debug
PLATFORM=x86
:
Jenkinsfile
pipeline {
environment {
CONFIGURATION = 'debug'
PLATFORM = 'x64'
}
}
同样,在 Azure Pipelines 中,可以配置在 YAML 配置中使用并在作业执行期间设置为环境变量的变量:
azure-pipelines.yml
variables:
configuration: debug
platform: x64
此外,在 Azure Pipelines 中,可以定义仅在特定作业期间设置的变量:
azure-pipelines.yml
jobs:
- job: debug build
variables:
configuration: debug
steps:
- script: ./build.sh $(configuration)
- job: release build
variables:
configuration: release
steps:
- script: ./build.sh $(configuration)
预定义变量
Jenkins 和 Azure Pipelines 都设置了 多个环境变量 ,使你能够检查持续集成系统的执行环境并与之交互。
说明 | Jenkins | Azure Pipelines |
---|---|---|
当前生成调用的唯一数字标识符。 | BUILD_NUMBER |
BUILD_BUILDNUMBER |
唯一标识符 (不一定是当前生成调用的数值) 。 | BUILD_ID |
BUILD_BUILDID |
显示生成日志的 URL。 | BUILD_URL |
这不会在 Azure Pipelines 中设置为环境变量,但可以从其他变量派生。1 |
运行当前生成的计算机的名称。 | NODE_NAME |
AGENT_NAME |
此项目或生成定义的名称。 | JOB_NAME |
RELEASE_DEFINITIONNAME |
用于标识生成的字符串;内部版本号是一个很好的唯一标识符。 | BUILD_TAG |
BUILD_BUILDNUMBER |
执行生成的主机的 URL。 | JENKINS_URL |
SYSTEM_TEAMFOUNDATIONCOLLECTIONURI |
当前正在运行的生成执行程序或生成代理的唯一标识符。 | EXECUTOR_NUMBER |
AGENT_NAME |
签出源的位置。 | WORKSPACE |
BUILD_SOURCESDIRECTORY |
对应于所生成软件版本的 Git 提交 ID。 | GIT_COMMIT |
BUILD_SOURCEVERSION |
GitHub 上 Git 存储库的路径,Azure Repos或其他存储库提供程序。 | GIT_URL |
BUILD_REPOSITORY_URI |
正在生成的 Git 分支。 | GIT_BRANCH |
BUILD_SOURCEBRANCH |
1 若要派生在 Azure Pipelines 中显示生成日志的 URL,请以此格式组合以下环境变量:
${SYSTEM_TEAMFOUNDATIONCOLLECTIONURI}/${SYSTEM_TEAMPROJECT}/_build/results?buildId=${BUILD_BUILDID}
成功和失败处理
Jenkins 允许使用 post
管道的 部分在生成完成后运行命令。 可以使用第) success
节指定生成成功时运行的命令 (生成失败 (使用 failure
节) ,或者始终使用 always
节) (。 例如:
Jenkinsfile
post {
always {
echo "The build has finished"
}
success {
echo "The build succeeded"
}
failure {
echo "The build failed"
}
}
同样,Azure Pipelines 具有丰富的条件执行框架,允许基于许多条件(包括管道成功或失败)运行作业或作业的步骤。
若要模拟 Jenkins post
生成条件,可以定义基于 always()
、 succeeded()
或 failed()
条件运行的作业:
azure-pipelines.yml
jobs:
- job: always
steps:
- script: echo "The build has finished"
condition: always()
- job: success
steps:
- script: echo "The build succeeded"
condition: succeeded()
- job: failed
steps:
- script: echo "The build failed"
condition: failed()
此外,还可以结合 其他条件(例如,基于单个任务的成功或失败运行任务、环境变量或执行环境)来构建丰富的执行管道。