2

GitHub Actions Beta (YAML のもの) で実行されたワークフローから GitHub リポジトリにコードをプッシュしようとしています。これは、Git が GitHub で認証する方法を認識できるように、資格情報を含む URL にリモート URL をgit push設定した後に実行するだけで簡単に実行できます。origin

GitHub Actions は、すぐに使用できる PAT: を取得することもGITHUB_TOKENできます。これを使用すると、以前のワークフロー実行に関連付けられていることがわかっている PAT を使用してコミットがリポジトリにプッシュされたときに、別のアクションをスケジュールしないことをシステム全体が十分に認識できます。

これは素晴らしいことですが、カスタム PAT を使用するユースケースがあり (私の場合は GitHub ページをトリガーしてビルドしますが、すぐに使用できる PAT では実行できません)、カスタム PAT を使用すると、GitHub に認識させるという利点が失われます。現在のワークフローからコミットをプッシュした後、別のワークフローを実行しないでください。

その結果、カスタム PAT を使用すると、ワークフローの無限ループに陥ることになります。多くの CI ソリューションはコミット メッセージを尊重***NO_CI***し、この文字列がコミット メッセージに存在する場合、チェック/ビルドなどを実行しません。GitHub Actions Beta は気にしません。

私が思いついた唯一のことは、GitHub Action ワークフローのジョブ/ステップを条件付きにし、次のような条件を構築することです。

- if: !contains(github.commit_message, "***NO_CI***")

ただし、githubコンテキスト オブジェクトにはコミット メッセージを含むフィールドがなく、コンテキストは、Git を使用して SHA からコミット メッセージを取得するコマンドを実行し、その上で を実行できるほど表現力がないようですcontains

これを達成するためのオプションはありますか?

4

4 に答える 4

1

GitHub Actions はネイティブにサポートしていません。代わりに、定義済みのコンテキスト値を使用してリポジトリにプッシュする***NO_CI***ことに依存しています。secrets.GITHUB_TOKENGitHub Actions は、このトークンを特別に扱い、このトークンが使用されている場合、新しいワークフローの実行を発行しません。ただし、このトークンを使用してプッシュが行われると、GitHub ページもデプロイされません。

この両方の動作 (リポジトリへのワークフローのプッシュによって別のワークフローが実行されることはありません + リポジトリにプッシュされたワークフロー実行のアーティファクトから GitHub ページが構築されます) を得るには、次の 2 つのことを組み合わせる必要があることがわかりました。

  • secrets.GITHUB_TOKENリポジトリへのプッシュを行うために使用します
  • リポジトリ設定の [シークレット] タブに配置されたrepo_public(またはプライベートの) スコープを持つカスタム PAT を使用し、次を使用してアクセスします。reposecrets.GITHUB_PAGES_PAT
  • カスタム PAT で API を使用して手動で GitHub Pages デプロイを実行します (デフォルトのトークンは統合トークンとしてマークされており、この API メソッドを呼び出すことは許可されていません)。

.github/workflows/main.yml

name: github-pages
on:
  push:
    branches:
    # Limit to the `master` branch
    - master
  schedule:
    # Run hourly
    - cron:  '0 * * * *'
jobs:
  github-pages:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: Generate GitHub Pages
      run: |
        set -x
        # Configure Git for the push from the workflow to the repository
        git config --global user.email "tomas@hubelbauer.net"
        git config --global user.name "Tomas Hubelbauer"
        # Check out the `master` branch because by default GitHub Actions checks out detached HEAD
        git checkout master
        # Run script which generates your artifacts to push to the repo
        ./script.sh
        # Add generated artifacts to Git stage
        git add out
        # Reset unstaged changes to prevent `git commit` from yelling if there's changes outside of `out` (cache, …)
        git checkout -- .
        # Commit the changes to the Git repository to deploy GitHub Pages (if any)
        if git diff-index --quiet HEAD --; then
          exit
        fi
        git commit -m "Generate GitHub Pages"
        # Authenticate with GitHub using the default integration PAT (this one won't deploy GitHub Pages)
        git remote set-url origin https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
        # Pull before pushing to integrate fast forward changes if any
        git pull --rebase
        # Push the changes to GitHub without causing another workflow run thanks to the default integration PAT
        git push
        # Enqueue a GitHub Pages deployment using the API with the custom PAT with repo_public or repo (private) scope
        curl -f -X POST -H "Authorization: token ${{ secrets.GITHUB_PAGES_PAT }}" -H "Accept: application/vnd.github.mister-fantastic-preview+json" "https://api.github.com/repos/${{ github.repository }}/pages/builds"
于 2019-09-07T12:56:04.893 に答える