如何在github操作中获取当前分支
我正在使用Github操作构建docker图像,并希望使用分支名称标记图像,如何在github操作中获取当前分支,github,github-actions,Github,Github Actions,我正在使用Github操作构建docker图像,并希望使用分支名称标记图像, 我只找到了GITHUB\u-REF变量,但它产生了refs/heads/feature-branch-1,我只需要feature-branch-1我相信GITHUB\u-REF是唯一包含分支名称的环境变量 您可以仅从该字符串的其余部分提取分支名称,如下所示: ${GITHUB_REF##*/} 例如: $ GITHUB_REF=refs/heads/feature-branch-1 $ echo ${GITHUB_R
我只找到了
GITHUB\u-REF
变量,但它产生了refs/heads/feature-branch-1
,我只需要feature-branch-1
我相信GITHUB\u-REF
是唯一包含分支名称的环境变量
您可以仅从该字符串的其余部分提取分支名称,如下所示:
${GITHUB_REF##*/}
例如:
$ GITHUB_REF=refs/heads/feature-branch-1
$ echo ${GITHUB_REF##*/}
feature-branch-1
更新:添加了完整的工作流示例。 工作流程 资料来源: 示例输出-主分支 日志: 示例输出-非主分支 日志:
有关参数扩展语法的详细信息,请参阅
作为参考,该页面列出了执行环境中可用的所有环境变量。我添加了一个单独的步骤,用于从
$GITHUB\u REF
提取分支名称,并将其设置为步骤输出
-name:提取分支名称
shell:bash
运行:echo“##[设置输出名称=分支;]$(echo${GITHUB\u REF#refs/heads/})”
id:extract_分支机构
之后,我可以在接下来的步骤中使用它
-名称:推送到ECR
身份证号码:ecr
用途:jwalton/gh ecr-push@master
与:
访问密钥id:${{secrets.AWS_access_key_id}
秘密访问密钥:${secrets.AWS\u secret\u access\u key}
地区:美国西部-2
image:eng:${{steps.extract_branch.outputs.branch}}
您可以使用
我刚刚使用bash脚本在中进行了一个简单的测试:
#/bin/bash
echo为REPO_NAME=${GITHUB_存储库##*/}保留
echo GITHUB_REF=${GITHUB_REF}
echo EXTRACT_GITHUB_REF=${GITHUB_REF##*/}
echo EXTRACT_GITHUB_REF_HEADS=$(echo${GITHUB_REF#refs/HEADS/})
cd$REPO_名称
git签出${GITHUB_REF##*/}
git checkout$(echo${GITHUB_REF#refs/heads/})
以下是输出的屏幕截图:
因此
${GITHUB#REF##*/}
和$(echo${GITHUB#REF#refs/heads/})
都是正确的要将其设置为en变量,我使用以下语法:
- 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}"
我在这里找到了以下语法:
Rmq:
sed's/\//\ug'
将分支名称中的/
替换为
,请注意,如果您正在对pull请求触发器执行GitHub操作,然后,GITHUB\u REF
变量将包含类似于refs/pull/421/merge
的内容,因此如果您尝试将git push
推送到该名称,则很可能失败
不过,您可以在YAML中使用GitHub上下文上的引用。类似于:${{github.head\u ref}}
您可以使用上述命令替换要运行的任何分支或事件
如何在Github操作中获取当前分支
假设${{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/}"
学分:
或者使用公认答案中的方法,这里有一个更简短的版本(lint-friendly):
然后在其他步骤中引用为${{steps.myref.outputs.branch}
注:
- 以上方法仅适用于基于Unix的映像(Linux和macOS)
- 对于文档,请阅读:
- 在Windows上运行?。
Windows默认命令是PowerShell终端
- name: SET CURRENT_BRANCH
run: |
$branchName = "${{github.ref}}".Split("/")["${{github.ref}}".Split("/").Length -1]
echo "::set-env name=CURRENT_BRANCH::$(echo $branchName)"
在GitHub操作上使用分支名称 使用当前分支名称的方便操作。 用法
这里有一个完整的工作流,可用于
推送
和拉取请求
事件
name: whichBranch
on: [pull_request, push]
jobs:
which_branch:
runs-on: ubuntu-latest
steps:
# extract branch name
- name: Extract branch name
if: github.event_name != 'pull_request'
shell: bash
run: echo "::set-env name=BRANCH_NAME::$(echo ${GITHUB_REF#refs/heads/})"
id: extract_branch
# extract branch name on pull request
- name: Print branch name
if: github.event_name == 'pull_request'
run: echo "::set-env name=BRANCH_NAME::$(echo ${GITHUB_HEAD_REF})"
# print branch name
- name: Get branch name
run: echo 'The branch name is' $BRANCH_NAME
GitHub操作公开了几个有用的环境变量,例如当前分支名称及其slug值。我做这个动作正是为了这个用例
用法
所有操作系统(Linux、macOS和Windows)的演示也可以在存储库的中找到 使用
setenv
is。建议使用。在@youjin的基础上,虽然仍然允许功能/
分支(将所有出现的/
替换为-
),但我现在使用的是:
作业:
建造:
运行于:ubuntu最新版本
步骤:
-名称:获取分支名称(合并)
if:github.event_name!='拉_请求'
shell:bash
运行:echo“BRANCH_NAME=$(echo${GITHUB_REF#refs/heads/}| tr/-)”>>GITHUB_ENV
-名称:获取分支名称(拉取请求)
if:github.event\u name=='pull\u请求'
shell:bash
运行:echo“BRANCH\u NAME=$(echo${GITHUB\u HEAD\u REF}}tr/-)”>>GITHUB\u ENV
-名称:调试
运行:echo${{env.BRANCH_NAME}
对于使用Windows image运行操作的用户,需要了解以下几个关键点:
$branchName=$Env:GITHUB\u REF-替换“refs/heads/”
我做了一个操作,不管是否触发pull_请求,都会获取分支名称 如果您使用的是操作/checkout
的V2,那么您总是可以运行git branch--show current
来获取当前签出的分支的名称。这里有一个片段,它基于$GITHUB\u REF
设置了一个环境变量,如果不存在,则默认为dev
根据您的要求调整sed命令
export GIT_BRANCH=$(echo${GITHUB_REF:-dev}sed s
if: github.ref == 'refs/heads/integration' && github.event_name == 'push'
steps:
- name: Prints the current branch name
run: echo "${GITHUB_BRANCH##*/}"
env:
GITHUB_BRANCH: ${{ github.ref }}
steps:
- name: Prints the current branch name
run: echo "${GITHUB_REF#refs/heads/}"
steps:
- name: Get the current branch name
shell: bash
run: echo "::set-output name=branch::${GITHUB_REF#refs/heads/}"
id: myref
- name: SET CURRENT_BRANCH
run: |
$branchName = "${{github.ref}}".Split("/")["${{github.ref}}".Split("/").Length -1]
echo "::set-env name=CURRENT_BRANCH::$(echo $branchName)"
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}
name: whichBranch
on: [pull_request, push]
jobs:
which_branch:
runs-on: ubuntu-latest
steps:
# extract branch name
- name: Extract branch name
if: github.event_name != 'pull_request'
shell: bash
run: echo "::set-env name=BRANCH_NAME::$(echo ${GITHUB_REF#refs/heads/})"
id: extract_branch
# extract branch name on pull request
- name: Print branch name
if: github.event_name == 'pull_request'
run: echo "::set-env name=BRANCH_NAME::$(echo ${GITHUB_HEAD_REF})"
# print branch name
- name: Get branch name
run: echo 'The branch name is' $BRANCH_NAME
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"
- run: |
...
shell: cmd