获取 Github Actions 中当前推送的标记

有没有一种方法可以访问 Github Action 中被推送的当前标记?在 CircleCI 中,可以使用 $CIRCLE_TAG变量访问该值。

我的 Workflow yaml 被这样的标签触发:

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

我希望稍后在工作流中使用这个版本号作为文件路径。

56965 次浏览

As far as I know there is no tag variable. However, it can be extracted from GITHUB_REF which contains the checked out ref, e.g. refs/tags/v1.2.3

Try this workflow. It creates a new environment variable with the extracted version that you can use in later steps.

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 }}

Alternatively, set a step output.

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

Here's a workflow run showing that the GITHUB_REF environment variable contains refs/tags/v0.0.2:

I ran that by creating the tag, then doing git push origin v0.0.2.

Here's a snippet of the workflow you see in that log:

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'

Since the log has been deleted, here's a screenshot for evidence:

enter image description here

So thanks to all the help from @peterevans I managed to achieve the result I wanted which was:

  • to tag a commit
  • push the tag to trigger the github action
  • github action sets the git tag as an env var
  • run install & build
  • use chrislennon/action-aws-cli action to install aws cli using secrets for keys
  • run command to sync the build to a new S3 bucket using the tag env var as the dir name

Here is an example of the what I ran using Chris Lennon's action:

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

What worked for me:

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

GitHub Contexts provides github.ref_name. You can use it like this: $\{\{github.ref_name}}.

Here is an example of this use in the artifact file name, which may be similar to the file path use that you asked about:

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

You can use shell expansion:

echo "${GITHUB_REF##*/}"

Here is the 2022 answer. No need to do weird parsing

on:
push:
tags:
- '*'
jobs:
github-example-tags:
steps:
- name: GitHub Tag Name example
run: |
echo "Tag name from GITHUB_REF_NAME: $GITHUB_REF_NAME"
echo "Tag name from github.ref_name: $\{\{  github.ref_name }}"


See

https://docs.github.com/en/actions/learn-github-actions/contexts#github-context

https://docs.github.com/en/actions/learn-github-actions/environment-variables#default-environment-variables