Как настроить действия GitHub для публикации Lerna Monorepo

Я поддерживаю монорепозиторий из лерны / пряжи. Я нахожусь в процессе переноса CI / CD из круга в новую бета-версию GitHuba Actions. Я создал следующий рабочий процесс:

name: CD

on:
  push:
    branches:
      - master

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@master

      - name: Checkout master
        run: git checkout master

      - name: Install rsync
        run: sudo apt install rsync

      - name: Install yarn
        run: |
          curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
          echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
          sudo apt-get update
          sudo apt-get install yarn

      - name: Install Packages
        run: yarn install

      - name: Test
        run: yarn test

      - name: Upload coverage results to Code Climate
        run: sh ./scripts/upload-coverage.sh
        env:
          CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}

      - name: Authenticate with Registry
        run: echo "registry=//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc
        env:
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

      - name: Configure CI Git User
        run: |
          git config --global user.email [email protected]
          git config --global user.name GitHub Actions

      - name: Publish package
        run: yarn deploy --yes
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Build Docs
        run: yarn docs

      - name: Deploy Docs
        run: |
          echo "apolloelements.dev" > docs/CNAME
          npx gh-pages --dist docs

Ошибка на этапе публикации пакетов с таким сообщением:

lerna info git Pushing tags...
lerna ERR! Error: Command failed: git push --follow-tags --no-verify origin master
lerna ERR! fatal: could not read Username for 'https://github.com': No such device or address
lerna ERR! 
lerna ERR!     at makeError (/home/runner/work/apollo-elements/apollo-elements/node_modules/execa/index.js:174:9)
lerna ERR!     at Promise.all.then.arr (/home/runner/work/apollo-elements/apollo-elements/node_modules/execa/index.js:278:16)
lerna ERR! Error: Command failed: git push --follow-tags --no-verify origin master
lerna ERR! fatal: could not read Username for 'https://github.com': No such device or address
lerna ERR! 
lerna ERR!     at makeError (/home/runner/work/apollo-elements/apollo-elements/node_modules/execa/index.js:174:9)
lerna ERR!     at Promise.all.then.arr (/home/runner/work/apollo-elements/apollo-elements/node_modules/execa/index.js:278:16)
lerna ERR! lerna Command failed: git push --follow-tags --no-verify origin master
lerna ERR! lerna fatal: could not read Username for 'https://github.com': No such device or address
lerna ERR! lerna 
error Command failed with exit code 128.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

Изменение пульта ДУ на использование HTTPS и токена github не помогло:

git remote rm origin
git remote add origin "https://$USER_NAME:[email protected]/apollo-elements/apollo-elements.git"

Где GITHUB_PERSONAL_ACCESS_TOKEN - это PAT, переданный через секреты.

В этом случае я получил эту ошибку:

lerna ERR! ENOREMOTEBRANCH Branch 'master' doesn't exist in remote 'origin'.

Как мне настроить проект, чтобы иметь возможность отправлять теги и фиксировать обратно в репозиторий с компакт-диска?


