GitHub Actions 如何將開發工作自動化?

已完成

在這裡,我們將介紹 GitHub Actions 和工作流程。 您將瞭解可以使用的動作類型,以及在哪裡尋找它們。 您也會查看這些類型的動作範例,以及它們如何融入工作流程。

GitHub 減少從概念到部署的時間

GitHub 旨在協助開發人員和 DevOps 工程師小組快速建置及部署應用程式。 GitHub 中有許多功能可提高這些效率,但通常分為兩種類別之一:

  • 溝通:想想看 GitHub 那些能讓開發人員小組輕鬆交流軟體開發專案的所有方式:程式碼檢閱的提取要求、GitHub 問題、專案版面、wiki、通知等等。
  • 自動化:GitHub Actions 讓您的小組在從整合、傳遞到部署的軟體開發程序中,能夠將每個步驟中的工作流程自動化。 您甚至可以將標籤自動新增至提取要求,並檢查過時的問題和提取要求。

這些功能結合起來,讓上千個開發小組有效減少從最初概念到部署所花費的時間。

使用工作流程自動化來減少開發時間

在本課程模組中,我們著重於自動化。 讓我們花點時間理解一下,小組如何利用自動化減少完成一般開發和部署工作流程所需花費的時間。

請考慮在撰寫完程式碼後,直到能可靠地使用該程式碼完成預定用途之前,必須執行的所有相關任務。 根據貴組織的目標,您可能需要執行下列一或多項工作:

  • 確定程式碼通過所有單元測試。
  • 執行程式碼品質和合規性檢查,以確保原始程式碼符合組織的標準。
  • 檢查程式碼及其相依性是否有已知的安全性問題。
  • 藉由整合來自 (可能) 多個參與者的新原始程式碼來建置程式代碼。
  • 確定軟體通過整合測試。
  • 指定新組建的版本。
  • 將新的二進位檔傳遞至適當的檔案系統位置。
  • 將新的二進位檔部署到一或多部伺服器。
  • 判斷這些工作是否未通過,並將問題回報給適當的個人或小組以解決問題。

挑戰就在於如何能可靠、一致且持續地執行這些工作。 此過程是流程自動化的理想任務。 如果您已經依賴 GitHub,您可能想要使用 GitHub Actions 來設定工作流程自動化。

什麼是 GitHub Actions?

GitHub Actions 是封裝的指令碼,可以將 GitHub 軟體開發工作流程中的工作自動化。 您可以設定 GitHub Actions 來觸發符合組織需求的複雜工作流程。 每次開發人員依固定時間間隔,或是手動將新的原始程式碼簽入特定分支時,就可能會觸發觸發程序。 結果就是可靠持續的自動化工作流程,大幅減少了開發時間。

哪裡可以找到 GitHub Actions?

GitHub Actions 是符合 yml 資料格式的指令碼。 每個存放庫都有一個 [動作] 索引標籤,能讓您快速輕鬆地開始設定您的第一段指令碼。 如果您發現了可能成為絕佳起點的工作流程,只要選取 [設定] 按鈕,即可新增指令碼並開始編輯來源 yml。

GitHub Actions [動作索引標籤] 的螢幕擷取畫面,顯示簡單的工作流程和設定此工作流程的按鈕。

不過,除了 GitHub Actions [動作] 索引標籤上的功能以外,您還可以:

  • GitHub Marketplace 中搜尋 GitHub Actions。 GitHub Marketplace 可讓您探索及購買能擴充工作流程的工具。
  • 搜尋開放原始碼專案。 例如,GitHub Actions 組織提供的許多熱門開放原始碼存放庫,皆包含您可使用的 GitHub Actions。
  • 從頭開始撰寫您自己的 GitHub Actions。 您可以將其設為開放原始碼,或甚至將其發佈至 GitHub Marketplace。

使用開放原始碼 GitHub Actions

