Действие GitHub — определение переменной среды уровня рабочего процесса между заданиями

#github-actions

#github-действия

Вопрос:

Я хотел бы определить и установить переменную среды между заданиями внутри моего рабочего процесса Github Actions. Приведенный ниже рабочий процесс — это то, что я пробовал, но, к сожалению, переменные среды GIT_PR_SHA_SHORT и E2E_GIT_PR_SHA не работают.

Возможно ли это?

 name: Git Pull Request Workflow

on:
  workflow_dispatch:
  pull_request:
    branches:
      - master

env:
  GIT_PR_SHA: ${{github.event.pull_request.head.sha}}
  GIT_PR_SHA_SHORT: "${{ env.GIT_PR_SHA:0:10 }}"
  ENV_NAME: test
  E2E_GIT_PR_SHA: "${{ env.ENV_NAME }}-${{ env.GIT_PR_SHA_SHORT }}"

jobs:
  first-job:
    name: Build Docker Image
    runs-on: ubuntu-latest

    steps:
    - name: First Echo Step
      run: |
            echo "GIT_PR_SHA_SHORT = ${GIT_PR_SHA_SHORT}"
            echo "E2E_GIT_PR_SHA = ${E2E_GIT_PR_SHA}"

  second-job:
    name: Build Docker Image
    runs-on: ubuntu-latest

    steps:
    - name: Second Echo Step
      run: |
            echo "GIT_PR_SHA_SHORT = ${GIT_PR_SHA_SHORT}"
            echo "E2E_GIT_PR_SHA = ${E2E_GIT_PR_SHA}"
  

Ответ №1:

Вы ссылаетесь на переменные среды рабочего процесса с помощью ${{ env.VARIABLE_NAME }} not ${VARIABLE_NAME} . Последнее является синтаксисом bash, но это не переменные среды оболочки, это переменные среды рабочего процесса. Они являются частью выполнения рабочего процесса, а не частью контекста командной строки.

Для ссылки на переменную среды рабочего процесса:

 name: Git Pull Request Workflow

on:
  workflow_dispatch:
  pull_request:
    branches:
      - master

env:
  one: 1
  two: zwei
  three: tres

jobs:
  first-job:
    runs-on: ubuntu-latest
    steps:
    - run: |
        echo "${{ env.one }}"
        echo "${{ env.two }}"
        echo "${{ env.three }}"
  

(Мне нравится использовать lower-case для переменных среды моего рабочего процесса и UPPER_CASE для переменных среды моей оболочки, чтобы мне было более очевидно, что есть что.)

Аналогично, это не сработает:

 env:
  GIT_PR_SHA_SHORT: "${{ env.GIT_PR_SHA:0:10 }}"
  

Это смешивает синтаксис bash :0:10 с синтаксисом рабочего процесса, но переменные рабочего процесса не запускаются ни через какую оболочку. При анализе файла рабочего процесса виртуальная машина не была запущена, поэтому нет оболочки для запуска.

Если вы хотите использовать выражения bash для управления средой, вам нужно было бы создать шаг, который запускает bash для этого, и вам нужно было бы использовать синтаксис ::set-env or ::set-output .

Затем вы можете ссылаться на выходные данные a step , используя ${{ steps... }} контекст.

К сожалению, передача данных между разными заданиями сложнее, поскольку они выполняются на разных виртуальных машинах. Вам нужно будет установить переменные для всего рабочего процесса. Сначала вам нужно ::set-output сделать так, чтобы она была видна для задания, затем вы можете повысить видимость от задания до рабочего процесса.

 name: Demonstration
on:
  push:
    branches: [master]

jobs:
  first-job:
    runs-on: ubuntu-latest  
    steps:
    - id: identify
      run: |
        # use bash variable expression to get the substring
        export GIT_PR_SHA="${{ github.sha }}"
        export GIT_PR_SHA_SHORT="${GIT_PR_SHA:0:10}"

        echo "::set-output name=git_pr_sha::${GIT_PR_SHA}"
        echo "::set-output name=git_pr_sha_short::${GIT_PR_SHA_SHORT}"
    outputs:
      git_pr_sha: ${{ steps.identify.outputs.git_pr_sha }}
      git_pr_sha_short: ${{ steps.identify.outputs.git_pr_sha_short }}

  second-job:
    needs: first-job
    runs-on: ubuntu-latest
    steps:
    - run: |
        echo "${{ needs.first-job.outputs.git_pr_sha }}"
        echo "${{ needs.first-job.outputs.git_pr_sha_short }}"
  

Комментарии:

1. Первая часть этого не совсем верна. У меня нет проблем с простым использованием синтаксиса $ WORKFLOW_VAR для этих переменных окружения рабочего процесса верхнего уровня, пока это выполняется в bash / script. Однако мне приходится использовать стиль $ {{ env.VAR }} для предоставления значений для импортированного параметра step или в других ситуациях, когда его нет в скрипте bash.

2. Если я собираюсь использовать set-output как способ совместного использования переменных, что мы можем сделать, если первое задание поддерживается матрицей?

3. set-output и set-state будут удалены. Альтернативой является echo "key=value" >> $GITHUB_OUTPUT . Смотрите больше на github.blog/журнал изменений / …

Ответ №2:

Я хотел бы добавить к этому расширение, поскольку у меня были аналогичные трудности с поиском способа вычисления и установки переменных среды для многоступенчатого использования.

Ниже приведен базовый пример того, как выполнить возврат к среде github с одного шага, если требуется обработка для вычисления переменной среды для последующего использования. Вы также можете обновить существующие переменные таким же образом, а не просто создавать новые.

 name: minimal variable example

on:
  push:

env:
  MAJOR:                        "1"
  MINOR:                        "0"
  PATCH:                        "1"

jobs:
  vars-example:
    runs-on: ubuntu-latest

    steps:
      - name: only available local variable
        run: LOCAL_VERSION=${MAJOR}.${MINOR}.${PATCH}

      - name: available across multiple steps
        run: echo "GLOBAL_VERSION=${MAJOR}.${MINOR}.${PATCH}" >> $GITHUB_ENV

      - name: Vars
        run: |
          echo LOCAL_VERSION = $LOCAL_VERSION
          echo GLOBAL_VERSION = $GLOBAL_VERSION
  

что приводит к выводу Vars

   echo LOCAL_VERSION = $LOCAL_VERSION
  echo GLOBAL_VERSION = $GLOBAL_VERSION
  shell: /usr/bin/bash -e {0}
  env:
    MAJOR: 1
    MINOR: 0
    PATCH: 1
    GLOBAL_VERSION: 1.0.1
LOCAL_VERSION =
GLOBAL_VERSION = 1.0.1
  

Комментарии:

1. И потому, что я только что снова столкнулся с этим. Вот ссылка на объяснение github. docs.github.com/en/actions/reference /…

Ответ №3:

Вы не можете использовать env в выражении под env элементом. Я не вижу другого способа, кроме использования повторяющихся значений вместо выражения.

env Контекстный синтаксис позволяет использовать значение переменной среды в вашем файле рабочего процесса. Вы можете использовать env контекст в значении любого ключа на шаге, за исключением ключей id и uses . Для получения дополнительной информации о синтаксисе шага см. «Синтаксис рабочего процесса для действий GitHub».

https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#env-context

Комментарии:

1. Извините, если я недостаточно ясно выразился, позвольте мне перефразировать мой вопрос. Как я могу установить обе переменные среды GIT_PR_SHA_SHORT (10 первых цифр GIT SHA) и E2E_GIT_PR_SHA (объединение предыдущих envs ENV_NAME и GIT_PR_SHA_SHORT) и сделать их доступными для каждого шага и задания при запуске рабочего процесса действия github. Я предпочитаю не дублировать один и тот же код (::set-env) несколько раз для каждого шага и задания в рабочем процессе.

Ответ №4:

Ниже приведен более новый способ совместного использования переменных между заданиями после удаления

  • Мы также рассмотрели сценарий, когда value сама по себе является переменной и должна быть вычислена во время выполнения.
  • При отправке master ветви будет вызвано следующее
 name: Sharing envs across jobs

on:
  push:
    branches: ['master']

env:
  one: onevalue
  two: twovalue
  three: threevalue

jobs:
  job0:
    runs-on: ubuntu-latest
    steps:
      - run: |
          echo "${{ env.one }}"
          echo "${{ env.two }}"
          echo "${{ env.three }}"

  job1:
    runs-on: ubuntu-latest
    # Map a step output to a job output
    outputs:
      output1: ${{ steps.step1.outputs.test }}
      output2: ${{ steps.step2.outputs.test }}
    steps:
      - id: step1
        run: echo "test=$(date  "%d-%m-%Y")-asdfads223" >> $GITHUB_OUTPUT
      - id: step2
        run: echo "test=world" >> $GITHUB_OUTPUT
  job2:
    runs-on: ubuntu-latest
    needs: job1
    steps:
      - run: echo ${{needs.job1.outputs.output1}} ${{needs.job1.outputs.output2}}