web-dev-qa-db-ja.com

個人用アクセストークンを使用してCircleCIビルドからGithubにコミットをプッシュする方法

CircleCIでgitリポジトリgiantswarm/docs-contentのビルドを実行するときに、別のリポジトリgiantswarm/docsにコミットをプッシュしたいと思います。

これはcircle.ymldeploymentセクションにあります。

git config credential.helper cache
git config user.email "<some verified email>"
git config user.name "Github Bot"
git clone --depth 1 https://${GITHUB_PERSONAL_TOKEN}:[email protected]/giantswarm/docs.git
cd docs/
git commit --allow-empty -m "Trigger build and publishing via docs-content"
git Push -u Origin master

この fails は、最後のコマンドで次のエラーメッセージが表示されます。

ERROR: The key you are authenticating with has been marked as read only.
fatal: Could not read from remote repository.

GITHUB_PERSONAL_TOKEN環境変数は、プライベートリポジトリgiantswarm/docsにアクセスするためにrepoスコープで作成されたユーザーの個人用アクセストークンに設定されます。さらに、そのリポジトリの管理者権限を持つチームにユーザーを追加しました。

その一連のコマンドは、新しいUbuntu VMで実行すると問題なく機能します。 CircleCIにない理由は何か?

15
Marian

ALi Amin によるヒントのおかげで、私は今この作業ソリューションを持っています:

version: 2
jobs:
  build:
    machine: true
    steps:
      - run:
          name: Clone docs
          working_directory: ~/workdir
          command: |
            git clone --depth 1 https://${DOCS_GITHUB_TOKEN}@github.com/giantswarm/docs.git
      - deploy:
          name: Trigger docs deployment
          working_directory: ~/workdir/docs
          command: |
            git config credential.helper 'cache --timeout=120'
            git config user.email "<email>"
            git config user.name "Deployment Bot"
            git commit --allow-empty -m "Trigger deployment"
            # Push quietly to prevent showing the token in log
            git Push -q https://${DOCS_GITHUB_TOKEN}@github.com/giantswarm/docs.git master

いくつかのメモ:

  • git cloneが最初です。
  • 後続のすべてのgitコマンドは、クローンディレクトリで実行する必要があります。 working_directoryは、これを大幅に簡略化します。
  • トークンDOCS_GITHUB_TOKEN個人アクセストークン で、ターゲットリポジトリのrepoスコープを持ちます。
10
Marian

私は使いました

git Push -q https://${GITHUB_PERSONAL_TOKEN}@github.com/<user>/<repo>.git master

そしてそれは働いた。次のように更新します。

# Push changes
git config credential.helper 'cache --timeout=120'
git config user.email "<email>"
git config user.name "<user-name>"
git add .
git commit -m "Update via CircleCI"
# Push quietly to prevent showing the token in log
git Push -q https://${GITHUB_PERSONAL_TOKEN}@github.com/giantswarm/docs.git master
19
Ali Amin

コマンドにトークンを埋め込むことはこのケースでは機能しますが、すべてのケースで機能するわけではなく、質問に答えません。

  1. その他のケースには、gitコマンドへの直接アクセスを公開しないスクリプトが含まれます。彼らはGH_TOKEN変数が設定されているため、例のようにそれを注入することはできません。

  2. それは質問に答えません:

CircleCIにない理由は何か?

CircleCIサポートフォーラムで、これに関する回答があります。

https://support.circleci.com/hc/en-us/articles/360018860473-How-to-Push-a-commit-back-to-the-same-repository-as-part-of- the-CircleCI-job

Git Pushを実行すると、「エラー:認証に使用しているキーが読み取り専用としてマークされました。」という結果になります。

CircleCIにプロジェクトを追加すると、デフォルトでプロジェクトが構成されているデプロイキーには読み取りアクセス権のみがあるため、上記のエラーメッセージを回避するには、書き込み権限を持つキーを使用するように構成する必要があります。プロジェクトにユーザーキーまたは読み取り/書き込み展開キーが構成されていることを確認してください

https://circleci.com/docs/2.0/gh-bb-integration/#creating-a-github-deploy-key

このプロセスを完了すると、プッシュを許可する書き込み権限を持つデプロイキーが必要になります。

0
Matt Mazzola