許多 GitHub Actions 都是開放原始碼,可供任何人使用。 不過,就像使用任何開放原始碼軟體一樣,您需要先仔細檢查,再使用在專案中。 類似開放原始碼的軟體的建議社群標準 (例如包括讀我檔案、管理辦法、參與檔案和問題範本),您可以在使用 GitHub Actions 時,遵循下列建議:

  • 請針對輸入、輸出檢閱動作的 action.yml 檔案,並確保程式碼執行其所述功能。
  • 檢查動作是否在 GitHub Marketplace 中。 即使動作不需要在 GitHub Marketplace 上有效,這項檢查也是值得的。
  • 檢查動作在 GitHub Marketplace 中是否已經過驗證。 驗證表示 GitHub 已核准使用此動作。 不過,您仍然應該在使用前先檢閱。
  • 您可以藉由指定 Git 參考、SHA 或標籤來包含您要使用的動作版本。

GitHub 動作類型

有三種 GitHub 動作類型:容器動作、JavaScript 動作和複合動作。

使用容器動作時,動作程式碼包含環境。 這些動作只能在 GitHub 裝載的 Linux 環境中執行。 容器動作支援許多不同的語言。

JavaScript 動作的程式碼不包含環境。 您必須指定要執行這些動作的環境。 您可以在雲端或內部部署的 VM (虛擬機器) 中執行這些動作。 JavaScript 動作支援 Linux、macOS 和 Windows 環境。

複合動作可讓您在一個動作內合併多個工作流程步驟。 例如,您可以使用此功能來將多個執行命令一起組合到一個動作中,然後就會有一個使用該動作作為單一步驟來執行組合命令的工作流程。

GitHub Action 的結構分析

以下是對於存放庫執行 git 簽出的動作範例。 此動作 (actions/checkout@v1) 是工作流程步驟的一部分。 此步驟也會建置已簽出的 Node.js 程式碼。我們將在下個章節介紹工作流程、作業和步驟。

steps:
  - uses: actions/checkout@v1
  - name: npm install and build webpack
    run: |
      npm install
      npm run build

假設您想要使用容器動作來執行容器化程式碼。 動作看起來會像這樣:

name: "Hello Actions"
description: "Greet someone"
author: "octocat@github.com"

inputs:
    MY_NAME:
      description: "Who to greet"
      required: true
      default: "World"

runs:
    uses: "docker"
    image: "Dockerfile"

branding:
    icon: "mic"
    color: "purple"

請注意 inputs 區段。 在這裡,您會取得名為 MY_NAME 的變數值。 此變數會在執行此動作的工作流程中設定。

runs 區段中,請注意您是在 屬性中指定 uses。 當您設定此值時,您必須提供 Docker 映像檔的路徑。 在此情況下, Dockerfile。 我們不會在此涵蓋 Docker 的詳細數據,但如果您想要詳細資訊,請參閱 Docker 容器簡介 課程模組。

最後一節的品牌功能可將您的動作在 GitHub Marketplace 中個人化,前提是您決定將其發佈在這裡。

GitHub Actions 的中繼資料語法中,您可以找到動作中繼資料的完整清單。

什麼是 GitHub Actions 工作流程?

GitHub Actions 工作流程是為了將軟體開發生命週期工作 (包括 GitHub Actions) 自動化而在存放庫中設定的流程。 藉由工作流程,您就可以在 GitHub 上建置、測試、封裝、發行和部署任何專案。

若要建立工作流程,請在 GitHub 存放庫的 .github/workflows 目錄內,將動作加入 .yml 檔案中。

在即將推出的練習中,您的工作流程檔案 main.yml 看起來像下列範例:

name: A workflow for my Hello World file
on: push
jobs:
  build:
    name: Hello world action
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - uses: ./action-a
      with:
        MY_NAME: "Mona"

請注意,on: 屬性值是 觸發條件 ,用來指定此工作流程的執行時間。 這會在您的存放庫有推送事件時觸發執行。 您可以指定單一事件(例如 on: push)、事件陣列(例如 on: [push, pull_request]),或事件設定對應,用於排程工作流程或將工作流程的執行限制於特定檔案、標籤或分支變更。 地圖可能看起來像這樣:

on:
  # Trigger the workflow on push or pull request,
  # but only for the main branch
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
  # Also trigger on page_build, as well as release created events
  page_build:
  release:
    types: # This configuration doesn't affect the page_build event above
      - created

除非您指定類型,否則事件會對事件的所有活動類型觸發。 若想取得完整的事件清單及其活動類型,請參閱:GitHub 文件裡的可觸發工作流程的事件

工作流程至少必須有一個作業。 作業是與執行器相關聯之工作流程的一個區段。 運行器可以由 GitHub 託管或自行託管,而作業可以在電腦上運行或是在容器中運行。 您可以使用 runs-on: 屬性來指定運行程序。 在這裡,您會指示工作流程在 ubuntu-latest 上執行此作業。

每個作業都有完成的步驟。 在我們的範例中,步驟會使用動作 actions/checkout@v1 來簽出存放庫。 uses: ./action-a 值很有趣,這是您在 action.yml 檔案中建置的容器動作所屬的路徑。

此工作流程檔案的最後一個部分會設定此工作流程的 MY_NAME 變數值。 請記住容器操作調用了名為 MY_NAME 的輸入。

如需工作流程語法的詳細資訊,請參閱〈GitHub Actions 的工作流程語法〉

在工作流程中參照動作

在 GitHub Actions 中建立工作流程時,您可以參考各種來源的動作。 這些動作可用來自動化工作流程中的任務。 以下是工作流程可以參考動作的主要來源:

  1. Docker Hub 上已發佈的 Docker 容器映像
    工作流程可以參考在 Docker Hub 上發佈為 Docker 容器映像的動作。 這些動作會容器化,並包含執行動作所需的所有相依性。 若要使用這類動作,請在工作流程步驟的屬性中 uses 指定 Docker 映像檔。 例如:

    steps:
      - name: Run a Docker action
        uses: docker://<docker-image-name>:<tag>
    
  2. 任何公用儲存庫
    託管在公用儲存庫中的動作可以直接在您的工作流程中參照。 任何人都可以存取這些動作,而且可以在屬性中 uses 指定存放庫名稱和版本 (Git ref、SHA 或標籤) 來使用。 例如:

    steps:
      - name: Use a public action
        uses: actions/checkout@v3
    

[!重要]

為了提高安全性,請在引用動作時使用完全提交 SHA,而不僅僅是 @v3像 .
這可確保您的工作流程始終使用完全相同的程式碼,即使動作稍後更新或變更。
範例:uses: actions/checkout@c2c1744e079e0dd11c8e0af4a96064ca4f6a2e9e

  1. 與工作流程檔案相同的存放庫
    您可以參考儲存在與工作流程檔案相同的儲存庫中的動作。 此功能對於專案特定的自訂動作很有用。 若要參考這類動作,請使用動作目錄的相對路徑。 例如:
    steps:
      - name: Use a local action
        uses: ./path-to-action
    

如需詳細資訊,請參閱 GitHub Actions 的安全性強化指引

  1. 企業市場
    如果您的組織使用 GitHub Enterprise,您可以參考企業私人市集中的動作。 這些動作是由您的組織策劃和管理,以確保符合內部標準。 例如:
    steps:
      - name: Use an enterprise marketplace action
        uses: enterprise-org/action-name@v1
    

備註

  • 也可以參考私有儲存庫中的動作,但它們需要適當的驗證和許可權。
  • 在引用操作時,請務必指定版本(Git ref、SHA 或標籤),以確保一致性並避免意外變更。

如需詳細資訊,請參閱在 工作流程中參照動作

GitHub 裝載與自我裝載執行器

簡要說明與作業相關聯的執行器。 執行器只是一個已安裝 GitHub Actions 執行器應用程式的伺服器。 在先前的工作流程範例中,作業區塊中有一個 runs-on: ubuntu-latest 屬性,該屬性告訴工作流程,作業將使用 GitHub 裝載的執行器在 ubuntu-latest 環境中執行。

