GitHub Actions 是 GitHub 的持續集成服務,於2018年10月推出。是一種能夠替換 Travis CI 做爲 CI/CD 的解決方案。我也是近期存在一個需求,纔開始進行嘗試的,畢竟學了用是最好的學習方法。html
可能存在一部分同窗對持續集成服務(CI/CD)到底能作什麼不是特別的有概念,例如:你將代碼提交到 Github 倉庫,立刻將代碼打包,發佈到應用服務器上,實現快速發佈。這個過程就是持續集成服務作得事,期間涉及登陸遠程服務器、運行測試等等。若是你以前用過 Jenkins 或者 Travis CI,我相信你已經知道,它是作什麼了。nginx
GitHub 作了一個官方市場,能夠搜索到他人提交的 actions。另外,還有一個 awesome actions 的倉庫,也能夠找到很多 actions。如何使用別人的 actions 我會在下面說明。git
GitHub Actions 有一些本身的術語。github
(1)workflow (工做流程):持續集成一次運行的過程,就是一個 workflow。ubuntu
(2)job (任務):一個 workflow 由一個或多個 jobs 構成,含義是一次持續集成的運行,能夠完成多個任務。windows
(3)step(步驟):每一個 job 由多個 step 構成,一步步完成。數組
(4)action (動做):每一個 step 能夠依次執行一個或多個命令(action)。服務器
GitHub Actions 配置文件存放在代碼倉庫的.github/workflows
目錄下,文件後綴爲 .yml
,支持建立多個文件,命名隨意,通常默認爲 main.yml
。GitHub 會根據目錄下的 actions 配置,自動觸發,無需人爲介入,若是運行過程當中存在問題,會以郵件的形式通知到你。ssh
下面看一些經常使用的基礎配置項:post
(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-ssh@0.1.1 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
目錄下配置參數的時候不要加哦。