我正在使用Github Actions构建Docker镜像,想要对镜像打上分支名称的标签。
我找到了GITHUB_REF
变量,但它返回refs/heads/feature-branch-1
,而我只需要feature-branch-1
。
我正在使用Github Actions构建Docker镜像,想要对镜像打上分支名称的标签。
我找到了GITHUB_REF
变量,但它返回refs/heads/feature-branch-1
,而我只需要feature-branch-1
。
获取当前分支很简单,如果事件是由推送触发的,则以下代码有效。
github.ref_name
是一个预定义变量,用于获取分支名称。
jobs:
main-branch-build:
if: github.ref_name == 'main'
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v3
feature-branch-build:
if: github.ref_name != 'main'
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v3
有一个非常简单的git命令可以获取当前分支:
git rev-parse --abbrev-ref HEAD
要将输出放在环境文件变量中,只需执行以下操作:
- name: 设置CURRENT_BRANCH run: echo "CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV
要从环境变量获取输出:
- name: 获取CURRENT_BRANCH run: echo ${{ env.CURRENT_BRANCH}}
来源:https://www.techiedelight.com/determine-current-branch-name-git/
为了更好地展示其他人在先前回复中作为简单评论所写的内容,这里再次重申:
https://docs.github.com/en/actions/learn-github-actions/environment-variables
此环境变量仅用于拉取请求,暴露了分支名称:GITHUB_HEAD_REF 仅设置拉取请求事件。头分支的名称。
在GitHub操作中,相应的上下文键是:
github.head_ref
env:
PR_NUMBER: ${{ github.event.number }}
BRANCH_NAME: ${{ github.event.pull_request.head.ref }}
UPDATED_AT: ${{ github.event.pull_request.updated_at }}
sed
。on:
delete:
...
steps:
- name: Do something
shell: bash
run: |
refname=$(sed -e s:refs/heads/::g -e s:/:-:g <<< ${{ github.event.ref }})
删除 refs/heads/ 并将斜杠转换为破折号,例如:refs/heads/feature/somefeature
转换为 feature-somefeature
我曾多次为在 PR 同步事件和推送到主分支时运行的事件(例如构建已标记的容器映像)而执行此操作,但我并不特别喜欢:
/
分隔的分支,例如 fix/123
。我想添加一个小的 bash
片段,它将在 push 和 pull_request 事件上工作,因为我在这里没有看到一个:
echo "${GITHUB_REF_NAME}" | grep -P '[0-9]+/merge' &> /dev/null && export ref="${GITHUB_HEAD_REF}" || export ref="${GITHUB_REF_NAME}"
在推送和拉取请求事件中,$ref
变量将保存分支名称,并处理 gitflow/style/branches
。
这是基于 GitHub Actions 通常会为 PR 同步运行的操作创建一个(通常意料之外的){pr number}/merge
分支的假设。当分支名称与(Perl 风格的)正则表达式匹配并且按照 &&
路径导出 ref
作为 GITHUB_HEAD_REF
的值时,grep
调用只会返回 0
。或者对于不匹配正则表达式的分支(例如 main
)。
grep
上的输出重定向只是防止正则表达式匹配打印到标准输出。
当你需要在与正则表达式匹配的分支上进行推送事件时,这自然不起作用。
if: github.ref == 'refs/heads/integration' && github.event_name == 'push'
您可以使用上述命令并替换您想运行的分支或事件。
$GITHUB_REF
设置环境变量,如果不存在则默认为dev
。export GIT_BRANCH=$(echo ${GITHUB_REF:-dev} | sed s/.*\\///g)
nodejs
或python
编写,该脚本从workflow.yaml
中调用。该脚本通常负责获取正确的分支引用等工作。prepare-deployment.js
脚本中-const VALID_REF_PREFIX = 'refs/heads/';
...
function getBranchRef(isProd = false) {
let branchRef = 'origin/master';
if (isProd) {
return branchRef;
}
/**
* When the workflow is invoked from manual flow, the branch name
* is in GITHUB_REF, otherwise, we have to look into GITHUB_BASE_REF
*/
if (GITHUB_REF.startsWith(VALID_REF_PREFIX)) {
// coming from a manual workflow trigger
branchName = `origin/${GITHUB_REF.replace(VALID_REF_PREFIX, '')}`;
} else {
// coming from a PR
branchRef = `origin/${GITHUB_HEAD_REF}`;
}
return branchRef;
}
setenv
函数,并且没有使用任何外部库。 - michielbdejong${{ github.ref_name }}
对我有效。 - Neil McGuigan