Skip to main content

[DevOps] GitHub Actions 筆記

keywords: deploy, publish, release, github, CI, CD#

GitHub Actions#

About GitHub Actions @ Github

Github Actions 讓你可以在存放程式碼的地方自動化程式碼部署的工作流程(workflow),同時整合協作中的 pull requests 和 issues。你可以撰寫「個別的任務(individual task)」,也就是 Actions,並將這些 Actions 統整在一起變成「工作流程(workflow)」,工作流程就是在 repository 上進行設定後,可以透過自動化的方式打包(build)、測試、發佈、部署專案程式碼

透過 GitHub Actions 將可以針對 repository 執行 end-to-end 的 CI(continuous integration)和 CD(continuous deployment)。

Workflows(工作流程)#

Configuring a workflow @ Github

工作流程(Workflows)是針對 repository 進行設定,以此進行自動化的打包(build)、測試、發佈、部署專案程式碼。工作流程中至少需要包含一個工作項目(job),而工作項目中會包含一系列的步驟(step)來執行各別任務(tasks),這些個別的步驟(step)可以是執行指令或是 actions。

你需要透過 YAML 語法來設定工作流程,一個 repository 可以有一個以上的工作流程,你需要在專案根目錄中建立 .github/workflows 的資料夾,在這個資料夾中建立 .yaml 的檔案來儲存這些 workflows,一旦你成功觸發工作流程,將可以看到打包時的紀錄(build logs)、測試結果(tests results)、打包結果(artifacts)和執行工作流程時每一步驟的狀態(statuses)。

觸發 workflow#

你可以設定在什麼情況下要觸發工作流程(workflow)

  • Github 上的事件,例如有人發送 commit、發佈 issue 或建立 pull request
  • 定期的排程
  • 外部事件

你也可以設定只有當某些分支、tag、路徑被觸發時才執行工作流程。

矩陣建置(build matrix)#

透過設定矩陣建置(build matrix)可以在不同的作業系統、平台和語系環境下同時進行測試。

Checkout Action#

checkout action 是一個標準化的 action,如果你的工作流程中有下列 actions 的話,則需要先執行 checkout action:

  • 你的工作流程需要先複製出一份專案程式碼,例如針對專案進行打包、測試,或者使用 CI 時。
  • 在你的工作流程中,至少有一個 action 是定義在同一個 repository 內(而非引用自外部公開的 repository),參考 Referencing actions in your workflow

要使用標準的 checkout action 只需要在步驟中加入:

- uses: actions/checkout@v1

checkout @ Github Actions

workflow 設定檔範例#

# .github/workflows/continuous-integration-workflow.yml
name: Greet Everyone
# This workflow is triggered on pushes to the repository.
on: [push]
jobs:
build:
# Job name is Greeting
name: Greeting
# This job runs on Linux
runs-on: ubuntu-latest
steps:
# This step uses GitHub's hello-world-javascript-action: https://github.com/actions/hello-world-javascript-action
- name: Hello world
uses: actions/hello-world-javascript-action@v1
with:
who-to-greet: 'Mona the Octocat'
id: hello
# This step prints an output (time) from the previous step's action.
- name: Echo the greeting's time
run: echo 'The time was ${{ steps.hello.outputs.time }}.'
Last updated on