GitHub Actions、GitLab、Jenkinsで夜間APIテストを自動設定する方法

API のナイトリービルドを設定し、Apidog CLI を使用して CI で自動回帰テストをスケジュールしましょう。GitHub Actions、GitLab、Jenkins の cron 設定をコピー&ペーストして、朝までに障害を発見できるようにしましょう。

Ashley Innocent

Ashley Innocent

15 6月 2026

GitHub Actions、GitLab、Jenkinsで夜間APIテストを自動設定する方法

Apidog エンタープライズ

オンプレミスデプロイ

SSO & RBAC

SOC 2 準拠

Apidog Enterpriseを見る

あなたのAPIテストは、すべてのプルリクエストでパスします。ビルドはグリーンです。あなたは出荷します。すると午前9時、別のタイムゾーンの誰かが、チェックアウトが500エラーを返していると報告しました。しかし、チェックアウトのコードは誰も変更していません。変更されたのは、サードパーティの決済サンドボックス、夜間に実行されたデータベースマイグレーション、あるいは静かに期限切れになったトークンでした。リポジトリ内で何も移動しなかったため、コミットごとのテストでは決してこれを検出できませんでした。

ナイトリービルドが埋めるのは、このギャップです。ナイトリービルドとは、コードの変更時だけでなく、実際のサービスや環境に対して、通常は深夜に1日1回実行されるスケジュールされたフルテスト実行です。これは、コミット間に潜む障害、例えばデータのずれ、不安定な連携、期限切れの認証情報、パフォーマンスの緩やかな低下、制御できないサービスによって引き起こされる契約違反などを検出します。APIの場合、ナイトリー回帰テストは、設定できる最も安価な早期警告システムです。

このガイドでは、Apidog を使用してそのシステムをエンドツーエンドで構築する方法を説明します。回帰テストスイートを設計し、Apidog CLIでコマンドライン実行を生成し、それをGitHub Actions、GitLab、JenkinsのスケジュールされたCIジョブに組み込み、スタンドアップの前にレポートが用意されている状態にします。もしあなたが、ナイトリー実行によって何時間も早く検出できたはずの障害をデバッグした経験があるなら、これはその時間を買い戻すワークフローです。

button

コミットごとのテストだけでは不十分な理由

継続的インテグレーションは、すべてのプッシュでテストを行うよう私たちを訓練しました。それは良いことであり、続けるべきです。しかし、コミットごとのテストは「この変更で何かが壊れたか?」という狭い問いに答えるものです。これらは高速で頻繁に実行され、開発者が作業を中断されないように範囲が限定されています。その範囲限定が、まさに問題の全カテゴリを見逃す理由なのです。

ナイトリービルドは、より広い問いに答えます。「誰も触れていなくても、システムは今も健全か?」この違いは重要です。なぜなら、本番環境にはあなたのコミットでは見ることのない動的な要素があるからです。

したがって、パターンは二層構造であり、どちらか一方ではありません。高速なスモークテストが各コミットを保護します。より深い回帰テストスイートはスケジュールに基づいて実行されます。ナイトリー層は、遅すぎる、広すぎる、あるいは実世界の状況に依存しすぎるためインナーループには適さないすべてのものを置く場所です。

ナイトリーAPI回帰テストスイートに含めるべきもの

何かをスケジュールする前に、ナイトリー実行で実際に何をチェックするかを決定してください。ナイトリースイートは、コミットゲートのスモークテストよりも広範で、簡単なヘルスチェックよりも徹底的です。静かに壊れた場合にあなたが困るようなカバレッジを目指しましょう。

堅実なナイトリーAPIスイートは以下をカバーします。

このような構造化されたケースをまだ書いたことがない場合は、APIテストケースのテンプレートと例が良い出発点となります。また、APIアサーションは、レスポンスボディ、ステータス、ヘッダー、タイミングを正確に検証する方法をカバーしています。

ステップ1: Apidogで回帰テストスイートを構築する

Apidogは、テストをAPIライフサイクルの一部として、後付けではなくファーストクラスで扱います。エンドポイントを設計し、それらを実際のワークフローを反映したテストシナリオに連結します。シナリオは、各ステップがアサーションを持つAPIリクエストであり、データがあるステップから次のステップへと流れる順序付けられたリストです。

以下は、チェックアウト回帰シナリオの概略です。

  1. POST /auth/login: 認証情報を送信し、200 をアサートし、レスポンスから accessToken を変数に抽出します。
  2. POST /carts: トークンを使用してカートを作成し、201 をアサートし、cartId を抽出します。
  3. POST /carts/{cartId}/items: 商品を追加し、200 をアサートし、レスポンスボディの total が期待価格と等しいことをアサートします。
  4. POST /checkout: カートを送信し、200 をアサートし、order.status"confirmed" であることをアサートします。
  5. GET /orders/{orderId}: 注文を読み戻し、正しい品目が保持されていることをアサートします。

