我就覺得奇怪,最早喬納斯推薦我這套,我就在質疑,一開始跑jenkins是跑在server端,這樣才能對機器進行操作,github跑在遠端是要怎麼進行佈版啦。
一開始也沒什麼概念,於是我突發奇想,使用ssh連線,使用sftp上傳檔案,或是使用nodejs腳本
一直到最近遇到windows open ssh不穩的問題,如果短時間遇到一個帳號同時登入,ssh就會掛掉的狀況,我只好另求出路
原本想說要使用drone來作為cicd工具,看到要透過docker啟動兩個服務,一個是server一個是runner,我對這個也沒有很了解所以看過就算了,但server我有點不太想亂裝東西,所以還是放後面吧
在多方查找之下才發現,actions有各式各樣的套件可以與不同的服務進行部署,azure, aws之類的,我想想會不會有iis的pipeline可以使用,結果是有的,但使用上好像會失敗,有興趣的大大可以自己玩一下
再來我逛到保哥的網誌,裡面有用到一個可以上傳跟下載的套件(actions/upload-artifact,actions/download-artifact),接著再看到這篇提問,裡面幾個關鍵字,needs: build,run-on: self_hosted,needs我看得懂,就是可以把任務串連起來(沒串連之前測試都是併發)那self_hosted難道是可以跑在本機上?接著我就開始研究這些關鍵字
原來有github有個服務叫github runner,可以在伺服器跑起來,這樣run-on: self_hosted就可以在之後step寫要做的動作了,這招妙啊!原來runner就是監聽器的服務啊~(drone也有)
要在伺服器把github runner跑起來,可以參考這篇教學,可以選擇伺服器的作業系統進行安裝與啟用,基本上從第一行執行到最後一行就可以完成了
這邊記錄下我遇到的兩個問題
第一行下載zip包,遇到ssltls安全問題,可以把網址複製到chrome上直接下載
最後一個./run.cmd,這行跑起來沒問題,服務也持續啟動,但問題是到時腳本跑在機器上會在github-runner資料夾下面創run.cmd資料夾,到時會有檔名衝突問題,所以當啟動完就要把檔名改掉,這超不合理的啊,我也不知對什麼會這樣,可能是我設定哪裡出問題了。
圖中我把run.cmd改成run_service.cmd了,另外成功的跑了一些程序
接著就可以開始撰寫腳本了
self-hosted runner 可以自訂命名和設定群組:
- 在 GitHub Actions 工作流程中指定特定的 runner:
- 設定 runner 時的命名和標籤:
# 基本設定命令格式 ./config.cmd --url https://github.com/{YOUR_USERNAME}/{YOUR_REPO} --token {YOUR_TOKEN} --name "MY-IIS-RUNNER" --labels prod-iis,windows,vue # 例如: ./config.cmd --url https://github.com/your-name/your-repo --token abcd1234 --name "PROD-IIS-01" --labels prod-iis,windows,vue
參數說明:
--name
: runner 的名稱--labels
: runner 的標籤,可以設定多個,用逗號分隔--work
: 指定工作目錄 (預設是 _work)--group
: 指定 runner 群組
- 如果要修改現有的 runner:
# 1. 先移除現有的 runner 設定 ./config.cmd remove # 2. 重新設定 ./config.cmd --url https://github.com/{YOUR_USERNAME}/{YOUR_REPO} --token {YOUR_TOKEN} --name "NEW-NAME" --labels new-label-1,new-label-2
- 設定多環境範例:
# 正式環境 runner ./config.cmd --name "PROD-IIS-01" --labels prod-iis,windows,vue # 測試環境 runner ./config.cmd --name "TEST-IIS-01" --labels test-iis,windows,vue # 開發環境 runner ./config.cmd --name "DEV-IIS-01" --labels dev-iis,windows,vue
然後在工作流程中可以這樣使用:
jobs: deploy-prod: runs-on: [self-hosted, prod-iis] if: github.ref == 'refs/heads/main' # ... deploy-test: runs-on: [self-hosted, test-iis] if: github.ref == 'refs/heads/develop' # ... deploy-dev: runs-on: [self-hosted, dev-iis] if: github.ref == 'refs/heads/feature/*' # ...
有機會再來試吧