Как выполнять манипуляции со строками при объявлении переменных env в действиях GitHub
У меня есть репозиторий github, подобный следующему
johndoe/ привет-мир
Я пытаюсь установить следующие переменные среды в действиях github
env:
DOCKER_HUB_USERID: ${{ github.actor }}
REPOSITORY_NAME: ${GITHUB_REPOSITORY#*\/}
IMAGE_NAME_CLIENT: "$REPOSITORY_NAME-client"
IMAGE_NAME_SERVER: "$REPOSITORY_NAME-server"
Мои ожидаемые результаты для этих переменных:
johndoe
hello-world
hello-world-client
hello-world-server
Но я получаю
johndoe
${REPOSITORY_NAME#*\/}
$REPOSITORY_NAME-client
$REPOSITORY_NAME-server
Похоже, выражения не оцениваются при объявлении env
вары.
Как я могу добиться ожидаемого поведения?
4 ответа
Расширение параметров оболочки невозможно за пределами run
шаг.
env:
REPOSITORY_NAME: ${GITHUB_REPOSITORY#*\/}
Создайте дополнительный шаг для вычисления значения в новой переменной.
- name: Set env
run: echo ::set-env name=REPOSITORY_NAME::${GITHUB_REPOSITORY#*\/}
- name: Test
run: echo $REPOSITORY_NAME
Или создайте пошаговый вывод.
- name: Set outputs
id: vars
run: echo ::set-output name=repo_name::${GITHUB_REPOSITORY#*\/}
- name: Test set output
run: echo ${{ steps.vars.outputs.repo_name }}
После того, как вычисленная переменная среды REPOSITORY_NAME
, или пошаговый вывод steps.vars.outputs.repo_name
, существует, их можно использовать для установки других подобных переменных.
env:
IMAGE_NAME_CLIENT: ${{ env.REPOSITORY_NAME }}-server
IMAGE_NAME_SERVER: ${{ steps.vars.outputs.repo_name }}-server
Github изменил способ установки переменных среды из соображений безопасности, нет необходимости использовать этот способ.
steps:
- name: Set the environment variable
run: echo REPOSITORY_NAME=${GITHUB_REPOSITORY#*\/} >> $GITHUB_ENV
- name: Use the value
run: echo $REPOSITORY_NAME # This will output repository name
Новинка этого месяца, все еще в стадии разработки.
https://github.blog/changelog/2020-10-01-github-actions-deprecating-set-env-and-add-path-commands/
echo "action_state=yellow" >> $GITHUB_ENV
Я также обнаружил, что такие вещи, как uses:with:ref, не будут использовать расширение ${action_state}, но они будут принимать расширение ${{ env.action_state }} после заполнения.