使用 GitHub Actions 自動化您的構建

先決條件

完成本指南中所有前面的章節,從 容器化 Angular 應用程式 開始。

您還必須擁有


概述

在本節中,您將使用 GitHub Actions 設定 CI/CD 管道以自動執行以下操作:

  • 在 Docker 容器中構建您的 Angular 應用程式。
  • 在一致的環境中執行測試。
  • 將生產就緒映象推送到 Docker Hub

將您的 GitHub 倉庫連線到 Docker Hub

要讓 GitHub Actions 能夠構建和推送 Docker 映象,您需要將 Docker Hub 憑據安全地儲存在新 GitHub 倉庫中。

步驟 1:生成 Docker Hub 憑據並設定 GitHub Secret

  1. Docker Hub 建立個人訪問令牌 (PAT)

    1. 轉到您的 Docker Hub 賬戶 → 賬戶設定 → 安全
    2. 生成一個具有讀/寫許可權的新訪問令牌。
    3. 將其命名為類似 docker-angular-sample 的名稱。
    4. 複製並儲存令牌 — 您將在步驟 4 中用到它。
  2. Docker Hub 中建立倉庫

    1. 轉到您的 Docker Hub 賬戶 → 建立倉庫
    2. 對於倉庫名稱,請使用描述性名稱,例如:angular-sample
    3. 建立後,複製並儲存倉庫名稱 — 您將在步驟 4 中用到它。
  3. 為您的 Angular 專案建立一個新的 GitHub 倉庫

  4. 將 Docker Hub 憑據新增為 GitHub 倉庫機密

    在您新建立的 GitHub 倉庫中

    1. 導航到:設定 → 機密和變數 → 操作 → 新建倉庫機密

    2. 新增以下機密

    名稱
    DOCKER_USERNAME您的 Docker Hub 使用者名稱
    DOCKERHUB_TOKEN您的 Docker Hub 訪問令牌(在步驟 1 中建立)
    DOCKERHUB_PROJECT_NAME您的 Docker 專案名稱(在步驟 2 中建立)

    這些秘密允許 GitHub Actions 在自動化工作流程中安全地向 Docker Hub 進行身份驗證。

  5. 將您的本地專案連線到 GitHub

    透過在專案根目錄中執行以下命令,將您的本地專案 docker-angular-sample 連結到您剛剛建立的 GitHub 倉庫

       $ git remote set-url origin https://github.com/{your-username}/{your-repository-name}.git
    
    重要

    {your-username}{your-repository} 替換為您的實際 GitHub 使用者名稱和倉庫名稱。

    要確認您的本地專案已正確連線到遠端 GitHub 倉庫,請執行

    $ git remote -v
    

    您應該看到類似於以下的輸出

    origin  https://github.com/{your-username}/{your-repository-name}.git (fetch)
    origin  https://github.com/{your-username}/{your-repository-name}.git (push)
    

    這確認您的本地倉庫已正確連結並準備好將原始碼推送到 GitHub。

  6. 將您的原始碼推送到 GitHub

    按照以下步驟將您的本地專案提交併推送到您的 GitHub 倉庫

    1. 暫存所有檔案以進行提交。

      $ git add -A
      

      此命令暫存所有更改——包括新建、修改和刪除的檔案——為提交做準備。

    2. 提交暫存的更改並附上描述性訊息。

      $ git commit -m "Initial commit"
      

      此命令建立一個提交,其中包含帶有描述性訊息的暫存更改快照。

    3. 將程式碼推送到 main 分支。

      $ git push -u origin main
      

      此命令將您的本地提交推送到遠端 GitHub 倉庫的 main 分支,並設定上游分支。

完成後,您的程式碼將在 GitHub 上可用,並且您配置的任何 GitHub Actions 工作流程都將自動執行。

注意

瞭解有關此步驟中使用的 Git 命令的更多資訊

  • Git add – 暫存更改(新建、修改、刪除)以進行提交
  • Git commit – 儲存暫存更改的快照
  • Git push – 將本地提交上傳到您的 GitHub 倉庫
  • Git remote – 檢視和管理遠端倉庫 URL

步驟 2:設定工作流程

現在,您將建立一個 GitHub Actions 工作流程,用於構建您的 Docker 映象、執行測試並將映象推送到 Docker Hub。

  1. 轉到您在 GitHub 上的倉庫,並在頂部選單中選擇Actions選項卡。

  2. 出現提示時選擇Set up a workflow yourself

    這將開啟一個內聯編輯器以建立新的工作流程檔案。預設情況下,它將儲存到:.github/workflows/main.yml

  3. 將以下工作流程配置新增到新檔案

name: CI/CD – Angular Application with Docker

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
    types: [opened, synchronize, reopened]

