透過 GitHub Actions 實現程式碼的自動編譯和釋出

Undefined443發表於2024-08-14

GitHub Actions 是一個非常強大的工具,可以用來實現各種自動化任務,包括自動編譯和釋出 release。以下是一個基本的工作流程,展示如何使用 GitHub Actions 實現這一目標:

  1. 建立 GitHub Actions 工作流檔案:在你的 GitHub 倉庫中,建立一個 .github/workflows 目錄,並在該目錄中建立一個新的工作流檔案,例如 release.yml

  2. 定義工作流:在 release.yml 檔案中,定義你的工作流步驟。以下是一個示例工作流,它演示瞭如何在每次推送到 main 分支時進行編譯並建立一個新的 release。

name: Build and Release

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Node.js
        uses: actions/setup-node@v2
        with:
          node-version: "14"

      - name: Install dependencies
        run: npm install

      - name: Build project
        run: npm run build

      - name: Archive production artifacts
        uses: actions/upload-artifact@v4
        with:
          name: build-artifacts
          path: build/

  release:
    needs: build
    runs-on: ubuntu-latest

    steps:
      - name: Download build artifacts
        uses: actions/download-artifact@v4
        with:
          name: build-artifacts

      - name: Create GitHub Release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: v1.0.0
          release_name: Release v1.0.0
          body: |
            Release notes for v1.0.0
          draft: false
          prerelease: false

      - name: Upload Release Asset
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: build/
          asset_name: build-artifacts.zip
          asset_content_type: application/zip

解釋

  1. 工作流名稱和觸發器

    • name: Build and Release:定義工作流的名稱。
    • on 條件定義了工作流何時被觸發,這裡是每當推送到 main 分支時觸發。
  2. 構建作業

    • runs-on: ubuntu-latest:指定工作流程執行的環境。
    • actions/checkout@v4:將程式碼倉庫檢出到 runner。
    • actions/setup-node@v2:設定 Node.js 環境。
    • npm install:安裝專案依賴。
    • npm run build:構建專案。
    • actions/upload-artifact@v4:將構建的工件上傳,以便在後續步驟中使用。
    • actions/upload-artifact 的實現程式碼可以在 https://github.com/actions/upload-artifact 找到。
  3. 釋出作業

    • needs: build:指定此作業依賴於名為 build 的作業。
    • actions/download-artifact@v2:下載構建工件。
    • actions/create-release@v1:在 GitHub 上建立一個新 release。GITHUB_TOKEN 用於進行身份驗證。
    • actions/upload-release-asset@v1:將構建工件作為 release 資源上傳。

注意事項

  • GITHUB_TOKEN:GitHub 提供的內建秘密,用於在 Actions 中進行身份驗證。
  • 自定義步驟:根據你的專案和需求,你可能需要調整或新增步驟。例如,編譯步驟可能會有所不同,具體取決於你使用的程式語言和構建工具。
  • 版本號:在實際使用中,你可能希望自動生成版本號而不是硬編碼版本號。

參見:GitHub Actions 文件

更多示例程式碼

# .github/workflows/github-actions-demo.yaml
# 將程式碼打包為 tar.gz 併發布

name: Auto Release  # 工作流名

run-name: Auto Release  # 執行時的工作流名

on: [push]

jobs:
  build:  # job 名可以自定義
    runs-on: ubuntu-latest  # 也可以是容器
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Package VM
        run: tar -zcvf VM.tar.gz VM

      - name: Package VPS
        run: tar -zcvf VPS.tar.gz VPS

      - name: Upload Artifact VM.tar.gz
        uses: actions/upload-artifact@v4
        with:
          name: VM.tar.gz
          path: VM.tar.gz

      - name: Upload Artifact VPS.tar.gz
        uses: actions/upload-artifact@v4
        with:
          name: VPS.tar.gz
          path: VPS.tar.gz

      - name: Extract branch name
        shell: bash
        run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
        id: extract_branch

      - name: Create Release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ steps.extract_branch.outputs.branch }}-${{ github.run_number }}
          release_name: Release for ${{ steps.extract_branch.outputs.branch }} at ${{ github.sha }}
          draft: false
          prerelease: false

      - name: Upload Release Asset 1
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./VM.tar.gz
          asset_name: VM.tar.gz
          asset_content_type: application/gzip

      - name: Upload Release Asset 2
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./VPS.tar.gz
          asset_name: VPS.tar.gz
          asset_content_type: application/gzip

# 一些可用變數
# runner.os: 執行 Action 的系統名
# job.status: job 的狀態
# github.actor: 執行的 Action
# github.event_name: 觸發 Action 的事件名
# github.ref: 當前分支名
# github.repository: 儲存庫名
# github.workspace: 儲存庫工作區

相關文章