Apidogでは、これを視覚的に構築します。各ステップで、ボイラープレートコードを書くことなくアサーションを設定できます。例えば、「レスポンスステータスが200」や「JSONPath $.order.status が confirmed と等しい」といった視覚的なアサーションです。スキーマの準拠については、Apidogはエンドポイントの保存されたOpenAPI定義に対してレスポンスを自動的に検証できるため、すべてのフィールドに対して手動でチェックを記述する必要はありません。

ナイトリースイートを保守可能に保つためのいくつかの設計ルール:

他のツールから移行してきた方であれば、これはあなたが知っている概念にきれいにマッピングされます。シナリオを連携させるより広範な内容は、APIテストオーケストレーションガイドに記載されており、Apidogで構造化されたテストを実行したことがない場合は、ApidogでAPIをテストする方法がステップバイステップの出発点となります。Apidogをダウンロードし、この先を読み進める前に一つシナリオを作成してください。このガイドの残りの部分は、実行するスイートがあることを前提としています。

ステップ2: コマンドラインからスイートを実行する

ナイトリービルドは無人で実行されるため、ヘッドレスランナーが必要です。それがApidog CLIです。これは、GUIなしで任意のターミナルから保存されたテストシナリオを実行できるnpmパッケージです。CI/CDパイプライン内での自動実行のためにまさにこれが必要とされます。

グローバルにインストールします。CLIにはNode.js v16以降が必要です。

npm install -g apidog-cli

オンラインシナリオ(Apidogプロジェクトに存在するシナリオ)を実行するには、アクセス_トークンとシナリオまたはスイートIDの2つのものが必要です。ApidogのCI/CD設定にある「アクセストークンを追加」ボタンからトークンを生成します。そのトークンはパスワードのように扱ってください。それはシークレットに保存され、決してリポジトリには置かないでください。

単一のテストシナリオを実行するコマンドは次のようになります。

apidog run \
  --access-token $APIDOG_ACCESS_TOKEN \
  -t 123456 \
  -e 789 \
  -r cli,html \
  --out-dir ./apidog-reports

実際のApidog CLIオプションを使用したフラグごとの説明:

その他のフラグもナイトリー実行で役立ちます。-n, --iteration-count <n> は不安定さを浮上させるために実行を繰り返します。-d, --iteration-data <path> はCSVまたはJSONファイルを供給し、一つのシナリオが複数のデータ行で実行されるようにします。これは境界テストに最適です。--env-var "key=value" および --global-var "key=value" は実行時に値を挿入し、保存されたシナリオから認証情報を除外する方法です。

これを覚える必要はありません。Apidogは正確なコマンドを生成します。クライアントのCI/CDパネルを開き、シナリオまたはスイートを選択し、既製の apidog run 行をパイプライン設定に直接コピーします。スケジュールする前に、まず一度ローカルで実行し、グリーンであることを確認してください。

ステップ3: ナイトリービルドとしてスケジュールする

ナイトリービルドとは、このコマンドをタイマーで実行することです。すべてのCIプラットフォームは、cron構文を介してスケジュールされたジョブをサポートしています。そのパターンはすべてで同じです。つまり、日次トリガー、シークレットからのアクセストークン、CLI実行、そしてアーティファクトとしてアーカイブされるレポートです。

GitHub Actions

GitHub Actionsは、標準のcronによる schedule トリガーをサポートしています。このワークフローは毎日UTC 02:00に実行され、workflow_dispatch を介して手動ボタンも公開します。

name: Nightly API Regression

on:
  schedule:
    - cron: '0 2 * * *'   # 02:00 UTC daily
  workflow_dispatch:        # allow manual runs

jobs:
  regression:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Node
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install Apidog CLI
        run: npm install -g apidog-cli

      - name: Run nightly regression suite
        run: |
          apidog run \
            --access-token $APIDOG_ACCESS_TOKEN \
            --test-suite ${{ vars.APIDOG_SUITE_ID }} \
            -e ${{ vars.APIDOG_ENV_ID }} \
            -r cli,html \
            --out-dir ./apidog-reports
        env:
          APIDOG_ACCESS_TOKEN: ${{ secrets.APIDOG_ACCESS_TOKEN }}

      - name: Upload HTML report
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: apidog-nightly-report
          path: ./apidog-reports

