#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».
Комментарии:
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}}