Skip to content

從 Jenkins 匯入

Walis 直接讀 Jenkins 自己的檔案。貼上 Jenkinsfile(宣告式或腳本式)或任務的 config.xml,Walis 會轉成一份任務草稿,讓你在存檔之前先看過。

匯入是預覽,不是搬遷

POST /api/jobs/import/jenkins 只做轉換與回傳,不會寫進資料庫。草稿交給任務編輯器, 按下「建立任務」才真的存在——存下去之後它就是一個普通的 Walis 任務,看不出來源。

這個區分很重要,因為轉換有些地方會失真,而警告清單就是它告訴你失真在哪的地方。

逐畫面的操作流程在使用手冊的從 Jenkins 匯入。簡單說:

  1. 建置任務 → 從 Jenkins 匯入
  2. 貼上內容,或從檔案選。名稱現在填或到編輯器再填都可以。
  3. 預覽——轉出來的步驟、參數、觸發方式與逾時,以及警告。
  4. 在編輯器中開啟——把警告指出來的地方補好,再儲存。

儲存時會一併建立匯入建議的任務專屬環境變數。機密不會憑空生出來: credentials('deploy-key') 會變成一個值留空的變數,並記下 Jenkins 的憑證識別碼當來源, 你才知道要填什麼進去。編輯器會告訴你哪幾個還是空的。

警告

嚴重度意思
提示對應到了,但語意有一點不同。看一眼就好。
需要處理對應到了,但需要你補東西——機密的值、存在的執行器、儲存庫網址。
不支援Walis 沒有對應功能。原文會留在腳本裡當註解,不會默默消失。

沒有東西會被安靜丟掉。看不懂的區塊 GroovyParser 原樣保留,轉換器把它輸出成註解—— 你拿到的是一個少了一塊的任務,不是一個假裝那一塊從來不存在的任務。

對應表

JenkinsWalis
stage('X') { steps { sh … } }一個名為 X 的「執行命令」步驟。巢狀 stage 的名稱是「父 / 子」。
parallel { stage … }、腳本式 parallel a: {…}, b: {…}彼此不相依的步驟,所以會同時執行。
post { always / success / failure / cleanup }步驟的執行條件unstableabortedregression 視為失敗時;fixed 視為成功時;changed 視為總是,並提示。
stage 的 options { retry(n) }retry(n) { … }步驟的重試次數。只包住部分步驟的 retry 會內嵌並提示。
pipeline 層的 options { timeout(…) }任務逾時,換算成分鐘。stage 層級的只提示。
options { disableConcurrentBuilds() }、freestyle 未勾「必要時同時執行」同一時間只跑一筆建置
parameters { string / text / booleanParam / choice / password }建置參數credentialsfile 型別不支援。
environment { A = 'x' }任務專屬環境變數,儲存時建立。值有參照其他變數的,改成步驟開頭的 export
environment { T = credentials('id') }withCredentials([...])機密環境變數,值留空待填。filesshUserPrivateKey 類型會提示要自己改成寫檔。
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 0expression 要人工處理。
dir('p') { … }( cd 'p' && … )
withEnv(['A=1']) { … }子 shell 裡 export
script 裡的 env.X = 'v'export X=… 並寫進 $WALIS_ENV_FILE,後面的步驟才看得到。
echosleeperrorwriteFilecatchErrordeleteDircleanWs對應的 shell 命令。
checkout scmgit url:、freestyle Git第一次 clone、之後 fetch 的步驟。需要儲存庫網址。
archiveArtifactsjunit產出檔案路徑。沒有 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 邏輯defiffortry),以及 readFilefileExistshttpRequest 這類 Groovy 層的操作。Walis 跑的是 shell,不是 Groovy——理由見下面。
  • batpowershell
  • stashunstash——用不到。Walis 一次建置裡的步驟共用工作目錄。
  • tools {}——只提示要確認執行器的 PATH
  • 共用函式庫、agent dockerfilekuberneteslock、報告外掛(cobertura、publishHTML…) 與通知步驟——通知改用 Walis 自己的通知設定

為什麼轉出來是純 shell

Jenkins 的 pipeline 是一支剛好會跑 shell 的 Groovy 程式;Walis 的任務是一段剛好由 Walis 執行的 shell。轉換器要做的就是把你從前者搬到後者,所以 script {} 會變成註解: 另一邊沒有 Groovy 直譯器可以放它們。

換來的是一段你看得完、能貼進自己終端機跑、也能丟給一台從沒聽過動作/stage/外掛的遠端執行器的腳本。 這個取捨買到什麼、又付出什麼,見任務與步驟

範例檔案

Walis 儲存庫的 docs/jenkins-samples/ 有五份檔案——宣告式、腳本式、Docker agent、matrix, 以及一份 freestyle 的 config.xml——每一份都刻意混了幾個對不上的東西, 讓你在把匯入器指向自己的檔案之前,先看清楚警告長什麼樣。測試每次都會把這五份轉一遍。

以 MIT 授權釋出。