GitHub动作*** NO_CI ***替代

时间:2019-09-06 19:40:27

标签: github github-actions

我正在尝试将代码从GitHub Actions Beta(YAML版本)中运行的工作流程推入GitHub存储库。在将git push远程URL设置为包含凭据的远程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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

检查GitHub Actions for GitHub Pages

中是否存在替代方法

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

GitHub Pages Deploy仅包括:

请记住添加适当的 filter action 作为对此操作的依赖,以避免从所有分支进行部署,并避免在部署本身会触发另一次运行的“无限循环”中。< / p>

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

答案 2 :(得分:1)

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

我发现,要实现这两种行为(将工作流程推送到存储库不会导致另一个工作流程运行+从推送到存储库的工作流程运行工件构建GitHub Pages),有必要结合以下两点: / p>

  • 使用secrets.GITHUB_TOKEN推送到存储库
  • 使用自定义PAT,并将repo_public(或repo用于私有)作用域放置在存储库设置的“秘密”选项卡中,并使用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"

答案 3 :(得分: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