person Benny Powers    schedule 21.08.2019    source источник
comment
developer.github.com/actions/managing-workflows/storing-secrets docs говорят, что каждый репозиторий включает секрет GITHUB_TOKEN, но по умолчанию он недоступен для действия. Вы должны добавить секрет GITHUB_TOKEN к каждому действию, требующему доступа. Я не знаю, что влечет за собой добавление секрета токена к действию, поскольку я не могу найти подробностей в документации, а я еще не на бета-версии, поэтому я не могу проверить это на себе. Но если это связано с некоторыми настройками в графическом интерфейсе GitHub, убедитесь, что вы это сделали.   -  person rmunn    schedule 23.08.2019
comment
Или, возможно, так как не удалось прочитать Имя пользователя отображается в ошибке, вам просто нужно отредактировать конфигурацию Lerna, чтобы URL-адреса репо были https://USERNAME:[email protected]/yourorg/yourrepo или что-то в этом роде. Это могло быть так просто.   -  person rmunn    schedule 23.08.2019
comment
Спасибо, я отредактировал вопрос, чтобы отразить попытки, которые я предпринял в этом направлении.   -  person Benny Powers    schedule 24.08.2019
comment
Ах ... теперь мы кое-что получим. Похоже, мы подключились к репо, но мы получаем другую ошибку, вероятно, потому, что локальная копия lerna не знает, какие ветки содержит origin репо (потому что она никогда не выполняла fetch с тех пор, как вы создали пульт). Так что сделайте git fetch origin сразу после шага git remote add origin $URL, и тогда локальная копия репозитория lerna должна знать, какие ветки содержит origin репо, и должна иметь возможность нажимать на ветку origin master`.   -  person rmunn    schedule 25.08.2019


Ответы (3)


ОБНОВЛЕНО:

Эта конфигурация действительно работает от начала до конца. Ключевые особенности этой конфигурации:

  • установка удаленного с помощью git remote set-url origin https://$GITHUB_ACTOR:[email protected]/bennypowers/apollo-elements GITHUB_ACTOR предоставляется исполнителем, GITHUB_PAT - это токен личного доступа Github, установленный в секретах репозитория.
  • перепроверка и вытягивание с git checkout "${GITHUB_REF:11}" && git pull
  • выход из пряжи, поскольку lerna не может обрабатывать пряжу по какой-либо причине.
  • используя конкретную привередливую .npmrc настройку, показанную ниже, поскольку это пакет с ограниченной областью действия.
  • запущен npm whoami после настройки аутентификации. Это сработает, если аутентификация нарушена lerna publish будет отправлять теги для каждого из ваших пакетов и, возможно, также записывать в файлы CHANGELOG.md и package.json, даже если он не публикуется из-за неправильной аутентификации. Запуск npm whoami здесь, чтобы убедиться, что вы действительно можете публиковать перед запуском lerna, предотвращает головную боль, связанную с ручным восстановлением состояния репо.
  • передача GITHUB_TOKEN, GH_TOKEN и NPM_TOKEN в lerna publish
name: CD

on:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v1

      - name: Configure CI Git User
        run: |
          git config --global user.name '@bennypowers'
          git config --global user.email '[email protected]'
          git remote set-url origin https://$GITHUB_ACTOR:[email protected]/bennypowers/apollo-elements
        env:
          GITHUB_PAT: ${{ secrets.GITHUB_PAT }}

      - name: Checkout and pull branch
        run: git checkout "${GITHUB_REF:11}" && git pull

      - name: Install Packages
        run: yarn install

      - name: Authenticate with Registry
        run: |
          yarn logout
          echo "@apollo-elements:registry=http://registry.npmjs.org/" > .npmrc
          echo "registry=http://registry.npmjs.org/" >> .npmrc
          echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> .npmrc
          npm whoami
        env:
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

      - name: Publish package
        run: lerna publish --yes --message 'chore: release new versions'
        env:
          GH_TOKEN: ${{ secrets.GITHUB_PAT }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_PAT }}
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

Обратите внимание, что в приведенной выше конфигурации исправлены некоторые не относящиеся к делу шаги. См.

Где GITHUB_PAT - это личный токен доступа с repo областью действия, сохраненный в секрете.

git fetch требуется для создания локальных ответвлений на измененном пульте дистанционного управления. Токен личного доступа требуется для возврата в репозиторий.

person Benny Powers    schedule 26.08.2019
comment
Забавно, что я смотрю на ваше репо, настраиваю так же и получаю lerna ERR! ENOGIT Отдельный git HEAD, пожалуйста, проверьте ветку, чтобы выбрать версии. ' используя этот подход, мы посмотрим и отчитаемся - person csilk; 27.09.2019
comment
Закончил добавление основного шага оформления заказа после выборки, похоже, исправил его. - person csilk; 27.09.2019
comment
Вместо использования actions/checkout@v1 вы должны использовать: actions/checkout@v2 с fetch-depth: 0 и token: ${{ secrets.GITHUB_PAT}} - person JeroenKnoops; 24.06.2020
comment
Доступен ли GITHUB_PAT существующий / известный секрет во всех репозиториях Github? Когда я пытаюсь создать секрет репозитория с именем GITHUB_PAT, я получаю сообщение Не удалось добавить секрет. Недействительное имя ошибка. Я могу создать другие без выпуска. - person im1dermike; 03.03.2021
comment
@ im1dermike Секреты действий в настройках GitHub, похоже, не позволяет добавлять какие-либо секретные переменные среды с префиксом GITHUB_. Вы можете попробовать использовать существующий GITHUB_TOKEN, например GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} или попробуйте дать ему другое имя, например GITHUB_PAT: ${{ secrets.MY_GITHUB_PAT }} - person bmaupin; 10.06.2021

Основываясь на комментарии @JeroenKnoops, используя checkout@v2, можно использовать более простой подход:

name: lerna publish

on:
  push:
    branches:
      - master

jobs:
  publish:
    runs-on: ubuntu-latest
    env:
      NPM_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Read node version
        run: echo ::set-output name=nodever::$(cat .nvmrc)
        id: nvm
      - name: Setup node
        uses: actions/setup-node@v1
        with:
          node-version: '${{ steps.nvm.outputs.nodever }}'
          registry-url: https://npm.pkg.github.com/
      - name: Configure Git User
        run: |
          git config --global user.email "[email protected]"
          git config --global user.name "@$GITHUB_ACTOR"
      - run: npx lerna publish --conventional-commits --yes

Обратите внимание, что в этом примере у меня настроен .npmrc, который ссылается на переменную среды NPM_TOKEN для аутентификации:

@myco:registry=https://npm.pkg.github.com/
//npm.pkg.github.com/:always-auth=true
//npm.pkg.github.com/:_authToken=${NPM_TOKEN}
person sarumont    schedule 21.01.2021
comment
Не могли бы вы также показать npmrc? Оба ответа неполные. ???? - person Michal; 17.02.2021

Теперь можно использовать более простую конфигурацию, используя checkout@v2 и setup-node@v2

jobs:
  build:

    runs-on: ubuntu-latest
    env:
      NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
    steps:

    # 1. provide Personal Access Token for checkout@v2
    - name: Checkout
      uses: actions/checkout@v2
      with:
          submodules: recursive
          token: ${{ secrets.PUBLISH_PAT }}

    # 2. setup .npmrc it uses NODE_AUTH_TOKEN
    - name: Setup .npmrc file for publish
      uses: actions/setup-node@v2
      with:
        node-version: '12.x'
        registry-url: 'https://registry.npmjs.org'

    # 3. configure git user used to push tag
    - name: Configure Git User
      run: |
        git config --global user.email "[email protected]"
        git config --global user.name "ci@$GITHUB_ACTOR"

    - name: Install dependencies
      run: yarn install

    - name: Publish
      run: |
        lerna publish --yes

Установите секрет репозитория с помощью ниже:

NPM_TOKEN - токен NPM с publish разрешением, дополнительная информация

PUBLISH_PAT - токен личного доступа github с repo разрешением, дополнительная информация

person ktutnik    schedule 18.05.2021