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 行を出力します:
例
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、ブランチ・パスのフィルタリング
例
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 のため換算が必要です):
例
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 を起動でき、入力パラメータも定義できます:
例
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 の基本構造
例
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 の実行順序を設定し、直列の依存関係を形成できます:
例
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 を実行するかどうかを制御できます。ブランチの判別や前のステップの成功判定などによく使われます:
例
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つのレベルで定義でき、影響範囲は順に狭くなります:
例
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 には組み込みのコンテキスト変数が用意されており、任意の場所で${{ }}構文で参照できます:
例
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、名前と値を入力して保存します。
例
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:
例
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 環境のセットアップ)
例
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 環境のセットアップ)
例
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 を使用すると依存関係をキャッシュでき、次回の実行時にキャッシュを直接使用できるため、ビルド時間を大幅に短縮できます:
例
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 に渡すことができます:
例
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 横断の互換性テストによく使用されます:
例
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
例
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 を作成するたびに、依存関係のインストール、コードチェック、テストを自動実行します:
例
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
例
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 イメージのビルドとプッシュ
例
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:ビルド後のサーバーへの自動デプロイ
例
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:スケジュールタスク(データベースの自動バックアップ)
例
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、コンテキスト情報を出力して調査を支援する
例
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 の操作を必要とする場合は、設定ファイルで権限を明示的に宣言する必要があります:
例
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 特殊文字が含まれる場合は、値全体を引用符で囲むか、環境変数に代入してから使用する必要があります:
例
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
その他の拡張