我正在使用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_HEAD_REF
/$GITHUB_REF
¹(pr和push)中提取分支名称,并将其设置为步骤输出:
- name: Extract branch name
shell: bash
run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT
id: extract_branch
之后,我可以使用steps.<step_id>.outputs.branch
在下一步骤中使用:
- name: Push to ECR
id: ecr
uses: jwalton/gh-ecr-push@master
with:
access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
region: us-west-2
image: eng:${{ steps.extract_branch.outputs.branch }}
¹ 在 pull_request
(合并请求)时使用$GITHUB_HEAD_REF
,在 push
时使用$GITHUB_REF
。说明:
变量 | 描述 |
---|---|
GITHUB_HEAD_REF |
工作流运行中拉取请求的源分支或头引用。仅当触发工作流运行的事件为pull_request 或pull_request_target 时,此属性才会被设置。例如,feature-branch-1 。(source) |
GITHUB_REF |
触发工作流运行的分支或标签的完整引用。对于由push 触发的工作流,这是被推送的分支或标签引用。对于由pull_request 触发的工作流,这是拉取请求合并分支。对于由release 触发的工作流,这是创建的发布标签。对于其他触发器,这是触发工作流运行的分支或标签引用。仅当事件类型有可用的分支或标签时,才会设置此值。给定的引用是完整形式,即对于分支,格式为refs/heads/<branch_name> ,对于拉取请求,格式为refs/pull/<pr_number>/merge ,对于标签,格式为refs/tags/<tag_name> 。例如,refs/heads/feature-branch-1 。(source) |
关于所有默认环境变量的完整描述,以及其他内容,请参阅Learn Github Actions(存档副本)。
寻找名为 github
的 Microsoft Github Action Context?请参考 ysfaran 提供的答案 或 Dusan Plavak提供的答案。
run: echo "##[set-output name=branch;]${GITHUB_REF#refs/heads/}"
翻译:执行命令:echo "##[set-output name=branch;]${GITHUB_REF#refs/heads/}",其中${GITHUB_REF#refs/heads/}表示去掉GITHUB_REF变量值中的"refs/heads/"部分。最终输出名为branch。 - kenorbset-output
已经被弃用,因此第一步应该是- name: 提取分支名称
shell: bash
run: echo "branch=$(echo ${GITHUB_REF#refs/heads/})" >>$GITHUB_OUTPUT
id: extract_branch
然后可以在下一步中使用${{ steps.extract_branch.outputs.branch }}
。 - Ali KahootGITHUB_OUTPUT
来提供输出,您也可以设置一个环境变量。echo "GIT_BRANCH=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_ENV
- undefinedGITHUB_REF
是唯一包含分支名称的环境变量。/
(例如deploy/abc
),那么您可以从该字符串的其余部分中提取出分支名称。${GITHUB_REF##*/}
例子:
$ GITHUB_REF=refs/heads/feature-branch-1
$ echo ${GITHUB_REF##*/}
feature-branch-1
name: CI
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Git checkout
uses: actions/checkout@v1
- name: Branch name
run: echo running on branch ${GITHUB_REF##*/}
- name: Build
run: docker build -t tedmiston/tag-example:${GITHUB_REF##*/} .
Run docker build -t tedmiston/tag-example:${GITHUB_REF##*/} .
docker build -t tedmiston/tag-example:${GITHUB_REF##*/} .
shell: /bin/bash -e {0}
Sending build context to Docker daemon 146.9kB
Step 1/1 : FROM alpine
latest: Pulling from library/alpine
9d48c3bd43c5: Pulling fs layer
9d48c3bd43c5: Verifying Checksum
9d48c3bd43c5: Download complete
9d48c3bd43c5: Pull complete
Digest: sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb
Status: Downloaded newer image for alpine:latest
---> 961769676411
Successfully built 961769676411
Successfully tagged tedmiston/tag-example:master
日志:https://github.com/tedmiston/x/commit/cdcc58a908e41d3d90c39ab3bf6fef1ad2c4238a/checks#step:4:16
Run docker build -t tedmiston/tag-example:${GITHUB_REF##*/} .
docker build -t tedmiston/tag-example:${GITHUB_REF##*/} .
shell: /bin/bash -e {0}
Sending build context to Docker daemon 144.9kB
Step 1/1 : FROM alpine
latest: Pulling from library/alpine
9d48c3bd43c5: Pulling fs layer
9d48c3bd43c5: Verifying Checksum
9d48c3bd43c5: Download complete
9d48c3bd43c5: Pull complete
Digest: sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb
Status: Downloaded newer image for alpine:latest
---> 961769676411
Successfully built 961769676411
Successfully tagged tedmiston/tag-example:branch-name-test
image: eng:${{ steps.extract_branch.outputs.branch }}
吗?
我尝试过,但对我没有起作用。 - aborilovfeature/foo
,那么${GITHUB_REF##*/}
语法将不会按照您的意愿执行:它会从分支名称中剥离feature/
并返回foo
。我建议使用${GITHUB_REF#refs/heads/}
代替${GITHUB_REF##*/}
,这样refs/heads/feature/foo
将变成feature/foo
。但是,如果您的ref是一个PR,那么$GITHUB_REF
的值将不是refs/heads/branchname
,而是pull/123/merge
...但是,如果您的工作流脚本预期是一个PR,您可能已经知道了(例如,您正在触发pull_request
)。 - rmunnGITHUB_REF
变量将包含类似于refs/pull/421/merge
的内容,因此如果您尝试向该名称git push
,它很可能会失败。${{ github.head_ref }}
${GITHUB_HEAD_REF-${GITHUB_REF##*/}}
? - user319862##*/
语法是什么意思? - Boschie这适用于您可以在on
下指定的每个触发器(例如push
或pull_request
):
env:
BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
关键在于,github.head_ref
仅在工作流由 pull_request
触发并且其中包含 PR 的源分支的值时才设置。如果工作流没有由 pull_request
触发,那么只会使用 github.ref_name
,它仅包含分支名称。
来自官方 GitHub 文档的详细解释:
github.ref_name
string
触发工作流运行的分支或标签的简短 ref 名称。此值与 GitHub 上显示的分支或标签名称相匹配。例如:feature-branch-1。
github.head_ref
string
工作流运行中 PR 的 head_ref 或源分支。当触发工作流运行的事件为 pull_request 或 pull_request_target 时,才可用此属性。
BRANCH_NAME: ${{ github.base_ref || github.ref_name }}
,因为github.head_ref
返回源分支(例如'feat/to-be-merged'),而不是目标分支(例如'main')。 - undefinedBRANCH_NAME: ${{ github.base_ref || github.ref_name }}
,因为github.head_ref
返回源分支(例如'feat/to-be-merged'),而不是目标分支(例如'main')。 - rffontenelleworkflow_dispatch
触发器是什么情况? - Sumitworkflow_dispatch
触发器是什么情况? - undefined更新
GitHub 现在支持 GITHUB_REF_NAME
,它代表:“触发工作流运行的分支或标签名称”。
有关此功能的 GitHub 文档请参见https://docs.github.com/zh/actions/learn-github-actions/environment-variables#default-environment-variables
GITHUB_HEAD_REF
一样,引用;“仅在拉取请求事件中设置。 头分支的名称。” - Federico Moya${{ github.ref_name }}
。 - Dantheman91if: ${{ github.event_name == 'pull_request' }} run: echo "This is a PR for ${{ github.ref_name }}"
Unfortunately this doesn't print out the branch name :(My branch name is feature/foo
, but I get this instead: This is a PR for 438/merge
- Jeremy Jao使用setenv
已被弃用。建议使用环境文件。在 @youjin 的答案 上进行改进,同时仍允许feature/
分支(将所有/
替换为-
),我现在正在使用:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Get branch name (merge)
if: github.event_name != 'pull_request'
shell: bash
run: echo "BRANCH_NAME=$(echo ${GITHUB_REF#refs/heads/} | tr / -)" >> $GITHUB_ENV
- name: Get branch name (pull request)
if: github.event_name == 'pull_request'
shell: bash
run: echo "BRANCH_NAME=$(echo ${GITHUB_HEAD_REF} | tr / -)" >> $GITHUB_ENV
- name: Debug
run: echo ${{ env.BRANCH_NAME }}
working-directory: .
应该可以解决问题。 - lzap你可以使用 https://github.com/rlespinasse/github-slug-action
# Just add this =>
- name: Inject slug/short variables
uses: rlespinasse/github-slug-action@v3.x
# And you get this =>
- name: Print slug/short variables
run: |
echo "Slug variables"
echo " - ${{ env.GITHUB_REF_SLUG }}"
echo " - ${{ env.GITHUB_HEAD_REF_SLUG }}"
echo " - ${{ env.GITHUB_BASE_REF_SLUG }}"
echo " - ${{ env.GITHUB_REPOSITORY_SLUG }}"
# output e.g. : master feat-new-feature v1.0.0 product-1.0.0-rc.2 new-awesome-product
echo "Slug URL variables"
echo " - ${{ env.GITHUB_REF_SLUG_URL }}"
echo " - ${{ env.GITHUB_HEAD_REF_SLUG_URL }}"
echo " - ${{ env.GITHUB_BASE_REF_SLUG_URL }}"
echo " - ${{ env.GITHUB_REPOSITORY_SLUG_URL }}"
# output e.g. : master feat-new-feature v1-0-0 product-1-0-0-rc-2 new-awesome-product
echo "Short SHA variables"
echo " - ${{ env.GITHUB_SHA_SHORT }}"
# output e.g. : ffac537e
对于那些刚刚找到这个线程的人,现在可以使用 GITHUB_REF_NAME
,例如 ${{ github.ref_name }}
。 https://docs.github.com/en/actions/learn-github-actions/environment-variables#default-environment-variables
因此,如果您触发操作工作流分支为 main
,则将设置此变量为 main
。例如,如果您有多个具有 release
和 main
分支的存储库,则此功能非常有用。
如何在 Github Actions 中获取当前分支?
假设 ${{ github.ref }}
的值类似于 refs/heads/mybranch
,您可以使用以下方法提取分支名称:
steps:
- name: Prints the current branch name
run: echo "${GITHUB_BRANCH##*/}"
env:
GITHUB_BRANCH: ${{ github.ref }}
如果你的分支包含斜杠(例如feature/foo
),请使用以下语法:
steps:
- name: Prints the current branch name
run: echo "${GITHUB_REF#refs/heads/}"
致谢:@rmunn 评论
或者使用被采纳答案的方法,这里有一个更短的版本(符合lint规范):
steps:
- name: Get the current branch name
shell: bash
run: echo "::set-output name=branch::${GITHUB_REF#refs/heads/}"
id: myref
然后在其他步骤中引用 ${{ steps.myref.outputs.branch }}
。
注:
setenv
函数,并且没有使用任何外部库。 - michielbdejong${{ github.ref_name }}
对我有效。 - Neil McGuigan