アップロードステップの if: always() は重要です。なぜなら、実行が失敗した場合でもレポートをアーカイブしたいからです。失敗した時こそ、レポートを読む必要があるからです。GitHubのスケジュールされたジョブはUTCで実行され、ピーク負荷時には遅延する可能性があるため、正確な秒単位で実行する必要があるものはスケジュールしないでください。

GitLab CI/CD

GitLabは、YAMLではなくUI(CI/CD > Schedules)を介してパイプラインをスケジュールします。その後、ジョブはルール条件に基づいて実行されるため、すべてのプッシュ時ではなく、スケジュールされたときのみ実行されます。

nightly-regression:
  image: node:20
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
  before_script:
    - npm install -g apidog-cli
  script:
    - apidog run
        --access-token "$APIDOG_ACCESS_TOKEN"
        --test-suite "$APIDOG_SUITE_ID"
        -e "$APIDOG_ENV_ID"
        -r cli,html
        --out-dir ./apidog-reports
  artifacts:
    when: always
    paths:
      - apidog-reports/
    expire_in: 30 days

APIDOG_ACCESS_TOKEN をマスクされた保護されたCI/CD変数として設定し、0 2 * * * のようなcron式でパイプラインスケジュールを作成します。rules ブロックは、このジョブが通常のコミットで実行されないようにします。

Jenkins

Jenkinsでは、cron トリガーを持つ pipeline が同じジョブを実行します。トークンを認証情報として保存し、withCredentials を使用して取得します。

pipeline {
    agent any
    triggers {
        cron('H 2 * * *')   // around 02:00, H spreads load
    }
    stages {
        stage('Install CLI') {
            steps { sh 'npm install -g apidog-cli' }
        }
        stage('Nightly regression') {
            steps {
                withCredentials([string(credentialsId: 'apidog-token',
                                        variable: 'APIDOG_ACCESS_TOKEN')]) {
                    sh '''
                        apidog run \
                          --access-token $APIDOG_ACCESS_TOKEN \
                          --test-suite $APIDOG_SUITE_ID \
                          -e $APIDOG_ENV_ID \
                          -r cli,html \
                          --out-dir ./apidog-reports
                    '''
                }
            }
        }
    }
    post {
        always {
            archiveArtifacts artifacts: 'apidog-reports/**', allowEmptyArchive: true
        }
    }
}

H 2 * * *H はJenkinsの気の利いた機能です。これは、時間内の安定した分を選択し、すべてのナイトリージョブが02:00ぴったりに殺到しないようにします。

そのcronフィールドは、3つのプラットフォームすべてで同じです。0 2 * * * は、毎日午前2時0分を意味します。問題をより早く発見するために一晩に2回実行したいですか?0 2,14 * * * を使用します。平日のみですか?0 2 * * 1-5 を使用します。ステージング環境が静かで、外部サンドボックスが起動している時間を選びましょう。

ステップ4: 失敗を見過ごせないようにする

誰も読まないログに失敗が記録されるだけのナイトリー実行は、ナイトリー実行がないよりも悪いものです。それは誤った自信を築きます。目的はアラートです。結果をチームがすでに確認している場所に連携させましょう。

CLIの終了コードがフックとなります。シナリオが失敗すると apidog run はゼロ以外のコードで終了するため、CIは自動的にジョブを赤く表示します。そこから:

ナイトリービルドの信頼性を保つための規律が一つあります。失敗は、そうではないと証明されるまで本当のバグとして扱ってください。ナイトリースイートを台無しにする最も手っ取り早い方法は、不安定なテストが皆に赤信号を無視するように習慣づけてしまうことです。もしシナリオが断続的に失敗する場合、テストか環境を修正してください。軽視してはいけません。-n を使用してシナリオを繰り返したり、シナリオが依存するデータを安定させたりすることで、通常は真の不安定さが露呈します。

Apidogがナイトリーパターンに適している理由

ナイトリーAPIパイプラインは、複数のパーツから組み立てることもできます。設計用のツール、テスト作成用のツール、ヘッドレス実行用のツール、そしてスキーマバリデーターを後付けするといった方法です。多くのチームがそのように運用しており、各パーツが同期しなくなるまでは機能します。しかし、午前2時に実行されたテストが、実際に出荷したAPIと一致しなくなったときに問題が発生します。

