【问题标题】:Get the current pushed tag in Github Actions在 Github Actions 中获取当前推送的标签
【发布时间】:2020-01-30 07:58:36
【问题描述】:

有没有办法访问在 Github Action 中推送的当前标签?在 CircleCI 中,您可以使用 $CIRCLE_TAG 变量访问此值。

我的工作流程 yaml 被这样的标签触发:

on:
  push:
    tags:
      - 'v*.*.*'

我想稍后在工作流程中使用该版本号作为文件路径。

【问题讨论】:

    标签: github continuous-integration github-actions


    【解决方案1】:

    据我所知,没有标签变量。但是,它可以从包含已签出 ref 的 GITHUB_REF 中提取,例如refs/tags/v1.2.3

    试试这个工作流程。它使用提取的版本创建一个新的环境变量,您可以在以后的步骤中使用它。

    on:
      push:
        tags:
          - 'v*.*.*'
    jobs:
      test:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v2
          - name: Set env
            run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
          - name: Test
            run: |
              echo $RELEASE_VERSION
              echo ${{ env.RELEASE_VERSION }}
    

    或者,使用set-output:

    on:
      push:
        tags:
          - 'v*.*.*'
    jobs:
      test:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v2
          - name: Set output
            id: vars
            run: echo ::set-output name=tag::${GITHUB_REF#refs/*/}
          - name: Check output
            env:
              RELEASE_VERSION: ${{ steps.vars.outputs.tag }}
            run: |
              echo $RELEASE_VERSION
              echo ${{ steps.vars.outputs.tag }}
    

    【讨论】:

    • 太好了,谢谢,只有一个问题 :10 指的是什么?字符串长度?
    • 这意味着它从第 10 个位置开始提取子字符串(从 0 开始的索引)。所以它会跳过refs/tags/,只返回字符串的最后一部分。
    • 好吧,还有一个问题,抱歉,我想使用 $RELEASE_VERSION 变量为 S3 操作创建一个目标路径,如下所示:DEST_PATH: "${{ secrets.AWS_S3_BUCKET }}/$RELEASE_VERSION" 但语法不正确,有什么想法吗? (顺便说一下,这是我稍后在 yaml 中使用的第 3 方操作的 ENV)
    • 请参阅此处的文档以了解允许的表达式。 help.github.com/en/articles/…
    • 请注意,我不会使用${GITHUB_REF:10} 来过滤标签名称,而是使用参数扩展${GITHUB_REF#refs/*/}。这将按预期将/refs/tags/v1.0.1 扩展为v1.0.1,但也适用于分支名称:/refs/heads/master 将扩展为master,请参阅gnu.org/software/bash/manual/html_node/…
    【解决方案2】:

    GitHub Contexts 提供github.ref_name。你可以这样使用它:${{github.ref_name}}

    这是工件文件名中这种用法的示例,它可能类似于您询问的文件路径用法:

    - name: Create tag artifact
      uses: actions/upload-artifact@v2
      with:
        name: ${{github.ref_name}}
        path: Release
    

    【讨论】:

    • 谢谢,应该是 2021 年以后的解决方案
    • 同意,这应该是公认的答案。
    • 我认为这是正确的方法。 ${{ github.ref_name}}
    【解决方案3】:

    感谢@peterevans 的所有帮助,我设法实现了我想要的结果:

    • 标记提交
    • 推送标签触发github动作
    • github 操作将 git 标签设置为 env var
    • 运行安装和构建
    • 使用 chrislennon/action-aws-cli 操作安装 aws cli,使用密钥的秘密
    • 运行命令以使用标签 env var 作为目录名称将构建同步到新的 S3 存储桶

    这是我使用 Chris Lennon 的动作运行的示例:

    on:
      push:
        tags:
          - 'v*.*.*'
    jobs:
      test:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v1
          - name: Set env
            run: echo ::set-env name=RELEASE_VERSION::$(echo ${GITHUB_REF:10})
          - name: yarn install & build
            run: |
              yarn install
              yarn build
          - uses: chrislennon/action-aws-cli@v1.1
          - name: Publish to AWS S3
            env:
              AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
              AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
              AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}
            run: aws s3 sync dist s3://$AWS_S3_BUCKET/$RELEASE_VERSION/ --acl public-read
    

    【讨论】:

    • 这部分 ${GITHUB_REF:10} 做了什么?
    • 即使这个问题已经很老了,我还是会回答以供将来参考::10 从包含refs/tags/v1.2.3 的环境变量GITHUB_REF 中去除前十个字符,因此它产生@ 987654326@
    【解决方案4】:

    什么对我有用:

    run: echo "GIT_TAG=`echo $(git describe --tags --abbrev=0)`" >> $GITHUB_ENV
    

    【讨论】:

    • 值得注意的是,当不存在版本标签时,上述操作会失败,这可能并不适用于所有情况(其他答案提供了回退到空字符串的替代方案),但如果它不应该失败,则可能会有所帮助。
    • 当您想要为手动分派的工作流获取标签时,这是一个不错的技巧
    • 这对我不起作用,GIT_TAG 不包含标签
    【解决方案5】:

    这是一个工作流运行,显示GITHUB_REF 环境变量包含refs/tags/v0.0.2

    我通过创建标签来运行它,然后执行git push origin v0.0.2

    这是您在该日志中看到的工作流程的 sn-p:

    steps:
    - uses: actions/checkout@v1
    - name: Dump GitHub context
      env:
        GITHUB_CONTEXT: ${{ toJson(github) }}
      run: echo "$GITHUB_CONTEXT"
      if: runner.os != 'Windows'
    - name: Show GitHub ref
      run: echo "$GITHUB_REF"
      if: runner.os != 'Windows'
    - name: Dump event JSON
      env:
        EVENT_JSON_FILENAME: ${{ github.event_path }}
      run: cat "$EVENT_JSON_FILENAME"
      if: runner.os != 'Windows'
    

    由于日志已被删除,以下截图为证:

    【讨论】:

      【解决方案6】:

      你可以使用shell扩展:

      echo "${GITHUB_REF##*/}"
      

      【讨论】:

        猜你喜欢
        • 2020-01-21
        • 2021-05-25
        • 2020-12-18
        • 2020-08-20
        • 2020-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-25
        相关资源
        最近更新 更多