Skip to main content

このドキュメントは AI によって自動翻訳されています。不正確な部分がある場合は、英語版 を参照してください。

Tip

作業をコーディングエージェントに任せるには、difyctl スキルでエージェントをセットアップ し、このページを渡してください。

ジョブでの difyctl のインストール#

インストーラー を使い、DIFY_VERSION には必ずサーバーのバージョンを指定します。こうしておけば、Dify の新しいリリースが出ても、ジョブがインストールするビルドは変わりません。インストーラーが GitHub のレート制限で止まる場合は、ジョブの環境に GITHUB_TOKEN または GH_TOKEN を設定します。

サインイン#

無人で実行するジョブには、自分でサインインしてトークンを渡します。コードを毎回承認できる人がいる場合は、スクリプトからサインインすることもできます。

ジョブへのトークンの受け渡し#

トークンは、CI 専用のアカウントで取得するか、普段 difyctl を使わないマシンで取得してください。インポート、テスト、公開を行うには、アカウントにエディター以上のロールが必要です。そのマシンで同じアカウントがもう一度サインインすると、ジョブのサインインは終了します。

トークンをファイルからコピーできるよう、--no-keyring を付けてサインインします:

設定フォルダ 内の tokens.yml から、トークンをコピーします:

トークンを CI のシークレットとして保存し、ジョブに次の 環境変数 を設定します:

  • DIFY_SERVER:サインイン時に指定したアドレス
  • DIFY_TOKEN:シークレットから読み込んだトークン
  • DIFY_WORKSPACE_ID:アプリがあるワークスペースの id(difyctl get workspace の一覧に表示される)

ジョブが既定の設定フォルダに書き込めない場合は、DIFY_CONFIG_DIR に書き込み可能なフォルダを指定します。

その後、tokens.yml を削除して、トークンが CI のシークレットにだけ残るようにします。削除すると、サインインに使ったマシンはサインアウトした状態になりますが、ジョブはそのまま動き続けます。代わりに logout を実行すると、ジョブのサインインも終了してしまいます。

サインインの更新#

ジョブのコマンドが auth_expired(終了コード 4)で失敗するようになったら、サインインし直して、CI のシークレットのトークンを置き換えます。

サインインは、次の場合に使えなくなります:

  • 有効期限が切れた場合(14 日。セルフホストのサーバーで OAUTH_TTL_DAYS を設定していれば、その日数)
  • そのマシンで同じアカウントがもう一度サインインした場合(別の設定フォルダでのサインインも含む)

ジョブが失敗する前に更新するには、ジョブで difyctl get account session を実行します。device_label がサインインに使ったマシンになっているセッションの expires_at を確認してください。

スクリプトからのサインイン#

--no-wait を付けてサインインを開始します。ほかの login と同様に、まず現在のセッションからサインアウトし、コードを表示して、承認を待たずに終了します:

verification_uri と user_code を、URL を開いて 15 分以内にコードを承認できる人に渡します。

その後、同じ設定フォルダでサインインを完了します:

  • コードが承認されるまでは、{"status":"pending"} を表示して終了コード 0 で終了します。そのため、終了コードではなく status を確認してください。
  • コードが承認されると、代わりにサインインした account を表示します。status は含まれません。
  • 承認前にコードが拒否されるか期限切れになると、終了コード 4 で失敗します。その場合は login --no-wait からやり直します。

古いコードの期限が切れる前にやり直す場合は、誰もそのコードを承認しないようにしてください。新しいコードでサインインした後に誰かが古いコードを承認すると、サインアウトした状態になります。

コーディングエージェントのコードを承認する前に確認すべき点については、サインイン を参照してください。

失敗への対処#

各ステップは、set -eo pipefail を有効にした bash で実行します。

次のコマンドは、ジョブを止めるべき場合でも終了コード 0 で終了します。jq -e は条件が偽の場合に失敗するため、各コマンドの出力を次のように jq -e で確認してください:

  • check console_app dsl(ファイルが無効な場合):jq -e '.valid'
  • import console_app dsl(インポートが確認待ちのまま保留された場合):jq -e '.status | startswith("completed")'
  • check console_app dependency(アプリが使う統合がワークスペースにない場合):jq -e '.leaked_dependencies | length == 0'
  • test console_app workflow(実行が 一時停止したか、途中で打ち切られた 場合):jq -e '.status == "ended"'
  • check console_app release(ドラフトを公開する準備ができていない場合):jq -e '.ready'

終了コード 7 で終了したコマンドは、レート制限 に達しており、何も処理していません。ジョブで 1 分待ってから、そのコマンドを再実行します。

例:マージ時のアプリの更新#

次の GitHub Actions ワークフローは、プルリクエストでアプリの DSL ファイル apps/order-status.yml が変更されると、そのファイルをアプリと照らし合わせて検証します。main にマージされると、アプリを更新して公開します。各ステップの内容については、アプリの更新 を参照してください。

Warning

インポートのたびに、スタジオで加えられた変更も含めて、アプリのドラフトが置き換わります。そのため、アプリの変更はリポジトリを通してのみ行ってください。また、インポートすると、ファイルの名前、説明、アイコン、Web アプリ設定がすぐに適用されます。後続のステップが失敗しても、公開中のワークフローは変わりません。

このワークフローを使うには、まずシークレット DIFY_TOKEN と変数 DIFY_WORKSPACE_ID をリポジトリに追加します。追加先は、リポジトリの Settings > Secrets and variables > Actions です。次に、例に示した値を自分の値に置き換えます。置き換えるのは、サーバーのアドレス、アプリの ID と名前、ファイルパス、Dify のバージョン、テストの入力です。アプリの ID と名前は、どちらも difyctl get console_app で確認できます。

.github/workflows/update-order-status.yml