我正在用Github动作构建Docker图像,并想用分支名称标记图像。
我找到了GITHUB_REF变量,但它导致了refs/heads/feature-branch-1,我只需要feature-branch-1。
我正在用Github动作构建Docker图像,并想用分支名称标记图像。
我找到了GITHUB_REF变量,但它导致了refs/heads/feature-branch-1,我只需要feature-branch-1。
当前回答
我不得不这样做了几次不同的事件,在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变量将保存push和pull_request事件的分支名称,并将处理gitflow/style/branches。
这是基于GH操作为运行在pr同步上的操作创建了一个(通常是意外的){pr number}/merge分支的假设,当分支名称与(perl风格)正则表达式匹配并遵循&&路径导出ref作为GITHUB_HEAD_REF的值时,grep调用只会返回0。或者,对于不匹配正则表达式的分支(如main)。
grep上的输出重定向只是防止regex匹配输出到标准输出的情况。
当然,如果您需要在匹配正则表达式的分支上使用push事件,那么这将不起作用。
其他回答
在GitHub动作上使用分支名称
使用当前分支名称的方便操作。 使用
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}
下面是一个适用于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 Action FranzDiebold/ GitHub -env- vals - 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)的演示也可以在存储库的演示工作流文件!
如果你使用的是V2的actions/checkout,那么你总是可以运行git branch——show-current来获取当前签出的分支的名称。
同时处理pull_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 }}"
GitHub动作中的运行时变量