我正在用Github动作构建Docker图像,并想用分支名称标记图像。

我找到了GITHUB_REF变量,但它导致了refs/heads/feature-branch-1,我只需要feature-branch-1。


当前回答

要将其设置为环境变量,我使用以下语法:

- 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动作-启动worflows#如何定义环境变量?# 68

Rmq: sed 's/\//_/g'将用_替换分支名称中的/

其他回答

如果你使用的是V2的actions/checkout,那么你总是可以运行git branch——show-current来获取当前签出的分支的名称。

我做了一个获取分支名称的操作,而不管是否触发pull_request。https://github.com/EthanSK/git-branch-name-action

通常,我总是有一个用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 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)的演示也可以在存储库的演示工作流文件!

我不得不这样做了几次不同的事件,在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事件,那么这将不起作用。