我正在用Github动作构建Docker图像,并想用分支名称标记图像。
我找到了GITHUB_REF变量,但它导致了refs/heads/feature-branch-1,我只需要feature-branch-1。
我正在用Github动作构建Docker图像,并想用分支名称标记图像。
我找到了GITHUB_REF变量,但它导致了refs/heads/feature-branch-1,我只需要feature-branch-1。
当前回答
通常,我总是有一个用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;
}
这涉及到以下场景-
我想从PR部署到我的开发环境的变化 我想通过手动触发器将任何分支的更改部署到我的dev env中 我想从master部署更改到我的prod环境
其他回答
我只是在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/})都是正确的
如何在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/}"
致谢:@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}}。
注:
上述方法仅适用于基于unix的映像(Linux和macOS)。 对于文档,请阅读:GitHub Actions的上下文和表达式语法。
在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}
我做了一个获取分支名称的操作,而不管是否触发pull_request。https://github.com/EthanSK/git-branch-name-action
我不得不这样做了几次不同的事件,在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事件,那么这将不起作用。