我正在尝试将代码从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
。
我有什么选择可以实现这一目标吗?
答案 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"
使用!
时也不要忘记将句子用引号引起来。
答案 1 :(得分:1)
检查GitHub Actions for GitHub Pages
中是否存在替代方法例如:peaceiris/actions-gh-pages
,其中添加了ACTIONS_DEPLOY_KEY
SSH密钥并用于该工作流程。
请记住添加适当的 filter action 作为对此操作的依赖,以避免从所有分支进行部署,并避免在部署本身会触发另一次运行的“无限循环”中。< / p>
在我上面提到的工作流程中(在this commit或this one中使用了此类过滤器。
答案 2 :(得分:1)
GitHub动作本身不支持***NO_CI***
,而是依靠您使用预定义的secrets.GITHUB_TOKEN
上下文值来推送到存储库。如果使用此令牌,则GitHub Actions将对此令牌进行特殊处理,并且不会发出任何新的工作流运行。但是当使用此令牌进行推送时,他们也不会部署GitHub Pages。
我发现,要实现这两种行为(将工作流程推送到存储库不会导致另一个工作流程运行+从推送到存储库的工作流程运行工件构建GitHub Pages),有必要结合以下两点: / p>
secrets.GITHUB_TOKEN
推送到存储库repo_public
(或repo
用于私有)作用域放置在存储库设置的“秘密”选项卡中,并使用secrets.GITHUB_PAGES_PAT
进行访问示例.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