GitHub Actions

GitHub Actions は GitHub に組み込まれた自動化プラットフォームで、コードリポジトリ内で自動化フローを直接定義・実行できます。外部の CI/CD ツールは不要です。

一般的な用途としては、コードプッシュ後の自動テスト実行、PR マージ後のサーバーへの自動デプロイ、定期的なデータ取得スクリプトの実行などがあります。

GitHub Actions は公開リポジトリであれば完全無料、プライベートリポジトリには毎月 2,000 分の無料枠があります。


中核となる概念

設定ファイルを書き始める前に、まず以下のいくつかの中核概念を理解する必要があります。それらの関係は次のとおりです:

仓库(Repository)
└── Workflow(工作流)          ← 一个 .yml 文件 = 一个 Workflow
    ├── Event(触发事件)        ← 什么情况下启动这个 Workflow,如 push、PR
    └── Job(作业)× N          ← 一个 Workflow 可以包含多个并行或串行的 Job
        ├── Runner(运行器)     ← 执行 Job 的服务器,如 ubuntu-latest
        └── Step(步骤)× N     ← Job 内按顺序执行的一系列操作
            ├── Action          ← 可复用的封装好的操作,如 actions/checkout
            └── Run             ← 直接执行 Shell 命令
概念 説明 たとえ
Workflow(ワークフロー) 自動化フロー全体で、1つの.ymlファイルで定義され、.github/workflows/ディレクトリ配下に置かれます 完全な作業計画書
Event(イベント) Workflow の実行をトリガーする条件。コードプッシュ、PR 作成、スケジュールタスクなど 計画書の開始条件
Job(ジョブ) Workflow 内の独立したタスク単位。各 Job は独立した仮想マシン上で実行され、複数の Job はデフォルトで並列実行されます 計画書の中の1つの章
Step(ステップ) Job 内で順番に実行される最小の操作単位。Shell コマンド 1 つでも、Action 1 つでもかまいません 章の中の各具体的な手順
Action(アクション) 再利用可能なカプセル化された操作。GitHub 公式、サードパーティ、または自作のものがあり、uses引用することで 既製のツールテンプレート
Runner(ランナー) Job を実行するサーバー。GitHub は Ubuntu、Windows、macOS の 3 種類のホスト環境を提供します 計画を実行する作業員

最初の Workflow を作成する

1、ディレクトリ構造

すべての Workflow ファイルは、リポジトリのルートディレクトリの.github/workflows/フォルダー配下に置く必要があります。ファイル名は.yml 或 .yamlで終わります。ファイル名は自由に設定できます:

your-repo/
├── .github/
│   └── workflows/
│       ├── ci.yml          ← 持续集成流程(如运行测试)
│       ├── deploy.yml      ← 部署流程
│       └── scheduled.yml   ← 定时任务
├── src/
├── package.json
└── README.md

1 つのリポジトリには複数の Workflow ファイルを置くことができます。それらは互いに独立しており、それぞれで定義されたイベントによってトリガーされます。

2、最もシンプルな Workflow

以下は最も基本的な例です。リポジトリにコードをプッシュするたびに「Hello, GitHub Actions!」の 1 行を出力します:

例

# .github/workflows/hello.yml

name
: Hello World                  # Workflow の名前。GitHub Actions ページに表示されます

on
: push                           # トリガー条件: 任意のブランチへのコードプッシュ時にトリガー

jobs
:                             # すべての Job を定義
  say-hello
:                      # Job の ID(任意の名前。同じ Workflow 内で一意)
    name
: 挨拶を出力# Job の表示名(任意。未入力の場合は Job ID が表示されます)
    runs-on
: ubuntu-latest         # 実行環境を指定: GitHub が提供する最新版 Ubuntu 仮想マシンを使用

    steps
:                        # この Job 配下のすべてのステップを順番に実行
      - name
: メッセージを出力# Step の名前(任意。ログ内でこのステップを識別するために使用)
        run
: echo "Hello, GitHub Actions!"   # run:Shell コマンドを直接実行

