CI/CD包含很多流程,如拉取程式碼、測試、構建打包、登入遠端伺服器、部署釋出等等。
而Github Actions是GitHub推出的一個CI/CD工具,類似工具還有TravisCI、Jenkins等
在GitHub Actions中,每個獨立的指令碼就是一個action,這些action可以複用,參考官方action市場
Github Actions 基本概念
- workflow 工作流
- on 觸發條件
- job 任務
- step 步驟
- action 動作
- 環境變數
workflow 工作流
一個工作流代表一次持續整合的過程
對於GitHub Actions,指令碼以yml檔案的方式編寫,並約定儲存在專案的.github/workflows資料夾下
一個專案可以有多個workflow
on 觸發條件
比如依賴github push 觸發指令碼執行,push指定某個/某些分支觸發,還可以指定push tag時觸發等等
job 任務
一個workflow可以包含多個任務
一個 workflow 由一個或多個 job 構成,含義是一次持續整合的執行,可以完成多個任務。
job之間可以使用need形成依賴關係
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]
如 job2必須等待job1完成,job3需要在job1,job2都完成之後才執行
step 步驟
一個job可以包含多個步驟,一步步完成
step 表示要做的步驟,前一步失敗,後面不會繼續執行。
action 動作
一個步驟可以一次執行一個或者多個命令
一個 action有name、uses、with 等配置項
name 表示 action 的名稱,uses 表示使用哪個外掛,with 表示傳給外掛的引數。
環境變數
使用者可以自定義環境變數
配置在倉庫設定裡面的 secrets 選單欄中,使用secrets.XXX 讀取XXX 本倉庫的環境變數
一個GitHub Actions demo
結合上面的概念以及註釋理解
name: Deploy GitHub Pages
# 觸發條件:在 push 到 master 分支後
on:
push:
branches:
- master
# 任務
jobs:
build-and-deploy:
# 伺服器環境:最新版 Ubuntu
runs-on: ubuntu-latest
steps:
# 拉取程式碼
- name: Checkout
uses: actions/checkout@v2
with:
persist-credentials: false
# 1、生成靜態檔案
- name: Build
run: npm install && npm run build
# 2、部署到 GitHub Pages
- name: Deploy
uses: JamesIves/github-pages-deploy-action@releases/v3
with:
ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
REPOSITORY_NAME: somenzz/somenzz.github.io
BRANCH: master
FOLDER: public
#注意這裡的 public 是倉庫根目錄下的 public,也就是 npm run build 生成靜態資源的路徑,比如有的人是 `docs/.vuepress/dist`
# 3、同步到 gitee 的倉庫
- name: Sync to Gitee
uses: wearerequired/git-mirror-action@master
env:
# 注意在 Settings->Secrets 配置 GITEE_RSA_PRIVATE_KEY
SSH_PRIVATE_KEY: ${{ secrets.GITEE_RSA_PRIVATE_KEY }}
with:
# 注意替換為你的 GitHub 源倉庫地址
source-repo: git@github.com:somenzz/somenzz.github.io.git
# 注意替換為你的 Gitee 目標倉庫地址
destination-repo: git@gitee.com:somenzz/somenzz.git
# 4、部署到 Gitee Pages
- name: Build Gitee Pages
uses: yanglbme/gitee-pages-action@main
with:
# 注意替換為你的 Gitee 使用者名稱
gitee-username: island
# 注意在 Settings->Secrets 配置 GITEE_PASSWORD
gitee-password: ${{ secrets.GITEE_PASSWORD }}
# 注意替換為你的 Gitee 倉庫,倉庫名嚴格區分大小寫,請準確填寫,否則會出錯
gitee-repo: somenzz/somenzz
# 要部署的分支,預設是 master,若是其他分支,則需要指定(指定的分支必須存在)
branch: master
# 5、部署到 xxxx.cn伺服器
- name: rsync deployments
uses: burnett01/rsync-deployments@4.1
with:
# 這裡是 rsync 的引數 switches: -avzh --delete --exclude="" --include="" --filter=""
switches: -avzh
path: public/
remote_path: /home/ubuntu/public/
remote_host: xxxx.cn
remote_port: 22
remote_user: ubuntu
remote_key: ${{ secrets.MY_UBUNTU_RSA_PRIVATE_KEY }}