gitea CI/CD actions
Table of contents
背景
- Gitea Actions是自動發布的技術核心,是仿照Github Action發展的內部CI/CD工具。有了Actions,外部的CI/CD包括Drone、Jenkins等等都不再需要了。
- Gitea在這個主題發展了很久,直到第19版(目前最新)才發展這個功能,原因不明,可能也是在觀望大家對Github Page的接受度、技術的穩定度等等因素吧,想來一般人會直覺使用git系統作為後台主軸的必要性並不是很高。
- 總體而言,公司內部倉儲管理的網誌系統的適用性及必要性考量:
- 更新頻率很快
- 多人同時協作
- 內容關乎機敏
- 不管前端、後端、服務系統,都符合當代最新的環境技術、具發展潛力
- 這些理由寫在上面似乎只是鼓舞自己克服設置過程的困難
- 因為很新、實例與細節需要發展、測試
- 會需要docker、虛擬機的觀念對很多人是個障礙
- Actions使用YAML語法。
- Actions整體的工作流程圖,可以參考dev.to這一篇。
這個示意圖來自於Pablo García Fernández(2022)@medium.com,目標是在Google Play上更新發布APP,可以先就功能與程序面有個印象,細節的設定說明如下。 |
- 此外,有關Gitea與runner的安裝設定,也可以參考AppleBoy2023
- act_runner的官網有概要、特色的簡短介紹。
- 雖然說這個課題已有許多支援與經驗,但因為太新,GPT與Claude等AI都幫不上太多忙,還是得自己爬文測試。以下就重點說明設計的理念。
docker-compose.yml
- 是使用docker還是專屬的服務來執行act_runner,雖然沒有網友討論過這題,但GPT斬釘截鐵評論:還是docker比較安全。
- docker有很多種執行方式,官網介紹的是
Dockerfile
、以下範例是參考網友的介紹使用docker-compose.yml
, - 有關docker的volumes、runner workflows的目錄,目前都還沒有找到完整的說法,也只能跟Claude討論個大概的架構:
- docker:是個虛擬機概念,看是誰、在哪裡啟用了它,冒號左邊是啟用者的目錄,冒號右邊是docker的目錄
- 範例中的docker.sock,基本上不論在虛擬、實體、是workflows環境,都是固定同一個位置。
- /app,是docker工作的地方,範例沒有預先執行什麼(安裝)程式,如果有,就會是在/app,
- 而/app定義到workspace的2個位置
- 2個環境變數,參考AppleBoy2023的說明,輸入gitea的url、以及要執行runner使用者提供的TOKEN,可以是個人、也可以是組織,以下範例是組織GiteaTeam。
- 組織不是個能存取gitea repo的單位,但組織的每個成員都可以使用這個docker,不必另外自己再設docker。
docker-compose.yml
存放與docker起始的目錄,因為docker不會存取任何檔案,這個位置不會有任何差別。此處放在repo的根目錄,就只是為了將docker-compose.yml
保存起來
git@eng06 /var/lib/gitea/runner_GiteaTeam
$ cat docker-compose.yml
version: "3"
services:
runner:
image: gitea/act_runner:0.2.6
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /workspace/GiteaTeam/VuePress:/app
- .:/app
working_dir: /app
environment:
- GITEA_INSTANCE_URL=http://eng06.sinotech-eng.com:3000/
- GITEA_RUNNER_REGISTRATION_TOKEN=***
- TODO:究竟是docker階段就把node與pnpm準備好、還是每次workflow執行安裝比較好?
- 如果不涉及插件的安裝,統一在docker執行當然比較有效率。
- docker沒有repo checkout的功能,找不到package.json,這一條還有待克服。
main.yml
- 除非另有指定,github/gitea會執行repo
.github/workflows
目錄下所有的.yml
檔案,只要收到使用者git push
指令。 runs-on
:與前述runner(docker)連結之標籤,可以在gitea的使用者(組織)設定中檢視。uses
:從marketplace拉取imagerun
:實際執行安裝、編譯及複製等等程序- 有關
lockfile
的問題:可能是checkout後所有權的問題、或版本的差異,pnpm install
時遭遇到困難,GPT建議加一個--no-frozen-lockfile
設定。
- 有關
- 要在docker與實體間存取檔案或什麼修改,需使用
ssh
、scp
、sftp
等等這類的指令。- 登入實體機的密鑰:建議寫在gitea/github設定裏,而不是寫在
yml
檔案,因後者通常是會公開。 - 因為
scp
內設會嚴格檢查沒有登入過的主機,這會造成屏蔽,需要關閉這項功能。ssh
似乎沒有這麼嚴格。 - docker是否可以執行
mount
指令,還需要測試。
- 登入實體機的密鑰:建議寫在gitea/github設定裏,而不是寫在
sshpass
這支程式是自行下載安裝、還是拉取marketlace的image?- 後者的功能似乎集中在
ssh
,所謂的with script
指得是登入遠端主機(實體機)後執行的指令,而不是在虛擬機命令列中執行sshpass
。 - 自行安裝也遭遇找不到套件的問題,需要
apt-get update
- 後者的功能似乎集中在
target
目錄需要和實體apache2的設定結合(/etc/apache2/site-available/vuepress.conf
),並且將目錄檔案的權限設定成其他人可閱讀。
name: CI
on: [push]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v3
with:
node-version: '18'
- uses: pnpm/action-setup@v2
with:
version: 7
- uses: actions/checkout@v4
- name: build vuepress
run: |
cd $GITHUB_WORKSPACE
pnpm install --no-frozen-lockfile && pnpm run docs:build
- name: Copy files via scp
run: |
ls -lh ${GITHUB_WORKSPACE}/src/.vuepress/dist/*
- name: Update remote SSH configs
uses: appleboy/ssh-action@master
with:
host: $
username: $
password: $
script: |
mkdir -p ~/.ssh
cat > ~/.ssh/config << EOF
Host *
KexAlgorithms +diffie-hellman-group1-sha1
Ciphers +aes256-cbc,aes192-cbc,aes128-cbc
MACs +umac-64@openssh.com
EOF
- name: scp dist
run: |
export host=$\{\{ secrets.SERVER_HOST \}\}
export user=$\{\{ secrets.SERVER_USER \}\}
export pass=$\{\{ secrets.SERVER_PASS \}\}
export local_path='/workspace/GiteaTeam/VuePress/src/.vuepress/dist/*'
export target='/nas2/VuePressDist'
apt-get update
apt-get install -y sshpass
mkdir -p ~/.ssh
cat > ~/.ssh/config << EOF
Host *
KexAlgorithms +diffie-hellman-group1-sha1
Ciphers +aes256-cbc,aes192-cbc,aes128-cbc
MACs +umac-64@openssh.com
EOF
sshpass -p ${pass} scp -v -r -F ~/.ssh/config -o 'StrictHostKeyChecking no' ${local_path} ${user}@${host}:${target}
- 狀態
- 閒置:沒有作業正在執行
- 激活:按順序被呼叫,執行使用者的請求
- 離線:docker並未啟動,也無法再以同一個id來連線(因docker id是唯一的數字)。可以將其刪除,不會有任何影響。
- ID及名稱:是歷史上唯一的組合方案
- 類型:runner服務的範圍
- 編輯:有權人才能將其刪除。因為畫面是管理者權限,所有runner都可以刪除。
gitea面板中刪除一個runner的效果為何?
- 不會影響那個docker的運作
- 但重新整理後,docker id 再也不會出現在選單中
- 必須在後台將docker停下來,重新啟動,gitea才可能再次連結
runner token的效力為何?重新產生後,是否舊的會失效?
- token的效力似乎是永久有效,不論是範圍是全局、組織/個人、或是倉儲。不需要塗抹掉,只需要重新啟動docker,會以新的docker id被gitea連結上,以服務特定領域的請求。
- 重新產生的token,與舊token一樣,所生成的runner都可以被gitea連結。
- 如果runner config中capacity設為1,這些runners將會依序啟動,以應付組員、或不同repo編譯的請求。