我正在使用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 Action FranzDiebold/github-env-vars-action可公开几个有用的环境变量,如当前分支名称和其slug值。我正是为这种情况而制作了此操作。
steps:
- uses: FranzDiebold/github-env-vars-action@v1.2.0
- name: Print environment variables
run: |
echo "GITHUB_REPOSITORY_SLUG=$GITHUB_REPOSITORY_SLUG"
echo "GITHUB_REPOSITORY_OWNER=$GITHUB_REPOSITORY_OWNER"
echo "GITHUB_REPOSITORY_OWNER_SLUG=$GITHUB_REPOSITORY_OWNER_SLUG"
echo "GITHUB_REPOSITORY_NAME=$GITHUB_REPOSITORY_NAME"
echo "GITHUB_REPOSITORY_NAME_SLUG=$GITHUB_REPOSITORY_NAME_SLUG"
echo "GITHUB_REF_SLUG=$GITHUB_REF_SLUG"
echo "GITHUB_REF_NAME=$GITHUB_REF_NAME"
echo "GITHUB_REF_NAME_SLUG=$GITHUB_REF_NAME_SLUG"
echo "GITHUB_SHA_SHORT=$GITHUB_SHA_SHORT"
仓库的演示工作流文件中也提供了适用于所有操作系统(Linux、macOS和Windows)的演示!
要将其设置为环境变量,我使用以下语法:
- name: Extract branch name
shell: bash
run: echo "::set-env name=BRANCH_NAME::$(echo ${GITHUB_REF#refs/heads/} | sed 's/\//_/g')"
- name: Test
run: echo "${BRANCH_NAME}"
我在这里发现了这个语法:Github actions - starter worflows#如何定义环境变量?#68
Rmq: sed 's/\//_/g'
是将分支名称中的/
替换为_
。
- run: echo ("::set-env name=BRANCH_NAME::" + $env:GITHUB_REF.replace('refs/heads/', ''))
。此命令的Shell应该是默认的PowerShell。 - Sal错误:无法成功处理命令'::set-env name=BRANCH_NAME::ci'。 错误:`set-env`命令已禁用。请升级到使用环境文件或通过将`ACTIONS_ALLOW_UNSECURE_COMMANDS`环境变量设置为`true`来选择不安全的命令执行。有关更多信息,请参见:https://github.blog/changelog/2020-10-01-github-actions-deprecating-set-env-and-add-path-commands/
- GuySoft这是一个适用于push
和pull_request
事件的完整工作流程。
name: whichBranch
on: [pull_request, push]
jobs:
which_branch:
runs-on: ubuntu-latest
steps:
- name: Extract branch name on push
if: github.event_name != 'pull_request'
shell: bash
run: echo "::set-env name=BRANCH_NAME::$(echo ${GITHUB_REF#refs/heads/})"
id: extract_branch
- name: Extract branch name on pull request
if: github.event_name == 'pull_request'
run: echo "::set-env name=BRANCH_NAME::$(echo ${GITHUB_HEAD_REF})"
- name: Print branch name
run: echo 'The branch name is' $BRANCH_NAME
我刚刚在 GitHub Actions 中使用一个 Bash 脚本进行了简单的测试:
#!/bin/bash
echo Reserved for REPO_NAME=${GITHUB_REPOSITORY##*/}
echo GITHUB_REF=${GITHUB_REF}
echo EXTRACT_GITHUB_REF=${GITHUB_REF##*/}
echo EXTRACT_GITHUB_REF_HEADS=$(echo ${GITHUB_REF#refs/heads/})
cd $REPO_NAME
git checkout ${GITHUB_REF##*/}
git checkout $(echo ${GITHUB_REF#refs/heads/})
这是输出的截图:
因此,
${GITHUB_REF##*/}
和$(echo ${GITHUB_REF#refs/heads/})
都是正确的。
如果你正在使用actions/checkout
的V2版本,那么你可以随时运行 git branch --show-current
来获取当前检出分支的名称。
${{github.ref}}
是获取分支名称的正确方式。
请记住${{github.ref}}
带有refs/heads/..
前缀。github.ref_name
来获取分支或标签名称,而不包括前缀。 - techpeacepull_request
和push
事件的方法。实现解决方案以保存获取的分支名称以供后续步骤使用,因为set-env
已被弃用。
不需要第三方操作。name: CI
on: [ pull_request, push ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: "Get branch name and save to env"
env:
IS_PR: ${{ github.EVENT_NAME == 'pull_request' }}
run: |
if ${IS_PR}; then
BRANCH_NAME="${GITHUB_HEAD_REF}"
else
BRANCH_NAME="${GITHUB_REF##*/}"
fi
echo "BRANCH_NAME=${BRANCH_NAME}" >> $GITHUB_ENV
- name: "Another step uses branch name"
run: echo "Branch name is ${{ env.BRANCH_NAME }}"
pull_request
事件 (此时 $GITHUB_REF
包含类似于 refs/pull/519/merge
这样没有用的字符串),您可以使用以下一行代码: - name: Set branch name
run: echo "::set-output name=branch_name::$(echo ${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}})"
对于使用Windows镜像运行操作的人,需要了解以下几点:
- run: |
...
shell: cmd
总之,您不需要浪费可能数小时的时间来尝试以破旧的cmd方式完成任务(就像我一样)。
而且,为了简单地获取当前分支的名称,您可以在将shell设置为“bash”的同时使用流行的解决方案,或者例如使用以下简单方法在默认PowerShell shell中设置一个变量:
$branchName = $Env:GITHUB_REF -replace "refs/heads/", ""
在GitHub Actions中使用分支名称
方便的操作,可用于使用当前分支名称。 使用方法
name: build
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- run: npm ci
- uses: nelonoel/branch-name@v1
# Use branch name for whatever purpose
- run: echo ${BRANCH_NAME}
setenv
函数,并且没有使用任何外部库。 - michielbdejong${{ github.ref_name }}
对我有效。 - Neil McGuigan