YAML ファイルはインデントに非常に敏感で、スペースでのインデントが必要で、Tab キーは使えません。VS Code を使用して YAML プラグインをインストールすると、リアルタイムでフォーマットエラーを検出できるのでおすすめです。


トリガーイベント(on)

onフィールドは、どのイベントがこの Workflow をトリガーするかを定義します。単一のイベントでも、複数のイベントの組み合わせでもかまいません。

1、よく使うトリガーイベント

イベント トリガーのタイミング 一般的な用途
push リポジトリにコードがプッシュされたとき テストの実行、コードチェック
pull_request Pull Request が作成または更新されたとき PR マージ前の自動レビュー、テスト
schedule Cron 式による定期トリガー 定期バックアップ、定期データ取得
workflow_dispatch GitHub の Web ページ上で手動トリガー 必要に応じたデプロイ、手動スクリプト実行
release 新バージョンのリリース(Release 作成)時 自動パッケージ化、本番環境へのリリース
workflow_call 他の Workflow から呼び出されたとき 共通フローの再利用(例: 共通テストフロー)

2、ブランチ・パスのフィルタリング

例

span style="color: #0053A6;">
on:
  push
:
    branches
:
     - main            # main ブランチへのプッシュ時にのみトリガー
      - develop         # または develop ブランチへのプッシュ時にトリガー
      - 'release/**'    # または release/ で始まる任意のブランチへのプッシュ時にトリガー(** は任意の文字列に一致)
    paths
:
     - 'src/**'        # さらにフィルタリング: src/ ディレクトリ配下のファイルが変更された場合のみトリガー
      - 'package.json'  # または package.json ファイルが変更された場合にトリガー
                        # これらは「または」の関係で、いずれか一方を満たせばトリガー

  pull_request
:
    branches
:
     - main            # ターゲットブランチが main の PR でのみトリガー(つまり main にマージされる PR)
    types
:
     - opened          # PR が作成されたとき
      - synchronize     # PR に新しいコミットがプッシュされたとき
      - reopened        # PR が再オープンされたとき

3、スケジュールトリガー(schedule)

標準の Cron 式を使用して実行時刻を定義します。タイムゾーンは UTC です(北京時間 = UTC+8 のため換算が必要です):

例

span style="color: #0053A6;">
on:
  schedule
:
   # Cron 形式: 分 時 日 月 曜日
    - cron
: '0 2 * * *'       # 毎日 UTC 02:00(つまり北京時間 10:00)に1回実行
    - cron
: '0 9 * * 1'       # 毎週月曜日 UTC 09:00(つまり北京時間 17:00)に1回実行
    - cron
: '*/30 * * * *'    # 30分ごとに1回実行

# よく使う Cron 式の早見表:
# '0 0 * * *' 毎日午前0時(UTC 00:00)
# '0 * * * *' 毎時0分
# '0 0 * * 0' 毎週日曜日午前0時
# '0 0 1 * *' 毎月1日午前0時

4、手動トリガー(workflow_dispatch)

workflow_dispatchGitHub Webページの Actions タブで手動でボタンをクリックして Workflow を起動でき、入力パラメータも定義できます:

例

span style="color: #0053A6;">
on:
  workflow_dispatch
:
    inputs
:
      environment
:             # 入力パラメータの名前(steps 内で ${{ inputs.environment }} で参照可能)
        description
: 'デプロイ先環境'# パラメータの説明。手動トリガーのフォームに表示されます
        required
: true          # 必須項目かどうか
        default
: 'staging'      # デフォルト値
        type
: choice            # パラメータタイプ:choice(ドロップダウン選択)
        options
:
         - staging             # 選択可能な値
          - production

      run_tests
:
        description
: 'テストを実行するか'
        required
: false
        type
: boolean           # パラメータタイプ:boolean(チェックボックス)
        default
: true

jobs
:
  deploy
:
    runs-on
: ubuntu-latest
    steps
:
      - name
: デプロイパラメータを表示
        run
: |
echo "対象環境:${{ inputs.environment }}"
echo "テスト実行:${{ inputs.run_tests }}"


Jobs と Steps の詳細解説

1、Job の基本構造

例

span style="color: #0053A6;">
jobs:
  build
:                         # Job ID。同じ Workflow 内で一意である必要があります
    name
