web-dev-qa-db-fra.com

Actions Github, comment partager une valeur calculée entre les étapes d'un job?

Existe-t-il une méthode DRY pour calculer et partager une valeur en plusieurs étapes de travail avec les actions Github?

Dans le fichier yml de workflow ci-dessous, echo $ {GITHUB_REF} | cut -d '/' -f3` - $ {GITHUB_SHA} est répété en plusieurs étapes.

name: Test, Build and Deploy
on:
  Push:
    branches:
      - master
jobs:
  build_and_Push:
    name: Build and Push
    runs-on: ubuntu-latest
    steps:
      - name: Docker Build
        uses: "actions/docker/cli@master"
        with:
          args: build . --file Dockerfile -t cflynnus/blog:`echo ${GITHUB_REF} | cut -d'/' -f3`-${GITHUB_SHA}
      - name: Docker Tag Latest
        uses: "actions/docker/cli@master"
        with:
          args: tag cflynnus/blog:`echo ${GITHUB_REF} | cut -d'/' -f3`-${GITHUB_SHA} cflynnus/blog:latest
11
Casey Flynn

set-output peut être utilisé pour définir des sorties pour les étapes. Les sorties peuvent ensuite être utilisées dans des étapes ultérieures et évaluées dans les sections d'entrée with et env.

Voici à quoi cela ressemblerait pour votre exemple.

name: Test, Build and Deploy
on:
  Push:
    branches:
      - master
jobs:
  build_and_Push:
    name: Build and Push
    runs-on: ubuntu-latest
    steps:
      - name: Set tag var
        id: vars
        run: echo ::set-output name=docker_tag::$(echo ${GITHUB_REF} | cut -d'/' -f3)-${GITHUB_SHA}
      - name: Docker Build
        uses: "actions/docker/cli@master"
        with:
          args: build . --file Dockerfile -t cflynnus/blog:${{ steps.vars.outputs.docker_tag }}
      - name: Docker Tag Latest
        uses: "actions/docker/cli@master"
        with:
          args: tag cflynnus/blog:${{ steps.vars.outputs.docker_tag }} cflynnus/blog:latest

Voici un autre exemple montrant comment définir dynamiquement plusieurs variables à utiliser par une action.

      - name: Set output variables
        id: vars
        run: |
          echo ::set-output name=pr_title::"[Test] Add report file $(date +%d-%m-%Y)"
          echo ::set-output name=pr_body::"This PR was auto-generated on $(date +%d-%m-%Y) \
            by [create-pull-request](https://github.com/peter-evans/create-pull-request)."
      - name: Create Pull Request
        uses: peter-evans/[email protected]
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PULL_REQUEST_TITLE: ${{ steps.vars.outputs.pr_title }}
          PULL_REQUEST_BODY: ${{ steps.vars.outputs.pr_body }}

Vous pouvez également utiliser set-env .

      - name: Set environment variables
        run: |
          echo ::set-env name=PR_TITLE::"[Test] Add report file $(date +%d-%m-%Y)"
          echo ::set-env name=PR_BODY::"This PR was auto-generated on $(date +%d-%m-%Y) \
            by [create-pull-request](https://github.com/peter-evans/create-pull-request)."
      - name: Create Pull Request
        uses: peter-evans/[email protected]
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PULL_REQUEST_TITLE: ${{ env.PR_TITLE }}
          PULL_REQUEST_BODY: ${{ env.PR_BODY }}

Mise à jour: Les actions du docker dans le premier exemple sont obsolètes. Veuillez consulter cette réponse pour la dernière façon de travailler avec docker dans les actions GitHub.

7
peterevans