當談到執行器時,有兩個選項可供選擇:GitHub 裝載的執行器或自我裝載的執行器。 如果您使用 GitHub 裝載的執行器,則每個作業都會在虛擬環境的新執行個體中執行。 您定義的 GitHub 託管執行器類型 runs-on: {operating system-version},然後指定該環境。 使用自我裝載的執行器時,您必須套用自我裝載標籤、其作業系統和系統結構。 例如,具有 Linux作系統和 ARM32 架構的自我裝載執行器看起來會像下列規格: runs-on: [self-hosted, linux, ARM32]

每種類型的執行器都有其優點,但 GitHub 裝載的執行器可提供更快速且更簡單的方式來執行您的工作流程,儘管選項有限。 自我裝載的執行器是一種可設定性很高的方式,可在您自己的自訂本機環境中執行工作流程。 您可以在內部部署或在雲端中執行自我裝載的執行器。 您也可以使用自我裝載的執行器來建立具有更多處理能力或記憶體的自訂硬體設定。 這種類型的設定有助於執行較大的作業、在您的局域網路上安裝可用的軟體,以及選擇 GitHub 裝載的執行器未提供的作系統。

GitHub Actions 可以有使用量限制

GitHub Actions 確實有一些使用量限制,取決於您的 GitHub 方案,以及您的執行器是 GitHub 裝載還是自我裝載。 如需使用量限制的詳細資訊,請參閱 GitHub 文件中的使用量限制、計費與管理

GitHub 託管大型執行器

GitHub 為需要更多資源的工作流程提供較大的執行器。 這些執行器由 GitHub 裝載,與標準執行器相比,可提供更高的 CPU、更多的記憶體和更大的磁碟空間。 其設計目的是要有效率地處理需要大量資源的工作流程,以確保對需要工作的最佳效能。

執行器大小和標籤

較大的執行器可在多個組態中使用,提供增強的 vCPU、RAM 和 SSD 記憶體,以符合不同的工作流程需求。 這些組態適用於下列案例:

  • 編譯包含大量原始程式檔的大型程式代碼庫。
  • 執行完整的測試套件,包括整合和端對端測試。
  • 處理大型數據集以進行數據分析或機器學習工作。
  • 建置具有複雜相依性或大型二進位輸出的應用程式。
  • 執行高效能模擬或計算模型。
  • 執行視訊編碼、轉譯或其他多媒體處理工作流程。

若要使用較大的執行器,請在工作流程檔案的 屬性中 runs-on 指定所需的執行器標籤。 例如,若要使用具有 16 個 vCPU 和 64 GB RAM 的執行器,您可以設定 runs-on: ubuntu-latest-16core

jobs:
  build:
    runs-on: ubuntu-latest-16core
    steps:
      - uses: actions/checkout@v2
      - name: Build project
        run: make build

這些較大的執行器會藉由包含與標準 ubuntu-latest 執行器相同的預安裝工具,來維持與現有工作流程的相容性。

如需大型執行器的執行器大小詳細資訊,請參閱 GitHub 文件

管理大型執行器

GitHub 提供工具,可有效管理較大的執行器,以確保最佳的資源使用率和成本管理。 以下是管理大型執行器的一些關鍵層面:

監視使用量

您可以透過存放庫或組織設定中的 GitHub Actions 使用方式頁面,監視較大執行器的使用量。 此頁面提供作業執行數目、運行時間總計和相關聯成本的深入解析。

管理存取

若要控制對較大型執行器的存取,您可以設定存放庫或組織層級原則。 此設定可確保只有授權的工作流程或小組可以使用這些高資源執行器。

成本管理

大型執行器會根據其使用量產生額外費用。 若要管理成本,請考慮下列建議:

  • 只針對需要高資源的工作流程使用較大的執行器。
  • 藉由優化工作流程來減少運行時間。
  • 定期監視帳單詳細數據以追蹤費用。

擴展工作流程

如果您的工作流程需要經常使用大型執行器,請考慮調整策略,例如:

  • 使用自我裝載執行器來處理可預測的工作負載。
  • 將工作流程分割成較小的作業,以將負載分散到標準執行器。