: プロジェクトをビルド# Job の表示名(オプション)
    runs-on
: ubuntu-latest        # 実行環境(必須)

    # オプション:Job 全体に環境変数を設定。Job 内のすべての Step からアクセス可能
    env
:
      NODE_ENV
: production
      APP_PORT
: 8080

    # オプション:タイムアウト時間(分)を設定。タイムアウトすると Job は自動キャンセルされ、フリーズを防ぎます
    timeout-minutes
: 30

    steps
:
     # Step の記述方法1:Action を使用(uses で参照)
      - name
: コードを取得
        uses
: actions/checkout@v4         # 公式 checkout Action を参照(@v4 は v4 バージョンを使用)

      # Step の記述方法2:Shell コマンドを実行(run で指定)
      - name
: Node バージョンを出力
        run
: node --version

      # Step の記述方法3:複数行の Shell コマンドを実行(| で複数行を指定)
      - name
: 依存関係をインストールしてビルド
        run
: |
         npm install
          npm run build
echo "ビルド完了"

2、実行環境(runs-on)

GitHub は以下の無料のホストランナーを提供しており、必要に応じて選択できます:

ラベル オペレーティングシステム 説明
ubuntu-latest Ubuntu(最新 LTS) 最も一般的で、高速、無料枠が最大。優先的に使用することを推奨
ubuntu-22.04 Ubuntu 22.04 固定バージョンを指定し、latest のアップグレードによる非互換問題を回避
windows-latest Windows Server(最新) Windows 環境が必要なテストやビルドに使用
macos-latest macOS(最新) iOS/macOS アプリのビルドに使用。無料枠の消費が最も速い(Ubuntu の約10倍)

3、Job 間の依存関係(needs)

デフォルトでは、複数の Job は並列実行されます。次を使用するとneedsJob の実行順序を設定し、直列の依存関係を形成できます:

例

span style="color: #0053A6;">
jobs:
  test
:                          # ステップ1:テストを実行
    runs-on
: ubuntu-latest
    steps
:
      - uses
: actions/checkout@v4
      - run
: npm test

  build
:                         # ステップ2:プロジェクトをビルド
    runs-on
: ubuntu-latest
    needs
: test                   # test Job が正常に完了してから、build が開始されます
    steps
:
      - uses
: actions/checkout@v4
      - run
: npm run build

  deploy
:                        # ステップ3:デプロイ
    runs-on
: ubuntu-latest
    needs
: [test, build]          # test と build の両方が正常に完了してから、deploy が開始されます
    steps
:
      - run
: echo "デプロイを開始..."

# 実行順序:test → build → deploy(直列)
# needs を削除すると、3つの Job は同時に並列実行されます

4、条件実行(if)

次を使用するとifJob や Step を実行するかどうかを制御できます。ブランチの判別や前のステップの成功判定などによく使われます:

例

span style="color: #0053A6;">
jobs:
  deploy
:
    runs-on
: ubuntu-latest
    # if を Job レベルに記述:main ブランチへのプッシュ時のみ Job 全体が実行されます
    if
: github.ref == 'refs/heads/main'
    steps
:
      - uses
: actions/checkout@v4

      - name
: 本番環境にデプロイ
        run
: ./deploy.sh

      # if は Step レベルにも記述でき、特定のステップを実行するかどうかを制御できます
      - name
: 成功通知を送信
        if
: success()             # success():上記のすべての Step が成功した場合のみ実行
        run
: echo "デプロイ成功、通知を送信"

      - name
: 失敗通知を送信
        if
: failure()             # failure():いずれかの Step が失敗した場合のみ実行
        run
: echo "デプロイ失敗、アラートを送信"

      - name
: 常に実行されるクリーンアップステップ
        if
: always()              # always():成功・失敗に関わらず実行(一時ファイルのクリーンアップなどによく使われます)
        run
: rm -rf ./tmp

環境変数と Secrets

1、環境変数(env)

環境変数は Workflow の3つのレベルで定義でき、影響範囲は順に狭くなります:

例

# レベル1:Workflow レベル(すべての Job と Step からアクセス可能)
env
:
  APP_NAME
