Как задать и получить доступ к ответу кода python на следующем шаге в рабочем процессе github

#python #github #continuous-integration #github-actions

Вопрос:

Как задать и получить доступ к ответу кода python на переменную в рабочем процессе github. Я должен использовать токен, который генерируется из кода python на шаге Создание веб-контейнера в Auth_Header

 - name: setup python
    uses: actions/setup-python@v2
    with:
      python-version: '3.9.0'

  - name: Get Token
    run: |
      python -m pip install --upgrade pip
      pip install requests-oauthlib
      pip install Authlib
      python -c 'from authlib.integrations.requests_client import OAuth2Session;
      session = OAuth2Session("${{ env.CLIENT_ID }}", "${{ env.CLIENT_SECRET }}")
      session.fetch_token("${{ env.TOKEN_ENDPOINT }}")
      session.token["access_token"]'

  - name: Create Container Web
      #if: steps.pr-label.outputs.result == 'true'
    run: |
        AUTH_HEADER="Authorization: token $access_token"
 

до сих пор то, что я пробовал, находится ниже, но все равно это не работает

 - name: Get Token
        env:
          ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
        run: |
          python -m pip install --upgrade pip
          pip install requests-oauthlib
          pip install Authlib
          echo ::set-env name=ACCESS_TOKEN::$(python -c 'from authlib.integrations.requests_client import OAuth2Session;
          session = OAuth2Session("${{ env.CLIENT_ID }}", "${{ env.CLIENT_SECRET }}")
          session.fetch_token("${{ env.TOKEN_ENDPOINT }}")
          session.token["access_token"]')
        id: token

      - name: Create Container Web
          #if: steps.pr-label.outputs.result == 'true'
        run: |
            echo token is ${{ env.ACCESS_TOKEN }}
            AUTH_HEADER="Authorization: token ${{ env.ACCESS_TOKEN }}"
 

Ответ №1:

Вы можете задать вывод с помощью ::set-output , а затем вернуть этот вывод на следующем шаге с помощью steps.[id].outputs.ACCESS_TOKEN :

 name: Token

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Get Token
        env:
          ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
        run: |
          python -m pip install --upgrade pip
          pip install requests-oauthlib
          pip install Authlib
          echo ::set-output name=ACCESS_TOKEN::$(python 'from authlib.integrations.requests_client import OAuth2Session;
          session = OAuth2Session("${{ env.CLIENT_ID }}", "${{ env.CLIENT_SECRET }}")
          session.fetch_token("${{ env.TOKEN_ENDPOINT }}")
          print(session.token["access_token"])')
        id: token
      - name: Create Container Web
        run: |
            echo token is ${{ steps.token.outputs.ACCESS_TOKEN }}
            AUTH_HEADER="Authorization: token ${{ steps.token.outputs.ACCESS_TOKEN }}"
 

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

1. Спасибо, Бертран, это сработало как заклинание!! нужно ли мне использовать инструкцию print в конце..

2. @Tim оператор печати должен отправить значение в stdout, чтобы результатом $(…) был «токен».

3. безопасно ли использовать печать в консоли

4. @Тим, что ты подразумеваешь под безопасностью? для токена доступа ? Я бы сказал, что это так же безопасно, как echo и, но риск будет заключаться в внедрении скрипта, если он выведет какую-либо команду, например «ls», она разрешится $("ls") и т. Д… Риск такой же, как echo ${{ ..... }} и . Например, вам нужно проверить, session.token["access_token"] является ли это допустимым отформатированным маркером доступа. Смотрите этот документ о риске внедрения сценариев .