Apidogはそれを一つのワークフローにまとめます。あなたが設計するエンドポイント、テストするシナリオ、検証するスキーマ、そしてスケジュールするコマンドはすべて、同じ信頼できる情報源を参照します。エンドポイントを変更すると、シナリオとスキーマチェックもそれに合わせて移動します。エクスポートのステップもなければ、静かに古くなるコレクションもなく、同期を保つための契約の二重コピーもありません。Postmanコレクションが信頼できる情報源ではないことの苦痛を感じたことがあるなら、この単一情報源設計がその違いです。

CLIはGUIと同じエンジンであるため、デスクで視覚的にデバッグしたシナリオは、CIで午前2時にまったく同じように実行されます。あなたは完全な可視性をもってテストを構築および修正し、その後一つのコマンドでヘッドレスに実行します。この対称性こそが、ナイトリービルドをあなたが手厚く世話するものではなく、信頼できるものにする理由です。

よくある質問

ナイトリービルドと継続的インテグレーションの違いは何ですか?

継続的インテグレーションは、新しいコミットの回帰を捕捉するために、コードの変更ごとにテストを実行します。ナイトリービルドは、何かが変更されたかどうかに関わらず、通常は夜間に固定されたスケジュールで実行されます。CIはチームが壊したものを見つけ、ナイトリー実行は外部環境が壊したもの、例えば期限切れのトークン、ずれた依存関係、データ変更、パフォーマンスの緩やかな低下などを検出します。成熟したパイプラインは両方を実行します。高速なスモークテストが各コミットを保護し、より広範な回帰テストスイートが毎晩実行されます。

ナイトリービルドはいつ実行すべきですか?

テスト環境がアイドル状態で、依存する外部サービスにアクセスできる時間帯を選びましょう。多くのチームにとって、それは現地時間の午前1時から午前4時です。APIがサードパーティのサンドボックスを呼び出す場合は、その時間にそれらが起動していることを確認してください。一部のプロバイダーは夜間にスロットリングしたり、一時停止したりすることがあります。何千ものジョブが一度にトリガーされる共有CIでは、ちょうど毎正時にスケジュールするのを避けてください。数分ずらすか(またはJenkinsの H 構文を使用する)ことで、負荷が分散されます。

ナイトリースイートを本番環境に対して実行できますか?

本番環境に対しては、読み取り専用のチェックを安全に実行してください。データを書き込むものについては、現実的なデータを持つ専用のステージング環境またはプリプロダクション環境にナイトリースイートを向けたり、冪等な操作とクリーンアップステップを使用したりしてください。一般的なパターンとしては、ステージング環境に対する完全な読み書き回帰実行と、ライブシステムが到達可能で正しく応答していることを確認するための本番環境に対する小規模な読み取り専用スモーク実行を組み合わせる方法です。

これは監視とどう違うのですか?

稼働時間監視は「APIは稼働していますか?」という問いに答えます。ナイトリー回帰テストスイートは「APIは正しいですか?」という問いに答えます。監視はエンドポイントにpingを打ち、200をチェックします。回帰実行は完全なワークフローを実行し、スキーマに対してレスポンスボディを検証し、認証境界をチェックし、ビジネスルールをアサートします。これらは補完的な関係にあります。監視は継続的で表面的であり、ナイトリーテストは定期的で深層的です。

APIテストをスケジュールするためにコードを書く必要がありますか?

いいえ。Apidogではスクリプトなしで視覚的にシナリオを構築し、CI/CDパネルから生成された apidog run コマンドをコピーするだけです。唯一の「コード」は、CIプラットフォームにいつ実行するかを指示する数行のYAMLまたはパイプライン設定であり、それらは上記のテンプレートです。コマンドラインランナー全般の比較をご覧になりたい場合は、Postman CLI vs NewmanNewmanなしでCIでコレクションを実行する が代替案をカバーしています。

最初のナイトリー実行を設定する

小さく始めてください。ログインフローやチェックアウトパスなど、1つの重要なワークフローを選択し、それを実際のアサーションを含む単一のApidogシナリオとして構築します。CLIでローカルで実行し、グリーンになるまで確認します。生成されたコマンドを上記のテンプレートのいずれかを使用してスケジュールされたジョブにドロップします。失敗をチームチャットに連携させます。これで、半日で動作するナイトリービルドが完成です。

そこからスイートを成長させます。次に重要なジャーニーのシナリオを追加し、全体的にスキーマ検証を有効にし、重要なエンドポイントにパフォーマンス予算を設定します。1週間以内に、コミットごとのテストでは決して検出できないように設計された障害を捕捉する回帰テスト網が構築され、午前9時の顧客からの報告ではなく、午前2時のチャットメッセージでそれらを知ることになるでしょう。

button

ApidogでAPIデザイン中心のアプローチを取る

APIの開発と利用をよりシンプルなことにする方法を発見できる