: my-app
  NODE_VERSION
: '18'

jobs
:
  build
:
    runs-on
: ubuntu-latest

    # レベル2:Job レベル(現在の Job 内のすべての Step のみアクセス可能)
    env
:
      BUILD_MODE
: production

    steps
:
      - name
: 環境変数を表示
        # レベル3:Step レベル(現在の Step のみアクセス可能)
        env
:
          STEP_VAR
: hello
        run
: |
echo "アプリ名:$APP_NAME" # Workflow レベル変数にアクセス
echo "ビルドモード:$BUILD_MODE" # Job レベル変数にアクセス
echo "ステップ変数:$STEP_VAR" # Step レベル変数にアクセス
echo "Node バージョン:$NODE_VERSION"

2、GitHub 組み込み変数(github コンテキスト)

GitHub Actions には組み込みのコンテキスト変数が用意されており、任意の場所で${{ }}構文で参照できます:

例

span style="color: #0053A6;">
steps:
  - name
: よく使う組み込み変数を出力
    run
: |
echo "リポジトリ名:${{ github.repository }}" # 例:your-user/your-repo
echo "トリガーイベント:${{ github.event_name }}" # 例:push、pull_request
echo "現在のブランチ:${{ github.ref_name }}" # 例:main、develop
echo "コミット SHA:${{ github.sha }}" # 現在のコミットの完全な SHA ハッシュ値
echo "コミット者:${{ github.actor }}" # この Workflow をトリガーしたユーザー名
echo "作業ディレクトリ:${{ github.workspace }}" # コードチェックアウト後のディレクトリパス
echo "ラン ID:${{ github.run_id }}" # 今回の Workflow 実行の一意の ID
echo "ラン番号:${{ github.run_number }}" # 今回の実行がこの Workflow の何回目の実行か

3、Secrets(機密情報の管理)

パスワード、API キー、サーバーアドレスなどの機密情報はyml ファイルに直接記述できません(コードは公開されているため)、GitHub リポジトリの Secrets に保存する必要があります。

設定手順:リポジトリページに移動 →Settings → Secrets and variables → Actions→ クリックNew repository secret、名前と値を入力して保存します。

例

span style="color: #0053A6;">
steps:
 # Step 内で ${{ secrets.シークレット名 }} を使って設定済みの Secret を参照
  # Secret の値はログ内で自動的に *** にマスクされ、漏洩しません
  - name
: サーバーにデプロイ
    env
:
      SSH_KEY
: ${{ secrets.SSH_PRIVATE_KEY }}       # サーバーの SSH 秘密鍵
      SERVER_IP
: ${{ secrets.DEPLOY_SERVER_IP }}    # サーバーの IP アドレス
    run
: |
     echo "$SSH_KEY" > ~/.ssh/id_rsa
      chmod 600 ~/.ssh/id_rsa
      ssh user@$SERVER_IP "cd /app && git pull && pm2 restart all"

  # GitHub が自動で GITHUB_TOKEN を提供し、このリポジトリを操作するために使う(コードのプッシュ、Release の作成など)
  # 手動で作成する必要はなく、そのまま使用できます
  - name
: 変更をリポジトリにプッシュ
    run
: |
     git config user.name "github-actions[bot]"
      git config user.email "github-actions[bot]@users.noreply.github.com"
      git add .
git commit -m "自動更新 [skip ci]"
      git push

    env
:
      GITHUB_TOKEN
: ${{ secrets.GITHUB_TOKEN }}     # GitHub が自動で提供するため、手動で作成する必要はありません

よく使う Actions の紹介

GitHub 公式およびコミュニティは、すぐに使える Action を数多く提供しており、uses: action名称@版本これらを参照することで、よくある操作を重複して記述するのを避けられます。

1、actions/checkout(コードの取得)

ほぼすべての Workflow の最初のステップはリポジトリのコードを取得することです。公式のアクションを使用します。actions/checkout:

例

span style="color: #0053A6;">
steps:
 # 最も基本的な使い方:現在のブランチの最新コードを作業ディレクトリに取得する
  - uses
