Динамическое получение секретных действий GitHub - PullRequest
1 голос
/ 16 апреля 2020

Я пытаюсь динамически извлечь секрет GitHub с помощью GitHub Actions во время выполнения:

Допустим, у меня есть два секрета GitHub:

  1. SECRET_ORANGES: «Это оранжевый secret "
  2. SECRET_APPLES:" Это секрет Apple "

В моем GitHub Action у меня есть другая переменная env, которая будет отличаться между ветвями

env:
  FRUIT_NAME: APPLES

По сути, я хочу найти способ сделать некоторую подстановку переменных, чтобы получить правильный секрет. Поэтому на одном из моих детских заданий я хочу сделать что-то вроде:

env:
  FRUIT_SECRET: {{ 'SECRET_' + env.FRUIT_NAME }}

Я безуспешно пробовал следующие подходы:

secrets['SECRET_$FRUIT_NAME'] }}

Я даже попробовал более простой подход без конкатенации просто попытаться заставить его работать

secrets['$FRUIT_NAME'] }}

и

{{ secrets.$FRUIT_NAME }}

Ничего из вышеперечисленного не сработало.

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

У кого-нибудь есть идеи, как этого добиться?

В качестве альтернативы я пытаюсь хранить секреты в каждой ветке. основа

Например:

В customer1 кодовая ветвь: SECRET_CREDENTIAL="abc123"

В customer2 кодовая ветвь: SECRET_CREDENTIAL="def456"

Тогда я может получить правильное значение для SECRET_CREDENTIAL в зависимости от того, в какой ветке я нахожусь.

Спасибо!

Обновление: я немного ближе к тому, чего пытаюсь достичь:

name: Test

env:
  CUSTOMER: CUSTOMER1

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      AWS_ACCESS_KEY_ID: ${{ env.CUSTOMER }}_AWS_ACCESS_KEY_ID
    steps:
    - uses: actions/checkout@v2
    - run: |
        AWS_ACCESS_KEY_ID=${{ secrets[env.AWS_ACCESS_KEY_ID] }}
        echo "AWS_ACCESS_KEY_ID = $AWS_ACCESS_KEY_ID"

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Прочитав это - Контекст и синтаксис выражений для действий GitHub , сосредоточившись на объекте env , я обнаружил, что:

Как часть В выражении вы можете получить доступ к контекстной информации, используя один из двух синтаксисов.

Синтаксис индекса: github ['sha']

Синтаксис разыменования свойства: github.sha

То же самое относится и к secrets, вы можете сделать secrets[secret_name], поэтому вы можете сделать следующее

    - name: Run a multi-line script
      env:
        SECRET_NAME: A_FRUIT_NAME
      run: |
        echo "SECRET_NAME = $SECRET_NAME"
        echo "SECRET_NAME = ${{ env.SECRET_NAME }}"
        SECRET_VALUE=${{ secrets[env.SECRET_NAME] }}
        echo "SECRET_VALUE = $SECRET_VALUE"

, что приведет к

SECRET_NAME = A_FRUIT_NAME
SECRET_NAME = A_FRUIT_NAME
SECRET_VALUE = ***

, поскольку SECRET_VALUE отредактировано, мы можем предположить, что настоящая тайна была извлечена.

Вещи, которые я узнал -

  1. Вы не можете ссылаться на env от другого env, так что это не будет работать

    env:
      SECRET_PREFIX: A
      SECRET_NAME: ${{ env.SECRET_PREFIX }}_FRUIT_NAME
    

    Результат SECRET_NAME равен _FRUIT_NAME, не очень хорошо

  2. Вы можете использовать выражения контекста в своем коде, не только в env, вы можете видеть это в SECRET_VALUE=${{ secrets[env.SECRET_NAME] }}, что круто

И конечно - вот рабочий процесс, который я протестировал - https://github.com/unfor19/gha-play/runs/595345435?check_suite_focus=true - проверьте шаг Run a multi-line script

0 голосов
/ 17 апреля 2020

Мне удалось добиться этого, используя имя рабочего процесса в качестве переменной c для ветви.

Для каждой создаваемой ветви я просто обновляю это единственное значение в верхней части файла YML, затем добавляю GitHub Secrets для соответствия имени рабочего процесса:

name: CUSTOMER1

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      AWS_ACCESS_KEY_ID: ${{ github.workflow }}_AWS_ACCESS_KEY_ID
    steps:
    - uses: actions/checkout@v2
    - run: echo "::set-env name=AWS_ACCESS_KEY_ID::${{ secrets[env.AWS_ACCESS_KEY_ID] }}"
    - run: echo $AWS_ACCESS_KEY_ID

...