Holen Sie sich das aktuelle Push-Tag in Github-Aktionen

13

Gibt es eine Möglichkeit, auf das aktuelle Tag zuzugreifen, das in einer Github-Aktion gepusht wurde? In CircleCI können Sie mit dem auf diesen Wert zugreifen$CIRCLE_TAG Variablen .

Mein Workflow-Yaml wird durch ein Tag wie das folgende ausgelöst:

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

Und ich möchte diese Versionsnummer später im Workflow als Dateipfad verwenden.

Ich habe meine endgültige Lösung basierend auf der ausgewählten Antwort als weitere Antwort unten angegeben: https://stackoverflow.com/a/58195087/756514

Jon B.
quelle

Antworten:

22

Soweit ich weiß, gibt es keine Tag-Variable. Es kann jedoch extrahiert werden, aus GITHUB_REFder die ausgecheckte Referenz enthält, zrefs/tags/v1.2.3

Probieren Sie diesen Workflow aus. Es wird eine neue Umgebungsvariable mit der extrahierten Version erstellt, die Sie in späteren Schritten verwenden können.

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::${GITHUB_REF:10}
      - name: Test
        run: |
          echo $RELEASE_VERSION
          echo ${{ env.RELEASE_VERSION }}

Alternativ können Sie Folgendes verwenden set-output:

on:
  push:
    tags:
      - 'v*.*.*'
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Set output
        id: vars
        run: echo ::set-output name=tag::${GITHUB_REF:10}
      - name: Check output
        env:
          RELEASE_VERSION: ${{ steps.vars.outputs.tag }}
        run: |
          echo $RELEASE_VERSION
          echo ${{ steps.vars.outputs.tag }}
Peterevans
quelle
1
Das ist perfekt, danke, nur eine Frage, worauf bezieht sich die: 10? String-Länge?
Jon B
2
Dies bedeutet, dass der Teilstring ab der 10. Position extrahiert wird (0-basierte Indizierung). Es wird also übersprungen refs/tags/und nur der letzte Teil der Zeichenfolge zurückgegeben.
Peterevans
Ok, noch eine Frage, sorry, ich möchte diese Variable $ RELEASE_VERSION verwenden, um einen Zielpfad für eine S3-Aktion wie die folgende zu erstellen: DEST_PATH: "${{ secrets.AWS_S3_BUCKET }}/$RELEASE_VERSION"Aber kann die Syntax nicht korrekt sein, irgendwelche Ideen? (Dies ist in einer ENV für eine Aktion eines Drittanbieters, die ich übrigens später im Yaml verwende)
Jon B
1
In der Dokumentation finden Sie, welche Ausdrücke zulässig sind. help.github.com/de/articles/…
peterevans
4
Beachten Sie, dass ${GITHUB_REF:10}ich anstelle der Filterung des Namens des Tags die Parametererweiterung verwenden würde ${GITHUB_REF#refs/*/}. Das würde erweitern , /refs/tags/v1.0.1um v1.0.1wie erwartet, sondern würde auch die Arbeit mit Zweig Namen: /refs/heads/masterwürden erweitert master, siehe gnu.org/software/bash/manual/html_node/...
Stefan Haberl
2

Hier ist ein Workflow-Lauf, der zeigt, dass die GITHUB_REFUmgebungsvariable Folgendes enthält refs/tags/v0.0.2:

https://github.com/rmunn/Testing/runs/242676390

Ich habe das ausgeführt, indem ich das Tag erstellt und dann getan habe git push origin v0.0.2 .

Hier ist ein Ausschnitt des Workflows, den Sie in diesem Protokoll sehen:

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'

Da dieses Protokoll irgendwann gelöscht wird (ich weiß nicht, wie lange Github-Aktionsprotokolle aufbewahrt werden, aber es ist sicherlich nicht für immer), ist hier ein Screenshot als Beweis.

Geben Sie hier die Bildbeschreibung ein

rmunn
quelle
1

Dank der Hilfe von @peterevans gelang es mir, das gewünschte Ergebnis zu erzielen:

  • ein Commit markieren
  • Drücken Sie das Tag, um die Github-Aktion auszulösen
  • Die github-Aktion legt das git-Tag als env var fest
  • Führen Sie install & build aus
  • verwenden chrislennon/action-aws-cli Aktion, um aws cli mithilfe von Geheimnissen für Schlüssel zu installieren
  • Befehl run ausführen, um den Build mit einem neuen S3-Bucket zu synchronisieren, wobei das Tag env var als Verzeichnisname verwendet wird

Hier ist ein Beispiel für das, was ich mit Chris Lennons Aktion ausgeführt habe:

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/[email protected]
      - 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
Jon B.
quelle