: actions/checkout@v4

  # 高度な使い方:with でパラメータを渡してカスタマイズする
  - uses
: actions/checkout@v4
    with
:
      ref
: develop              # 指定したブランチを取得(デフォルトではトリガーイベントのブランチを取得)
      fetch-depth
: 0            # 完全な git 履歴を取得(デフォルトでは最新のコミットのみ取得)
                                # 0 に設定するとすべての履歴を取得でき、git log などのコマンドが正常に使えます
      submodules
: true          # 同時に git サブモジュールを初期化して更新します

2、actions/setup-node(Node.js 環境のセットアップ)

例

span style="color: #0053A6;">
steps:
  - uses
: actions/checkout@v4

  - name
: Node.js 環境を設定
    uses
: actions/setup-node@v4
    with
:
      node-version
: '20'        # Node.js のバージョンを指定

  # 設定後は、npm と node コマンドがそのまま使用できます
  - run
: node --version
  - run
: npm install
  - run
: npm test

3、actions/setup-python(Python 環境のセットアップ)

例

span style="color: #0053A6;">
steps:
  - uses
: actions/checkout@v4

  - name
: Python 環境を設定
    uses
: actions/setup-python@v5
    with
:
      python-version
: '3.11'   # Python のバージョンを指定

  - name
: 依存関係をインストール
    run
: pip install -r requirements.txt

  - name
: テストを実行
    run
: pytest tests/

4、actions/cache(依存関係のキャッシュによるビルド高速化)

Workflow を実行するたびに依存関係をダウンロードし直すと遅くなります。cache Action を使用すると依存関係をキャッシュでき、次回の実行時にキャッシュを直接使用できるため、ビルド時間を大幅に短縮できます:

例

span style="color: #0053A6;">
steps:
  - uses
: actions/checkout@v4

  - uses
: actions/setup-node@v4
    with
:
      node-version
: '20'

  - name
: node_modules をキャッシュ
    uses
: actions/cache@v4
    with
:
      path
: ~/.npm                            # キャッシュするディレクトリを指定
      key
: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
      # key:キャッシュの一意な識別子
      # hashFiles('**/package-lock.json'):lock ファイルの内容に基づいてハッシュ値を生成
      # lock ファイルが変わらなければ key も変わらず、キャッシュに直接ヒットします。lock ファイルに変更があれば依存関係を再インストールします

      restore-keys
: |
       ${{ runner.os }}-node-
      # restore-keys:key がヒットしない場合のフォールバックマッチング戦略。直近の有効なキャッシュを使用します

  - run
: npm ci                              # npm ci は npm install より CI の場面に適しており、より速く、より厳密
  - run
: npm test

5、actions/upload-artifact / download-artifact(Job 間でのファイル受け渡し)

異なる Job は独立した仮想マシンで実行されるため、ファイルを直接共有できません。artifact(成果物)を介して、ある Job の出力ファイルを別の Job に渡すことができます:

例

span style="color: #0053A6;">
jobs:
  build
:
    runs-on
: ubuntu-latest
    steps
:
      - uses
: actions/checkout@v4
      - run
: npm install && npm run build     # ビルド成果物は ./dist ディレクトリに出力されます

      - name
: ビルド成果物をアップロード
        uses
: actions/upload-artifact@v4
        with
:
          name
: dist-files                   # 成果物の名前(ダウンロード時はこの名前で参照)
          path
: ./dist                       # アップロードするディレクトリまたはファイルのパス
          retention-days
: 7                  # 成果物の保持日数(最大 90 日)

  deploy
:
    runs-on
: ubuntu-latest
    needs
: build                             # build Job の完了後に実行
    steps
:
      - name
: ビルド成果物をダウンロード
        uses
: actions/download-artifact@v4
        with
:
          name
: dist-files                   # アップロード時と同じ名前
          path
: ./dist                       # ローカルにダウンロードするディレクトリ

      - name
: ファイルをデプロイ
        run
: rsync -avz ./dist/ user@server:/var/www/html/

マトリックスビルド(Matrix)

マトリックスビルドを使うと、1つの Job 設定で複数の環境で並行実行できます。バージョン横断や OS 横断の互換性テストによく使用されます:

