2

我正在尝试从 GitHub Actions Beta(YAML 的)中运行的工作流将代码推送到 GitHub 存储库。这很容易做到,只需在将远程 URLgit push设置为包含凭据的 URL 后运行origin,以便 Git 知道如何使用 GitHub 进行身份验证。

GitHub Actions 甚至获得了一个开箱即用的 PAT: GITHUB_TOKEN,它可以被使用,并且整个系统足够智能,可以知道在使用已知与先前工作流运行相关联的 PAT 将提交推送到存储库时不会安排另一个操作。

这很好,但是,有使用自定义 PAT 的用例(在我的情况下,触发 GitHub Pages 构建,开箱即用的 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

2

您可以按照自己的方式配置 Github Actions。

- if: "!contains(github.event.head_commit.message, '***NO_CI***')"

# dump all github context
- name: Dump GitHub context
  env:
    GITHUB_CONTEXT: ${{ toJson(github) }}
  run: echo "$GITHUB_CONTEXT"

使用时也不要忘记将句子用引号引起来!

参考: https ://help.github.com/en/github/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions

于 2019-10-30T03:17:20.927 回答
1

检查GitHub Pages 的 GitHub Actions 中是否存在替代方法

例如:peaceiris/actions-gh-pages,其中ACTIONS_DEPLOY_KEY添加了 SSH 密钥并用于该工作流程。

GitHub Pages Deploy仅包括:

请记住添加适当的过滤器操作作为此操作的依赖项,以避免从所有分支进行部署,以及避免部署本身会触发另一次运行的“无限循环”。

在我上面提到的工作流程中(在此提交提交中)使用了此类过滤器。

于 2019-09-07T12:06:49.453 回答
1

GitHub Actions 本身不支持***NO_CI***,而是依靠您使用预定义的secrets.GITHUB_TOKEN上下文值推送到存储库。如果使用此令牌,GitHub Actions 将对此令牌进行特殊处理,并且不会发出任何新的工作流运行。但是当使用此令牌进行推送时,他们也不会部署 GitHub Pages。

我发现为了同时获得这种行为(工作流推送到存储库不会导致另一个工作流运行 + GitHub Pages 是从推送到存储库的工作流运行工件构建的),有必要结合两件事:

  • 用于secrets.GITHUB_TOKEN推送到存储库
  • 使用具有repo_public(或repo私有)范围的自定义 PAT,该范围放置在存储库设置的 Secrets 选项卡中,并使用secrets.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 回答
1

这是***NO_CI***和的解决方法[skip ci]

name: github pages

on:
  push:
    branches:
      - master  # Set a branch name to trigger deployment

jobs:
  skipci:
    runs-on: ubuntu-18.04
    steps:
      - run: echo "[skip ci] ${{ contains(github.event.head_commit.message, '[skip ci]') }}"

  deploy:
    runs-on: ubuntu-18.04
    if: contains(github.event.head_commit.message, '[skip ci]') == false
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: true  # Fetch Hugo themes (true OR recursive)
          fetch-depth: 0    # Fetch all history for .GitInfo and .Lastmod

      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
          hugo-version: '0.76.3'

      - name: Build
        run: hugo --minify

      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./public

部署作业跳过了提交消息update [skip ci]日志:https ://i.stack.imgur.com/3rVFG.png

于 2020-10-12T05:18:06.173 回答