jobs:
  build-test-push:
    name: Build, Test, and Push Docker Image
    runs-on: ubuntu-latest

    steps:
      # 1. Checkout source code
      - name: Checkout source code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      # 2. Set up Docker Buildx
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      # 3. Cache Docker layers
      - name: Cache Docker layers
        uses: actions/cache@v4
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-buildx-

      # 4. Cache npm dependencies
      - name: Cache npm dependencies
        uses: actions/cache@v4
        with:
          path: ~/.npm
          key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-npm-

      # 5. Extract metadata
      - name: Extract metadata
        id: meta
        run: |
          echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> "$GITHUB_OUTPUT"
          echo "SHORT_SHA=${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT"

      # 6. Build dev Docker image
      - name: Build Docker image for tests
        uses: docker/build-push-action@v6
        with:
          context: .
          file: Dockerfile.dev
          tags: ${{ steps.meta.outputs.REPO_NAME }}-dev:latest
          load: true
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache,mode=max

      # 7. Run Angular tests with Jasmine
      - name: Run Angular Jasmine tests inside container
        run: |
          docker run --rm \
            --workdir /app \
            --entrypoint "" \
            ${{ steps.meta.outputs.REPO_NAME }}-dev:latest \
            sh -c "npm ci && npm run test -- --ci --runInBand"
        env:
          CI: true
          NODE_ENV: test
        timeout-minutes: 10

      # 8. Log in to Docker Hub
      - name: Log in to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      # 9. Build and push production image
      - name: Build and push production image
        uses: docker/build-push-action@v6
        with:
          context: .
          file: Dockerfile
          push: true
          platforms: linux/amd64,linux/arm64
          tags: |
            ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKERHUB_PROJECT_NAME }}:latest
            ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKERHUB_PROJECT_NAME }}:${{ steps.meta.outputs.SHORT_SHA }}
          cache-from: type=local,src=/tmp/.buildx-cache

此工作流為您的 Angular 應用程式執行以下任務

  • 在每次針對 main 分支的 pushpull request 時觸發。
  • 使用 Dockerfile.dev 構建一個開發 Docker 映象,該映象已針對測試進行了最佳化。
  • 在乾淨的容器化環境中,使用 Vitest 執行單元測試以確保一致性。
  • 如果任何測試失敗,則立即停止工作流程 — 強制執行程式碼質量。
  • 快取 Docker 構建層和 npm 依賴項,以加快 CI 執行速度。
  • 使用 GitHub 倉庫機密安全地向 Docker Hub 進行身份驗證。
  • 使用 Dockerfile 中的 prod 階段構建生產就緒映象。
  • 使用 latest 和短 SHA 標籤標記最終映象並推送到 Docker Hub,以實現可追溯性。
注意

有關 docker/build-push-action 的更多資訊,請參閱 GitHub Action README


步驟 3:執行工作流程

新增工作流程檔案後,是時候觸發並觀察 CI/CD 過程的實際運行了。

  1. 提交併推送您的工作流程檔案

    • 在 GitHub 編輯器中選擇“Commit changes...”。

    • 此推送將自動觸發 GitHub Actions 管道。

  2. 監控工作流程執行

    • 轉到您的 GitHub 倉庫中的 Actions 選項卡。
    • 點選工作流程執行以跟蹤每個步驟:構建測試和(如果成功)推送
  3. 在 Docker Hub 上驗證 Docker 映象

    • 成功完成工作流程執行後,請訪問您的 Docker Hub 倉庫
    • 您應該在您的倉庫下看到一個新映象,其中包含
      • 倉庫名稱:${your-repository-name}
      • 標籤包括
        • latest – 表示最近一次成功的構建;非常適合快速測試或部署。
        • <short-sha> – 基於提交雜湊的唯一識別符號,有助於版本跟蹤、回滾和可追溯性。
提示

要保持程式碼質量並防止意外的直接推送,請啟用分支保護規則

  • 導航到您的 GitHub 倉庫 → 設定 → 分支
  • 在分支保護規則下,點選新增規則
  • main 指定為分支名稱。
  • 啟用以下選項
    • 在合併之前需要拉取請求.
    • 在合併之前需要透過狀態檢查.

這確保只有經過測試和審查的程式碼才能合併到 main 分支中。


摘要

在本節中,您使用 GitHub Actions 為您的容器化 Angular 應用程式設定了一個完整的 CI/CD 管道。

以下是您完成的工作

  • 為您的專案建立了一個新的 GitHub 倉庫。
  • 生成了一個安全的 Docker Hub 訪問令牌並將其作為機密新增到 GitHub。
  • 定義了一個 GitHub Actions 工作流程,該工作流程
    • 在 Docker 容器中構建您的應用程式。
    • 在一致的容器化環境中執行測試。
    • 如果測試透過,則將生產就緒映象推送到 Docker Hub。
  • 透過 GitHub Actions 觸發並驗證了工作流程執行。
  • 確認您的映象已成功釋出到 Docker Hub。

透過此設定,您的 Angular 應用程式現在已準備好進行跨環境的自動化測試和部署——從而提高了信心、一致性和團隊生產力。


加深您對自動化和容器化應用程式最佳實踐的理解


後續步驟

接下來,瞭解如何在部署之前在 Kubernetes 上本地測試和除錯您的 Angular 工作負載。這有助於您確保應用程式在類似生產的環境中按預期執行,減少部署期間的意外情況。