例

span style="color: #0053A6;">
jobs:
  test
:
    name
: Node $ をテスト{{ matrix.node-version }} on ${{ matrix.os }}
    runs-on
: ${{ matrix.os }}         # マトリックス変数から実行環境を読み取る

    strategy
:
      matrix
:
        os
: [ubuntu-latest, windows-latest, macos-latest]   # 3 つの OS
        node-version
: ['18', '20', '22']                    # 3 つの Node バージョン
        # 上記の組み合わせにより、3 × 3 = 9 つの並行 Job が生成されます

      fail-fast
: false                # デフォルトは true:1つの Job が失敗すると残りのすべての Job をキャンセル
                                      # false に設定:ある組み合わせが失敗しても他の組み合わせは続行され、
                                      # すべての環境のテスト結果を確認しやすくなります

    steps
:
      - uses
: actions/checkout@v4

      - name
: Node.js $ を設定{{ matrix.node-version }}
        uses
: actions/setup-node@v4
        with
:
          node-version
: ${{ matrix.node-version }}   # マトリックス変数を参照

      - run
: npm ci
      - run
: npm test

例

# 高度な使い方:exclude で不要な組み合わせを除外し、include で特別な設定を追加します
strategy
:
  matrix
:
    os
: [ubuntu-latest, windows-latest]
    node-version
: ['18', '20']
    exclude
:
      - os
: windows-latest
        node-version
: '18'    # windows + Node 18 の組み合わせを除外

    include
:
      - os
: ubuntu-latest
        node-version
: '20'
        experimental
: true    # 特定の組み合わせに追加の変数を設定(steps 内で matrix.experimental として参照できます)

実践例

例1:Node.js プロジェクト CI(自動テスト)

コードをプッシュするか PR を作成するたびに、依存関係のインストール、コードチェック、テストを自動実行します:

例

# .github/workflows/ci.yml
name
: Node.js CI

on
:
  push
:
    branches
: [main, develop]
  pull_request
:
    branches
: [main]

jobs
:
  test
:
    name
: コードチェックとテスト
    runs-on
: ubuntu-latest

    steps
:
      - name
: コードを取得
        uses
: actions/checkout@v4

      - name
: Node.js 環境を設定
        uses
: actions/setup-node@v4
        with
:
          node-version
: '20'
          cache
: 'npm'                       # setup-node にはキャッシュサポートが組み込まれており、cache Action を単独で使うより簡潔です

      - name
: 依存関係をインストール
        run
: npm ci                          # npm ci は package-lock.json に厳密に従ってインストールし、
                                             # npm install より CI の場面に適しています

      - name
: コードチェックを実行(ESLint)
        run
: npm run lint

      - name
: ユニットテストを実行
        run
: npm test -- --coverage          # テストカバレッジレポートも生成します

      - name
: カバレッジレポートをアップロード
        uses
: actions/upload-artifact@v4
        if
: always()                         # テストの成否にかかわらずレポートをアップロードします(失敗原因を確認しやすい)
        with
:
          name
: coverage-report
          path
: ./coverage

例2:Python プロジェクト CI

例

# .github/workflows/python-ci.yml
name
: Python CI

on
:
  push
:
    branches
: [main]
  pull_request
:

jobs
:
  test
:
    runs-on
: ubuntu-latest

    steps
:
      - uses
: actions/checkout@v4

      - name
: Python 環境を設定
        uses
: actions/setup-python@v5
        with
:
          python-version
: '3.11'
          cache
: 'pip'                       # pip の依存関係をキャッシュ

      - name
: 依存関係をインストール
        run
: |
         python -m pip install --upgrade pip
          pip install -r requirements.txt
pip install flake8 pytest # コードチェックとテストツールをインストール

      - name
: コードフォーマットチェックを実行(flake8)
        run
: |
# 構文エラーと未定義変数をチェック(E9, F63, F7, F82 系)。問題があればエラーで即終了
          flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# コードスタイルをチェック(最大行長 120)。問題数のみを集計し、エラーでは終了しない
          flake8 . --count --max-line-length=120 --statistics

      - name
: テストを実行
        run
