web-dev-qa-db-fra.com

Comment configurer des actions GitHub pour publier un Lerna Monorepo

Je maintiens un monorepo lerna/yarn. Je suis en train de migrer le CI/CD du cercle vers la nouvelle version bêta de publication de GitHuba Actions. J'ai créé le workflow suivant:

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

Il échoue à l'étape de publication des packages avec ce message:

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.

Changer la télécommande pour utiliser HTTPS et le jeton github n'a pas aidé:

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

GITHUB_PERSONAL_ACCESS_TOKEN est un PAT transmis via des secrets.

Dans ce cas, j'ai reçu cette erreur:

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

Comment dois-je configurer le projet pour pouvoir envoyer des balises et les valider dans le référentiel à partir du CD?

10
Benny Powers

MISE À JOUR:

Cette configuration fonctionne réellement de bout en bout. Les principales caractéristiques de cette configuration sont:

  • définir la télécommande avec git remote set-url Origin https://$GITHUB_ACTOR:[email protected]/bennypowers/apollo-elementsGITHUB_ACTOR est fourni par le coureur, GITHUB_PAT est un jeton d'accès personnel Github défini dans les secrets du référentiel.
  • revérifier et tirer avec git checkout "${GITHUB_REF:11}" && git pull
  • déconnexion du fil, car lerna ne peut pas gérer le fil pour une raison quelconque.
  • en utilisant la configuration spécifique et délicate .npmrc illustrée ci-dessous, car il s'agit d'un package de portée.
  • exécutant npm whoami après avoir configuré l'authentification. Cela lancera si l'authentification est cassée lerna publish Poussera des balises pour chacun de vos packages, et peut-être aussi écrire dans les fichiers CHANGELOG.md et package.json, même s'il ne publie pas en raison d'une mauvaise authentification. L'exécution de npm whoami Ici pour vérifier que vous pouvez réellement publier avant d'exécuter lerna évite le mal de tête de restaurer manuellement l'état du dépôt.
  • en passant GITHUB_TOKEN, GH_TOKEN et 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 }}

Notez que la configuration ci-dessus supprime certaines étapes non pertinentes. Voir le workflow complet pour la version non expurgée

RÉPONSE ORIGINALE:

Avec l'aide de l'utilisateur de StackOverflow @rmunn, je suis arrivé à cette solution:

  - name: Configure CI Git User
    run: |
      git remote rm Origin
      git remote add Origin "https://$USER_NAME:[email protected]/apollo-elements/apollo-elements.git"
      git fetch
      git config --global user.email [email protected]
      git config --global user.name GitHub Actions
    env:
      USER_NAME: ${{ secrets.DEPLOYING_USER_NAME }}
      GITHUB_PAT: ${{ secrets.GITHUB_PAT }}

GITHUB_PAT Est un jeton d'accès personnel avec une portée repo, enregistré dans des secrets.

Le git fetch Est requis pour configurer les succursales locales sur la télécommande modifiée. Le jeton d'accès personnel est requis pour repousser vers le référentiel.

6
Benny Powers