從 Jenkins 匯入
Walis 直接讀 Jenkins 自己的檔案。貼上 Jenkinsfile(宣告式或腳本式)或任務的 config.xml,Walis 會轉成一份任務草稿,讓你在存檔之前先看過。
匯入是預覽,不是搬遷
POST /api/jobs/import/jenkins 只做轉換與回傳,不會寫進資料庫。草稿交給任務編輯器, 按下「建立任務」才真的存在——存下去之後它就是一個普通的 Walis 任務,看不出來源。
這個區分很重要,因為轉換有些地方會失真,而警告清單就是它告訴你失真在哪的地方。
逐畫面的操作流程在使用手冊的從 Jenkins 匯入。簡單說:
- 建置任務 → 從 Jenkins 匯入。
- 貼上內容,或從檔案選。名稱現在填或到編輯器再填都可以。
- 預覽——轉出來的步驟、參數、觸發方式與逾時,以及警告。
- 在編輯器中開啟——把警告指出來的地方補好,再儲存。
儲存時會一併建立匯入建議的任務專屬環境變數。機密不會憑空生出來: credentials('deploy-key') 會變成一個值留空的變數,並記下 Jenkins 的憑證識別碼當來源, 你才知道要填什麼進去。編輯器會告訴你哪幾個還是空的。
警告
| 嚴重度 | 意思 |
|---|---|
| 提示 | 對應到了,但語意有一點不同。看一眼就好。 |
| 需要處理 | 對應到了,但需要你補東西——機密的值、存在的執行器、儲存庫網址。 |
| 不支援 | Walis 沒有對應功能。原文會留在腳本裡當註解,不會默默消失。 |
沒有東西會被安靜丟掉。看不懂的區塊 GroovyParser 原樣保留,轉換器把它輸出成註解—— 你拿到的是一個少了一塊的任務,不是一個假裝那一塊從來不存在的任務。
對應表
| Jenkins | Walis |
|---|---|
stage('X') { steps { sh … } } | 一個名為 X 的「執行命令」步驟。巢狀 stage 的名稱是「父 / 子」。 |
parallel { stage … }、腳本式 parallel a: {…}, b: {…} | 彼此不相依的步驟,所以會同時執行。 |
post { always / success / failure / cleanup } | 步驟的執行條件。unstable、aborted、regression 視為失敗時;fixed 視為成功時;changed 視為總是,並提示。 |
stage 的 options { retry(n) }、retry(n) { … } | 步驟的重試次數。只包住部分步驟的 retry 會內嵌並提示。 |
pipeline 層的 options { timeout(…) } | 任務逾時,換算成分鐘。stage 層級的只提示。 |
options { disableConcurrentBuilds() }、freestyle 未勾「必要時同時執行」 | 同一時間只跑一筆建置。 |
parameters { string / text / booleanParam / choice / password } | 建置參數。credentials 與 file 型別不支援。 |
environment { A = 'x' } | 任務專屬環境變數,儲存時建立。值有參照其他變數的,改成步驟開頭的 export。 |
environment { T = credentials('id') }、withCredentials([...]) | 機密環境變數,值留空待填。file/sshUserPrivateKey 類型會提示要自己改成寫檔。 |
triggers { cron('H 2 * * *') }、@daily | 固定排程。H 用任務名稱的雜湊換成固定值——Jenkins 也是用這招散開負載。H/15 變 */15。多行只取第一條。 |
triggers { pollSCM / githubPush / gitlab } | 推送後自動建置。webhook 還是要自己設,儲存庫也要填。 |
triggers { upstream(...) }、freestyle「在其他專案建置後觸發」 | 提示你去上游任務設下游——Walis 是從另一端描述這件事的。 |
build job: 'X'、freestyle「觸發其他專案」 | 下游任務,以名稱對應。Jenkins 會等它跑完,Walis 觸發完就不管了。 |
agent { label 'x' }、node('x')、freestyle 限制節點 | 執行器名稱。沒有那個執行器就改成 local。 |
agent { docker { image; args } } | 「在容器中執行」動作,工作目錄掛進容器。 |
when { branch / environment / equals / not / anyOf / allOf } | 步驟開頭的 shell 判斷,不成立就 exit 0。expression 要人工處理。 |
dir('p') { … } | ( cd 'p' && … ) |
withEnv(['A=1']) { … } | 子 shell 裡 export。 |
script 裡的 env.X = 'v' | export X=… 並寫進 $WALIS_ENV_FILE,後面的步驟才看得到。 |
echo、sleep、error、writeFile、catchError、deleteDir/cleanWs | 對應的 shell 命令。 |
checkout scm、git url:、freestyle Git | 第一次 clone、之後 fetch 的步驟。需要儲存庫網址。 |
archiveArtifacts、junit | 產出檔案路徑。沒有 JUnit 檢視器——檔案會留著,但不會被解析。 |
matrix { axes … }、matrix 專案的軸 | 建置矩陣。一個任務只能有一組。 |
$BUILD_NUMBER、${env.JOB_NAME}、$BRANCH_NAME、$WORKSPACE | $WALIS_BUILD_NUMBER、$WALIS_JOB_NAME、$WALIS_BRANCH、$PWD。${params.X} 變 ${X}。 |
不支援
以下每一項都會列成「不支援」警告,並以註解留在腳本裡。
input(流程中間的人工核准):拆成兩個任務,第二個由人手觸發。script {}裡的 Groovy 邏輯(def、if、for、try),以及readFile、fileExists、httpRequest這類 Groovy 層的操作。Walis 跑的是 shell,不是 Groovy——理由見下面。bat/powershell。stash/unstash——用不到。Walis 一次建置裡的步驟共用工作目錄。tools {}——只提示要確認執行器的PATH。- 共用函式庫、
agent dockerfile/kubernetes、lock、報告外掛(cobertura、publishHTML…) 與通知步驟——通知改用 Walis 自己的通知設定。
為什麼轉出來是純 shell
Jenkins 的 pipeline 是一支剛好會跑 shell 的 Groovy 程式;Walis 的任務是一段剛好由 Walis 執行的 shell。轉換器要做的就是把你從前者搬到後者,所以 script {} 會變成註解: 另一邊沒有 Groovy 直譯器可以放它們。
換來的是一段你看得完、能貼進自己終端機跑、也能丟給一台從沒聽過動作/stage/外掛的遠端執行器的腳本。 這個取捨買到什麼、又付出什麼,見任務與步驟。
範例檔案
Walis 儲存庫的 docs/jenkins-samples/ 有五份檔案——宣告式、腳本式、Docker agent、matrix, 以及一份 freestyle 的 config.xml——每一份都刻意混了幾個對不上的東西, 讓你在把匯入器指向自己的檔案之前,先看清楚警告長什麼樣。測試每次都會把這五份轉一遍。