有没有智能的方法来确定 GitHub Actions 中的默认分支?
现在我需要写类似这样的内容:
on:
push:
branches:
- master
有没有一种方法可以编写类似下面的代码?
on:
push:
branches:
- $default-branch
我尝试使用谷歌搜索,但没有找到任何相关内容。
有没有智能的方法来确定 GitHub Actions 中的默认分支?
现在我需要写类似这样的内容:
on:
push:
branches:
- master
有没有一种方法可以编写类似下面的代码?
on:
push:
branches:
- $default-branch
我尝试使用谷歌搜索,但没有找到任何相关内容。
${{ github.event.repository.default_branch }}
always()
是有副作用的:如果没有调用always()
,即使其他条件为真,我的工作也会被跳过。 if: ${{ always() && format('refs/heads/{0}', github.event.repository.default_branch) == github.ref }}
$default-branch
可以在工作流模板中使用,但不能在工作流中使用。该分支将在初始化时硬编码到工作流中,并需要手动维护。相关博客文章:https://github.blog/changelog/2020-07-22-github-actions-better-support-for-alternative-default-branch-names/。 [1]- if: github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
run: echo "On the default branch"
- if: github.ref != format('refs/heads/{0}', github.event.repository.default_branch)
run: echo "Not on the default branch"
编辑2023年
正如Elijah在评论中指出的那样,现在有一个新的ref_name
字段可用。简化如下:
- if: github.ref_name == github.event.repository.default_branch
run: echo "On the default branch"
- if: github.ref != github.event.repository.default_branch
run: echo "Not on the default branch"
github.ref_name == github.event.repository.default_branch
来避免格式字符串。 - undefined可以根据默认分支有条件地运行作业:
jobs:
job-one:
if: github.ref_name == github.event.repository.default_branch
...
jobs:
job-one:
steps:
- name: step one
if: github.ref_name == github.event.repository.default_branch
...
您可以在模板中使用$default-branch
,当该模板被渲染到新存储库中时,它将被替换为存储库的默认分支名称(当时),但这是一个非常有限的用例,并且仍然无法帮助您当默认分支的名称更改时。我想到的最好方法是列出组织中所有默认分支的名称,如下所示:
on:
push:
branches:
- master
- main
- root
- default
- production
然后您可以选择相信仓库不会有那些名称的非默认分支,或者启动作业并通过添加if
条件进行过滤。
if: github.event.push.ref == format('refs/heads/{}', github.event.repository.default_branch)
For most events
${{ github.event.repository.default_branch }}
这段代码在正常运行时没有问题,但是通过计划事件运行时会出现问题。当github.event_name == "schedule"
时,github.event
中唯一的元素是计划事件(触发运行的字符串)。
在GitHub操作中,在可用的GitHub运行器上运行时,以下代码更可靠地获取默认分支名称:
gh repo view --json defaultBranchRef --jq .defaultBranchRef.name
github.event.push.ref
是 ""。我使用了 if: github.ref_name == github.event.repository.default_branch
代替。 - undefinedgithub.event.push.ref
只在push
事件上起作用,这正是OP所询问的内容。 - undefined - name: Determine default branch
run: |
DEFAULT_BRANCH=$(git remote show origin | awk '/HEAD branch/ {print $NF}')
echo "default_branch=$DEFAULT_BRANCH" >> $GITHUB_ENV
echo "default_branch_ref=refs/heads/$DEFAULT_BRANCH" >> $GITHUB_ENV
这将在env
环境变量中添加一个default_branch
和default_branch_ref
变量。然后您可以在后续步骤中使用${{ env.default_branch }}
访问默认分支名称。 default_branch_ref
变量可用于直接与github.ref
进行比较,以确定是否位于默认分支。
该方法使用当前设置环境变量以供稍后使用的方法[1]和JoeLinux确定默认分支名称的方法[2]。
完整的工作流示例:
name: ci
on: [push, pull_request]
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Determine default branch
run: |
DEFAULT_BRANCH=$(git remote show origin | awk '/HEAD branch/ {print $NF}')
echo "default_branch=$DEFAULT_BRANCH" >> $GITHUB_ENV
echo "default_branch_ref=refs/heads/$DEFAULT_BRANCH" >> $GITHUB_ENV
- name: debug
run: echo ${{ env.default_branch }}
- name: Deploy
if: github.ref == env.default_branch_ref
run: echo "Run!"
尽管这在问题的具体代码中不起作用,但它确实涵盖了标题和主要问题的写作。
您可以做的更简单的事情就是指定一个环境变量:
env:
DEFAULT_BRANCH: refs/heads/${{ github.event.repository.default_branch }}
- name: Extract default branch name
shell: bash
run: |
owner="my-org"
repo="repo_x"
branch=$(curl -L -H 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' \
https://api.github.com/repos/${owner}/${repo} \
| jq .default_branch)
echo "##[set-output name=default_branch;]$(echo ${branch})"
id: repo_x
...
${{ steps.repo_x.outputs.default_branch }}
always()
而运行。只需要if: github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
即可。 - Gusif: github.ref == github.event.repository.default_branch
- undefinedgithub.event.ref_name == github.event.repository.default_branch
- undefined