: pytest tests/ -v                # -v で詳細なテスト結果を出力

例3:Docker イメージのビルドとプッシュ

例

# .github/workflows/docker.yml
name
: Docker イメージをビルドしてプッシュ

on
:
  push
:
    branches
: [main]
    tags
:
     - 'v*'                               # v で始まるタグをプッシュしたときにトリガーされます(例:v1.0.0)

jobs
:
  docker
:
    runs-on
: ubuntu-latest
    steps
:
      - uses
: actions/checkout@v4

      # 公式の Docker メタデータ Action を使用してイメージタグを自動生成します
      # 例:タグ v1.2.3 をプッシュすると、1.2.3、1.2、1、latest などの複数のタグを自動生成します
      - name
: Docker メタデータを抽出(イメージタグなど)
        id
: meta                           # この Step に ID を設定し、後続の Step がその出力を参照できるようにします
        uses
: docker/metadata-action@v5
        with
:
          images
: your-dockerhub-username/your-image-name

      - name
: Docker Hub にログイン
        uses
: docker/login-action@v3
        with
:
          username
: ${{ secrets.DOCKERHUB_USERNAME }}
          password
: ${{ secrets.DOCKERHUB_TOKEN }}   # パスワードではなく Access Token を使用する方が安全です

      - name
: イメージをビルドしてプッシュ
        uses
: docker/build-push-action@v5
        with
:
          context
: .                       # Dockerfile があるディレクトリ(現在のディレクトリ)
          push
: true                       # true:ビルド完了後に Registry へプッシュ
          tags
: ${{ steps.meta.outputs.tags }}       # meta Step が生成したタグリストを参照
          labels
: ${{ steps.meta.outputs.labels }}   # meta Step が生成したタグ情報を参照

例4:ビルド後のサーバーへの自動デプロイ

例

# .github/workflows/deploy.yml
name
: ビルドしてデプロイ

on
:
  push
:
    branches
: [main]                       # main ブランチへのプッシュ時のみデプロイをトリガー

jobs
:
  build-and-deploy
:
    runs-on
: ubuntu-latest

    steps
:
      - uses
: actions/checkout@v4

      - uses
: actions/setup-node@v4
        with
:
          node-version
: '20'
          cache
: 'npm'

      - name
: 依存関係をインストールしてビルド
        run
: |
         npm ci
npm run build # ビルド成果物は ./dist ディレクトリに出力

      - name
: SSH でサーバーにデプロイ
        uses
: appleboy/[email protected]   # サードパーティ製の SSH Action、SSH の手動設定は不要
        with
:
          host
: ${{ secrets.SERVER_HOST }}       # サーバーの IP またはドメイン
          username
: ${{ secrets.SERVER_USER }}   # SSH ログインユーザー名
          key
: ${{ secrets.SSH_PRIVATE_KEY }}    # SSH 秘密鍵の内容(サーバー上の公開鍵に対応)
          port
: 22                               # SSH ポート(デフォルト 22)
          script
: |
# 以下のコマンドはリモートサーバー上で実行されます
            cd /var/www/my-app
            git pull origin main
            npm ci --production
pm2 restart my-app # pm2 で Node.js アプリを再起動
echo "デプロイ完了:$(date)"

例5:スケジュールタスク(データベースの自動バックアップ)

例

# .github/workflows/backup.yml
name
: データベースを定期的にバックアップ

on
:
  schedule
:
    - cron
: '0 2 * * *'                    # 毎日 UTC 02:00(北京時間 10:00)に実行
  workflow_dispatch
:                       # 手動トリガーもサポートし、一時バックアップに便利

jobs
:
  backup
:
    runs-on
: ubuntu-latest

    steps
:
      - name
: SSH 経由でバックアップスクリプトを実行
        uses
: appleboy/[email protected]
        with
:
          host
: ${{ secrets.SERVER_HOST }}
          username
: ${{ secrets.SERVER_USER }}
          key
: ${{ secrets.SSH_PRIVATE_KEY }}
          script
: |
           TIMESTAMP=$(date +%Y%m%d_%H%M%S)
            BACKUP_FILE="/backup/db_$TIMESTAMP.sql"

