什麼是 Github Actions
GitHub Actions 是 GitHub 的持續集成服務,於2018年10月推出。是一種可以替換 Travis CI 作爲 CI/CD 的解決方案。我也是近期存在一個需求,纔開始進行嘗試的,畢竟學了用是最好的學習方法。
可能存在一部分同學對持續集成服務(CI/CD)到底能做什麼不是特別的有概念,例如:你將代碼提交到 Github 倉庫,馬上將代碼打包,發佈到應用服務器上,實現快速發佈。這個過程就是持續集成服務做得事,期間涉及登錄遠程服務器、運行測試等等。如果你之前用過 Jenkins 或者 Travis CI,我相信你已經知道,它是做什麼了。
GitHub 做了一個官方市場,可以搜索到他人提交的 actions。另外,還有一個 awesome actions 的倉庫,也可以找到不少 actions。如何使用別人的 actions 我會在下面說明。
基本概念
GitHub Actions 有一些自己的術語。
(1)workflow (工作流程):持續集成一次運行的過程,就是一個 workflow。
(2)job (任務):一個 workflow 由一個或多個 jobs 構成,含義是一次持續集成的運行,可以完成多個任務。
(3)step(步驟):每個 job 由多個 step 構成,一步步完成。
(4)action (動作):每個 step 可以依次執行一個或多個命令(action)。
編寫 Action
GitHub Actions 配置文件存放在代碼倉庫的.github/workflows
目錄下,文件後綴爲 .yml
,支持創建多個文件,命名隨意,一般默認爲 main.yml
。GitHub 會根據目錄下的 actions 配置,自動觸發,無需人爲介入,如果運行過程中存在問題,會以郵件的形式通知到你。
下面看一些常用的基礎配置項:
(1)name
name
字段是 workflow 的名稱。如果省略該字段,默認爲當前 workflow 的文件名。
name: GitHub Actions Demo
(2)on
on
字段指定觸發 workflow 的條件,通常是某些事件。
on: push
上面代碼指定,push
事件觸發 workflow。
on
字段也可以是事件的數組。
on: [push, pull_request]
上面代碼指定,push
事件或pull_request
事件都可以觸發 workflow。
完整的事件列表,請查看官方文檔。除了代碼庫事件,GitHub Actions 也支持外部事件觸發,或者定時運行。
(3)on..
指定觸發事件時,可以限定分支或標籤。
on:
push:
branches:
- master
上面代碼指定,只有master
分支發生push
事件時,纔會觸發 workflow。
(4)jobs..name
workflow 文件的主體是jobs
字段,表示要執行的一項或多項任務。
jobs
字段裏面,需要寫出每一項任務的job_id
,具體名稱自定義。job_id
裏面的name
字段是任務的說明。
jobs:
my_first_job:
name: My first job
my_second_job:
name: My second job
上面代碼的jobs
字段包含兩項任務,job_id
分別是my_first_job
和my_second_job
。
(5)jobs..needs
needs
字段指定當前任務的依賴關係,即運行順序。
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]
上面代碼中,job1
必須先於job2
完成,而job3
等待job1
和job2
的完成才能運行。因此,這個 workflow 的運行順序依次爲:job1
、job2
、job3
。
(6)jobs..runs-on
runs-on
字段指定運行所需要的虛擬機環境。它是必填字段。目前可用的虛擬機如下。
ubuntu-latest
,ubuntu-18.04
或ubuntu-16.04
windows-latest
,windows-2019
或windows-2016
macOS-latest
或macOS-10.14
下面代碼指定虛擬機環境爲ubuntu-18.04
。
runs-on: ubuntu-18.04
(7)jobs..steps
steps
字段指定每個 Job 的運行步驟,可以包含一個或多個步驟。每個步驟都可以指定以下三個字段。
jobs..steps.name
:步驟名稱。jobs..steps.run
:該步驟運行的命令或者 actions。jobs..steps.env
:該步驟所需的環境變量。jobs..steps.uses
:該步驟使用的其他的 actions。
下面是一個完整的 workflow 文件的範例。
name: Greeting from Mona
on: push
jobs:
my-job:
name: My Job
runs-on: ubuntu-latest
steps:
- name: Print a greeting
env:
MY_VAR: Hi there! My name is
FIRST_NAME: Mona
MIDDLE_NAME: The
LAST_NAME: Octocat
run: |
echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.
上面代碼中,steps
字段只包括一個步驟。該步驟先注入四個環境變量,然後執行一條 Bash 命令。
uses
uses 可以引用別人已經創建的 actions,就是上文中說的 actions 市場中的 actions。
引用格式:userName/repoName@verison
with
輸入參數的 map
由操作定義。 每個輸入參數都是一個鍵/值對。 輸入參數被設置爲環境變量。 該變量的前綴爲 INPUT_
,並轉換爲大寫。
示例
定義 hello_world
操作所定義的三個輸入參數(first_name
、middle_name
和 last_name
)。 這些輸入變量將被 hello-world
操作作爲 INPUT_FIRST_NAME
、INPUT_MIDDLE_NAME
和 INPUT_LAST_NAME
環境變量使用。
jobs:
my_first_job:
steps:
- name: My first step
uses: actions/hello_world@master
with:
first_name: Mona
middle_name: The
last_name: Octocat
實戰演示
我有一個靜態博客服務,我希望每當我有新的文章提交到 Github 之後,能自動幫助我發佈到我自行購買的服務器上。博客我是通過 Nginx 方式發佈的。
main.yml
name: deploy to aliyun
on:
push:
branches:
- master # 當分支 master 有新紀錄提交的時候觸發
jobs:
build:
runs-on: ubuntu-latest
steps:
# 切換分支
- name: Checkout
uses: actions/checkout@master
# Deploy
- name: SSH Execute Commands
uses: JimCronqvist/action-[email protected]
with:
hosts: ${{ secrets.ACCESS_HOST }}
privateKey: ${{ secrets.ACCESS_TOKEN }}
command: |
cd /usr/local/nginx/html/full-stack
git pull origin master
${{ secrets.ACCESS_HOST }}
是變量的應用方式,該種方式可以避免將一些密碼、服務器地址、鑰對外暴露,ACCESS_HOST 設置通過當前 Github 項目頁面下 Settings -> Secrets
目錄下進行配置。
secrets.
在Settings -> Secrets
目錄下配置參數的時候不要加哦。