從Jenkins遷移到Flow
本文將講解如何在代碼化編排的場(chǎng)景下,將 Jenkins 的任務(wù)遷移到阿里云云效流水線產(chǎn)品 Flow。通過對(duì)比兩者的對(duì)應(yīng)能力,幫助你快速理解 Flow 的設(shè)計(jì),從而更容易完成遷移。
1. 快速開始
一個(gè)最簡(jiǎn)單的Jenkinsfile:
pipeline {
agent any
stages {
stage('Hello') {
steps {
sh 'echo hello'
}
}
}
}
這個(gè)例子中,使用sh解析器執(zhí)行echo hello
,因此只能在linux,unix和mac系統(tǒng)上執(zhí)行。
下面是對(duì)應(yīng)的Flow流水線定義:
stages:
echo_stage:
jobs:
echo_job:
steps:
hello:
step: Command
with:
run: echo hello
step 是 Flow 中的最小執(zhí)行單元,上述步驟指定了這個(gè) step 的類型為Command
,可以在多個(gè)操作系統(tǒng)上執(zhí)行,在不同的操作系統(tǒng)上會(huì)使用對(duì)應(yīng)的默認(rèn)解釋器來執(zhí)行命令。
進(jìn)入 Flow 流水線首頁(yè),點(diǎn)擊 新建流水線 ,選擇「YAML 化編排」方式,選擇空模板,點(diǎn)擊 創(chuàng)建 。
將上述 YAML 內(nèi)容填入流水線流程配置,點(diǎn)擊右上角 保存并運(yùn)行 。
2. 詳細(xì)的能力映射
接下來會(huì)在以下幾個(gè)方面對(duì)比 Jenkins 和 Flow:
編排能力:串并聯(lián),交互等能力,條件執(zhí)行等。
構(gòu)建環(huán)境調(diào)度:執(zhí)行命令的工作空間如何分配,可以分配到哪些執(zhí)行環(huán)境中等。
觸發(fā)方式:可以以何種方式觸發(fā)流水線。
構(gòu)建環(huán)境軟件安裝:如何在構(gòu)建環(huán)境中添加自己需要的軟件工具。
密鑰管理:包括三方密鑰的管理,比如github,gitlab,以及私密配置項(xiàng)的管理。
插件機(jī)制:了解二者在擴(kuò)展能力上的差異。
權(quán)限管理:對(duì)于系統(tǒng)管理及流水線操作的相關(guān)權(quán)限管理。
2.1 編排能力
串并聯(lián)編排
Jenkinsfile可以定義多個(gè)stage,每個(gè)stage內(nèi)包含多個(gè)step。默認(rèn)所有step都在同一個(gè)agent的同一個(gè)工作空間上執(zhí)行。不同stage中的step都是串行執(zhí)行,如果希望并行執(zhí)行stage,需要使用parallel函數(shù)。
Flow流水線的基本結(jié)構(gòu)是流水線階段(stages) ->流水線任務(wù) jobs -> 流水線步驟(steps)。其中stages之間是串行的,jobs之間默認(rèn)是并行的,也可以通過needs
關(guān)鍵字定義依賴,steps之間是串行的。
交互式能力
Jenkins中可以使用input指令來暫停構(gòu)建,并允許獲得用戶輸入。然后繼續(xù)執(zhí)行,并在后續(xù)的構(gòu)建中可以使用用戶的輸入。
Flow 沒有完全對(duì)標(biāo)的能力,但在觸發(fā)流水線時(shí),可以指定環(huán)境變量的值。
條件執(zhí)行
Jenkinsfile中可以使用when指令來決定是否執(zhí)行某一段step或者stage。
Flow中可以使用 condition 語(yǔ)法控制任務(wù)是否執(zhí)行來完成類似的功能。
Post
Jenkins中,post支持在任務(wù)執(zhí)行結(jié)束后,根據(jù)任務(wù)狀態(tài)執(zhí)行命令。
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
post {
always {
echo 'I will always say Hello again!'
}
}
}
Flow中沒有直接對(duì)標(biāo)的能力,您可以使用condition來做條件控制,但需要注意,post是在任務(wù)結(jié)束后執(zhí)行,而condition是在任務(wù)執(zhí)行前判斷是否需要執(zhí)行任務(wù)。具體請(qǐng)參考使用 condition 語(yǔ)法控制任務(wù)是否執(zhí)行。
jobs:
front_build_job:
name: 前端應(yīng)用構(gòu)建
# 根據(jù)自定義環(huán)境變量判斷是否需要執(zhí)行前端應(yīng)用構(gòu)建
condition: |
"${FRONT_APP_CHANGED}" == "true"
steps:
command_step:
name: 執(zhí)行命令
step: Command
with:
run: |
echo This is front app build job...
Matrix
Jenkinsfile提供matrix指令來生成各種維度的任務(wù)組合。
Flow 沒有提供完全對(duì)標(biāo)的matrix語(yǔ)法,但提供了更加通用的使用 template 語(yǔ)法動(dòng)態(tài)配置流水線,可以實(shí)現(xiàn)matrix可以實(shí)現(xiàn)的所有場(chǎng)景。
2.2 觸發(fā)方式
Jenkinsfile中使用triggers指定流水線的觸發(fā)方式,原生支持定時(shí)、輪詢scm、上游任務(wù)觸發(fā)三種能力,基于插件又可以實(shí)現(xiàn)靈活的scm的webhook觸發(fā)等。
Flow支持Webhook 觸發(fā)流水線、代碼源觸發(fā)、定時(shí)觸發(fā)流水線、流水線源觸發(fā)、制品源觸發(fā)。
2.3 構(gòu)建環(huán)境調(diào)度
Jenkinsfile中使用agent指令來指定當(dāng)前stage運(yùn)行在哪個(gè)agent上。agent本身是一個(gè)抽象,可以通過插件運(yùn)行在vm上或者容器里等。agent指令可以用在pipeline級(jí)別或者stage級(jí)別。
Flow通過jobs關(guān)鍵字指定運(yùn)行環(huán)境,支持運(yùn)行在北京和中國(guó)香港的Flow管理的共享構(gòu)建集群中,提供的是x86的容器環(huán)境。同時(shí)也支持通過安裝runner運(yùn)行在用戶自己的vm上,支持Linux、Windows、macOS等操作系統(tǒng)。但只能用在job級(jí)別。
2.4 構(gòu)建環(huán)境軟件安裝
Jenkinsfile 中使用 tools 指令來安裝指定軟件。
Flow 中使用步驟的形式安裝指定軟件,比如安裝Java、安裝Python等步驟。
2.5 密鑰管理
Jenkins使用credentials管理憑證,以便于scm、部署系統(tǒng)等外部系統(tǒng)進(jìn)行安全通信。credential的類型包括賬密、密鑰文件、github app等。
Flow使用服務(wù)連接管理來管理憑證,可以通過服務(wù)連接于阿里云的產(chǎn)品之間進(jìn)行安全授權(quán),同時(shí)也支持賬密、token、ssh私鑰等類型。Flow還支持通過環(huán)境變量來管理流水線或者跨流水線范圍內(nèi)的私密信息存儲(chǔ)和引用的能力。
2.6 插件機(jī)制
Jenkins 有著強(qiáng)大的擴(kuò)展能力,提供了很多的擴(kuò)展點(diǎn)。
Flow提供了自定義步驟的能力,可以開發(fā)專屬于云效企業(yè)的步驟。
3. 一個(gè)Github Java應(yīng)用測(cè)試構(gòu)建示例
假設(shè)我在 Github 上有一個(gè)私有 Java 項(xiàng)目,需要?jiǎng)?chuàng)建和 Github 之間的連接,并進(jìn)行構(gòu)建和測(cè)試。
新建 Github 服務(wù)連接授權(quán)
進(jìn)入 Flow 首頁(yè) -> 全局設(shè)置 -> 服務(wù)連接管理 -> 新建服務(wù)連接,選擇 Github;
點(diǎn)擊下一步,在服務(wù)授權(quán)/證書頁(yè)面點(diǎn)擊新建,完成 Github oauth 授權(quán)后,返回 Flow 并點(diǎn)擊創(chuàng)建。
新建 YAML 流水線:添加 sources 代碼源,并選擇上述創(chuàng)建的 Github 服務(wù)連接;添加 Java 構(gòu)建任務(wù) YAML。YAML 示例如下:
sources: github_repo: type: github name: github代碼源 endpoint: https://github.com/flow-example/spring-boot.git # 請(qǐng)?zhí)鎿Q成你的 Github 代碼倉(cāng)庫(kù)地址 branch: master triggerEvents: push certificate: type: serviceConnection serviceConnection: cq8bubonpi5wixdw # 這里的服務(wù)連接就是前面創(chuàng)建出來的服務(wù)連接ID stages: build_test: jobs: build_test: runsOn: group: public/cn-hongkong container: build-steps-public-registry.cn-beijing.cr.aliyuncs.com/build-steps/alinux3:ffdb23fd-2024-02-26-17-42-35 steps: setup: step: SetupJava with: jdkVersion: "1.8" mavenVersion: "3.9.3" test: step: Command with: run: mvn test build: step: Command with: run: mvn package -DskipTests
保存并運(yùn)行流水線,查看運(yùn)行結(jié)果。