# データベースバックアップを実行
            mysqldump -u root -p${{ secrets.DB_PASSWORD }} my_database > $BACKUP_FILE

# バックアップファイルを圧縮
            gzip $BACKUP_FILE

# 30日前の古いバックアップファイルを削除し、ディスクの占有を防ぐ
            find /backup -name "*.sql.gz" -mtime +30 -delete

echo "バックアップ完了:${BACKUP_FILE}.gz"


デバッグのコツ

1、Debug ログを有効にする

Workflow の実行が失敗してもログ情報が不十分な場合、詳細デバッグモードを有効にできます。方法:リポジトリに入りSettings → Secrets and variables → Actions、以下の2つの Secret を追加します(値はすべてtrue):

  • ACTIONS_RUNNER_DEBUG:ランナーの詳細ログを有効にする
  • ACTIONS_STEP_DEBUG:各 Step の詳細デバッグログを有効にする

2、コンテキスト情報を出力して調査を支援する

例

span style="color: #0053A6;">
steps:
  - name
: すべてのコンテキスト情報を出力(デバッグ用。問題調査の際に追加し、解決後に削除)
    run
: |
echo "=== github コンテキスト ==="
echo '${{ toJson(github) }}' # toJson() はオブジェクトを JSON 文字列にフォーマットして出力します
echo "=== env コンテキスト ==="
      echo '${{ toJson(env) }}'
echo "=== job コンテキスト ==="
      echo '${{ toJson(job) }}'

3、Workflow のローカルテスト(act を使用)

コードをプッシュするたびにしか Workflow をテストできないのは効率が非常に低い。actこれはオープンソースツールであり、GitHub Actions をローカルでシミュレーション実行でき、デバッグ効率を大幅に向上させます:

# 安装 act(需要本地已安装 Docker)
# macOS
brew install act

# Linux
curl https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash

# 在仓库根目录运行所有 Workflow
act

# 只运行指定事件触发的 Workflow
act push

# 只运行指定的 Job
act -j build

ローカルでテストする際は、actDocker コンテナを使用して GitHub の実行環境をシミュレートしますが、一部の Action(例:actions/cache)はローカルのシミュレーションでは実際の環境と効果が異なる場合があります。最終結果は GitHub 上での実際の動作を基準とします。


よくある質問と注意点

1、権限の問題(Permission denied)

Workflow がリポジトリへのコードのプッシュや Issues の操作を必要とする場合は、設定ファイルで権限を明示的に宣言する必要があります:

例

# Workflow の最上位または Job レベルで権限を設定
permissions
:
  contents
: write       # リポジトリのコンテンツ(コード、ファイル)の読み書きを許可
  issues
: write         # Issues の作成と変更を許可
  pull-requests
: write  # Pull Requests の操作を許可

# 最小権限の原則:実際に必要な権限のみを開放し、残りはデフォルトで read または none にする

2、Workflow の循環トリガーの回避

Workflow がリポジトリに自動的にコードをプッシュすると、新しい push イベントがトリガーされ、無限ループが発生する可能性があります。解決方法:自動コミットの commit message に[skip ci]キーワードを追加すると、GitHub はそのコミットの Workflow トリガーをスキップします:

git commit -m "自动格式化代码 [skip ci]"

3、YAML 特殊文字のエスケープ

にrunフィールドの Shell コマンドで${{ }}式を使用する場合、式にコロン(:)などの YAML 特殊文字が含まれる場合は、値全体を引用符で囲むか、環境変数に代入してから使用する必要があります:

例

span style="color: #0053A6;">
steps:
 # 非推奨:${{ }} 式を複雑なコマンドに直接埋め込むと、YAML 解析エラーが発生する可能性があります
  - run
: echo ${{ github.event.pull_request.title }}

  # 推奨:まず値を環境変数に代入し、Shell で環境変数を使用する
  - name
: PR タイトルを出力
    env
:
      PR_TITLE
: ${{ github.event.pull_request.title }}
    run
: echo "PR タイトル:$PR_TITLE"

完全なドキュメントは公式ドキュメントを参照してください:https://docs.github.com/zh/actions

その他の拡張