Release automatiche dei plugin

In questa pagina

Le release automatiche compilano e pubblicano un plugin sandboxed quando invii un tag di versione o avvii manualmente un workflow di GitHub Actions. Il tuo account Atmosphere rimane proprietario del profilo del pacchetto e dei record di release. GitHub identifica il workflow approvato e il servizio di release verifica la build e scrive la release tramite una delega ristretta. Il repository non memorizza una credenziale dell’account Atmosphere.

Usa emdash-plugin publish per una release avviata dal tuo computer. Usa questa guida quando GitHub Actions deve compilare e pubblicare le release.

Prerequisiti

Prepara quanto segue prima di iniziare:

  • Un repository GitHub pubblico contenente un plugin EmDash sandboxed.
  • @emdash-cms/plugin-cli installato come dipendenza di sviluppo. I plugin creati con la CLI lo includono già.
  • Un emdash-plugin.jsonc valido con slug, publisher, license, un autore e un contatto di sicurezza. Imposta repo sull’URL GitHub canonico, oppure conferma il remote GitHub rilevato durante la configurazione interattiva.
  • Una versione in package.json, oppure in emdash-plugin.jsonc per un plugin solo di registro.
  • L’account Atmosphere indicato da publisher.
  • Un browser che supporta le passkey. L’approvazione della release richiede la verifica dell’utente.

Esegui il controllo del manifesto prima di configurare il workflow:

pnpm exec emdash-plugin validate

Configurare le release automatiche

  1. Accedi alla CLI del plugin con l’account Atmosphere proprietario del pacchetto.

    pnpm exec emdash-plugin login alice.example.com

    La CLI memorizza questa sessione di pubblicazione locale fuori dal progetto. GitHub Actions non la riceve mai.

  2. Prepara il profilo del pacchetto e genera il workflow dalla directory del plugin.

    pnpm exec emdash-plugin release setup

    Il comando legge i metadati del pacchetto da emdash-plugin.jsonc. Se manca il profilo del pacchetto, offre di crearlo. Se il profilo esiste senza impostazioni di delegated-release, offre di aggiungerle preservando i metadati esistenti del pacchetto.

    In un monorepo, esegui il comando all’interno del pacchetto del plugin oppure passa --dir <plugin-directory>. Se il manifesto non contiene repo, la configurazione rileva il remote GitHub origin e precompila il prompt del repository.

    La configurazione chiede quando una release necessita di approvazione:

    • When plugin permissions increase è l’impostazione predefinita. Una release attende l’approvazione quando il suo accesso dichiarato si amplia rispetto all’ultima release.
    • For every release richiede l’approvazione per ogni versione.

    La configurazione chiede anche se le release richiedono provenance verificabile. Require provenance è l’impostazione predefinita per le release automatiche. Scegli Allow releases without provenance solo quando lo stesso profilo deve accettare anche release pubblicate direttamente da un ambiente locale affidabile.

    L’account Atmosphere con cui hai effettuato l’accesso diventa l’approvatore iniziale. Il profilo lega il pacchetto all’URL canonico del repository GitHub e registra la policy di provenance selezionata.

    Esegui solo il passaggio del profilo quando esiste già un file di workflow:

    pnpm exec emdash-plugin profile setup

    Dopo aver pubblicato il profilo del pacchetto, questo comando mostra i comandi di release manuale e di GitHub Actions.

    In un terminale non interattivo, passa --yes per accettare le policy predefinite. Passa --repository <https-url> quando né il manifesto né il remote Git forniscono il repository, --provenance optional per consentire release senza provenance e --confirmation always per richiedere l’approvazione per ogni release.

  3. Rivedi e conferma il workflow generato.

    Il comando crea .github/workflows/emdash-release.yml. Non esegue il push del file e non sostituisce un workflow esistente a meno che tu non passi --force.

    Se il repository contiene .changeset/config.json, la configurazione interattiva offre Follow Changesets releases. Quando Changesets pubblica un pacchetto contenente emdash-plugin.jsonc, il workflow EmDash riutilizzabile pubblica la stessa versione. Collegalo al workflow Changesets esistente come descritto di seguito. Altrimenti, il workflow generato viene eseguito per i tag di pacchetto corrispondenti a <slug>@<version>. Entrambe le varianti supportano esecuzioni manuali e possono essere selezionate esplicitamente con --trigger changesets|tags|manual.

    Il workflow concede a ogni job solo i permessi contents, id-token e attestations richiesti; fissa le Action di terze parti a identificatori di commit completi; esegue la versione esatta della CLI del plugin che ha generato il file; risolve ogni pacchetto dal suo manifesto; costruisce un bundle del plugin; crea la provenance di build di GitHub per quegli esatti byte; e passa entrambi i file all’Action di release EmDash.

    Il workflow si trova nella root del repository ed è condiviso da ogni pacchetto plugin in quel repository. Eseguire release setup da un pacchetto annidato scrive comunque .github/workflows/emdash-release.yml nella root.

  4. Apri la dashboard del servizio di release e accedi con lo stesso account Atmosphere.

    Seleziona Authorize publishing. Il provider del tuo account mostra l’esatto permesso delegato. La concessione trattenuta può creare record di release del pacchetto e caricare blob di pacchetto o di immagine di listing. Non può creare o modificare profili di pacchetto, aggiornare o eliminare release, né scrivere in un’altra collection.

  5. Avvia il workflow di release.

    Con Changesets, unisci la pull request di versione e lascia completare il suo job di pubblicazione. L’Action Changesets passa i pacchetti che ha pubblicato al workflow EmDash riutilizzabile. I pacchetti npm ordinari vengono ignorati; i pacchetti contenenti emdash-plugin.jsonc pubblicano la stessa versione su EmDash.

    Con il trigger del tag di pacchetto, aggiorna la versione del pacchetto prima di creare il tag di versione. I seguenti comandi avviano una release 1.2.3:

    git tag gallery@1.2.3
    git push origin gallery@1.2.3

    Puoi anche selezionare Run workflow nella pagina GitHub Actions del repository.

  6. Approva ogni ambito di ref del repository alla prima esecuzione.

    Il servizio verifica che il profilo del pacchetto iniziato nomini il repository GitHub prima di creare una richiesta di connessione. L’Action scrive un link nel riepilogo del job di GitHub e attende. Apri il link e conferma il repository, il file di workflow, il branch o il tag e l’ambiente.

    Per un’esecuzione attivata da tag, scegli All package version tags o Only this tag. Un’esecuzione manuale richiede l’approvazione la prima volta che viene usato il suo branch. Confermare un altro ambito di tag o branch lo aggiunge alla connessione del repository senza rimuovere gli ambiti esistenti. Il servizio memorizza gli ID del repository e del proprietario GitHub nonché i ref e gli ambienti approvati. I pacchetti successivi riutilizzano questi ambiti solo quando i loro profili firmati nominano lo stesso repository.

    Le approvazioni di pacchetto create da workflow generati più vecchi restano limitate ai loro pacchetti originali. Il primo pacchetto o ref non corrispondente richiede una connessione al repository; il servizio non amplia automaticamente un’approvazione di pacchetto esistente.

  7. Approva la release quando richiesto.

    Una release che amplia i permessi del plugin, o un profilo configurato per la conferma a ogni release, passa in Awaiting approval. Apri l’URL di approvazione dall’output dell’Action o dalla dashboard delle release. Registra una passkey se l’account approvatore non ne ha già una, rivedi la modifica dei permessi e approva o rifiuta la release.

    L’impostazione predefinita dell’Action restituisce successo quando la release raggiunge Awaiting approval. Il workflow del servizio continua ad attendere la decisione del browser e pubblica dopo l’approvazione.

Collegare un workflow Changesets

Il .github/workflows/emdash-release.yml generato accetta il JSON dei pacchetti pubblicati dell’Action Changesets tramite workflow_call. Aggiungi un output al job Changesets esistente, quindi chiama il workflow EmDash da un job dipendente. Sostituisci release e changesets quando il job o lo step esistente usa un altro ID.

Changesets Action v2 usa l’output published-packages. Aggiungi il seguente output di job e il chiamante a un workflow che usa Changesets CLI v3:

jobs:
  release:
    # Keep the existing runner, permissions, and steps.
    outputs:
      published: ${{ steps.changesets.outputs.published }}
      published-packages: ${{ steps.changesets.outputs['published-packages'] }}

  publish-emdash-plugins:
    needs: release
    if: needs.release.outputs.published == 'true'
    uses: ./.github/workflows/emdash-release.yml
    with:
      published-packages: ${{ needs.release.outputs['published-packages'] }}
    permissions:
      contents: read
      id-token: write
      attestations: write

Changesets Action v1 usa l’output dello step in camel-case publishedPackages. Usa questa espressione per un workflow che usa Changesets CLI v2:

jobs:
  release:
    # Keep the existing runner, permissions, and steps.
    outputs:
      published: ${{ steps.changesets.outputs.published }}
      published-packages: ${{ steps.changesets.outputs.publishedPackages }}

  publish-emdash-plugins:
    needs: release
    if: needs.release.outputs.published == 'true'
    uses: ./.github/workflows/emdash-release.yml
    with:
      published-packages: ${{ needs.release.outputs['published-packages'] }}
    permissions:
      contents: read
      id-token: write
      attestations: write

Lascia Changesets responsabile della sua pull request di versione e della pubblicazione del pacchetto. Il chiamante EmDash viene eseguito solo quando Changesets segnala published: true. Per i pacchetti privati solo EmDash, imposta sia privatePackages.version sia privatePackages.tag su true in .changeset/config.json. Aggiungi applicazioni private non correlate e fixture di test a ignore.

Aggiungere un altro pacchetto

Prepara il profilo del pacchetto dalla sua directory di origine. Vengono riutilizzati il workflow root esistente e la connessione del repository:

pnpm exec emdash-plugin profile setup --dir packages/comments

Con Changesets, aggiungi il pacchetto a un changeset e unisci la sua pull request di versione. Con il trigger del tag di pacchetto, aggiorna la versione del pacchetto e invia il suo tag:

git tag comments@1.0.0
git push origin comments@1.0.0

Il workflow risolve comments in un emdash-plugin.jsonc, controlla la versione selezionata e verifica che il profilo firmato nomini il repository connesso prima di accettare i caricamenti degli artefatti. ID di pacchetto duplicati e discrepanze di versione falliscono prima dell’attestazione.

Cosa verifica il servizio di release

Il servizio completa questi controlli prima di scrivere una release:

  1. Il token OpenID Connect (OIDC) di GitHub nomina un repository, proprietario, workflow, ref, ambiente, commit, esecuzione e runner ospitato da GitHub autorizzati.
  2. Il profilo del pacchetto esiste, è firmato dal publisher, contiene impostazioni di delegated-release e nomina lo stesso repository GitHub canonico.
  3. Il pacchetto e la versione richiesti corrispondono al bundle del plugin compilato.
  4. Il checksum del pacchetto corrisponde ai byte caricati.
  5. La provenance di GitHub copre lo stesso bundle, repository, workflow, commit ed esecuzione.
  6. L’accesso dichiarato del record di release corrisponde al manifesto del bundle.
  7. Il record di versione non esiste ancora.
  8. Qualsiasi approvazione passkey richiesta copre l’esatto risultato di verifica e la revisione corrente del profilo.

L’Action richiede un token OIDC di GitHub fresco per ogni chiamata al servizio. I file di bundle e provenance entrano nello storage transitorio privato solo dopo che il workflow è autorizzato. Il servizio carica i byte verificati di pacchetto e immagine sul personal data server (PDS) del publisher, crea lì il record di release ed espone la provenance verificata tramite un URL immutabile indirizzato per checksum.

Confini di autorità

Ogni credenziale ha un compito:

CredentialUsed byAuthority
Local CLI OAuth sessionemdash-plugin profile setupCreate or update the publisher-owned package profile after local confirmation.
GitHub OIDC tokenRelease ActionIdentify one GitHub workflow run to the service. It grants no AT Protocol write access.
Release-service delegationRelease serviceCreate package release records and upload the required blobs.
Publisher application sessionRelease dashboardAuthorise workflow connections and revoke delegated publishing.
Approver session and passkeyApproval pageApprove or reject one checksum-bound release verification.
Cloudflare Access identityService operator consoleOperate the hosted service. It does not represent a publisher or approver.

Il servizio memorizza lo stato del publisher e dell’approvatore separatamente. Accedere per visualizzare le tue release non concede accesso da operatore, e un’identità di operatore non può approvare una release come publisher.

Comportamento dell’Action

Il workflow generato usa l’Action da apps/release-action. L’Action accetta un bundle compilato più provenance Sigstore grezza, oppure un release-file di compatibilità contenente fonti di artefatti HTTPS legate al checksum. Non combinare release-file con input di bundle o provenance.

Il workflow generato standard fornisce questi input. Sono mostrati qui così puoi rivedere il file generato senza dover inferire cosa autorizza ciascun valore:

InputValue
service-urlRelease-service HTTPS origin.
publisher-didDID that owns the package profile and releases.
bundle-fileThe single tarball produced by emdash-plugin release prepare.
provenance-fileRaw bundle-path output from actions/attest-build-provenance.

L’Action restituisce questi output:

OutputMeaning
connection-urlBrowser URL for first-run workflow approval.
intent-idRelease intent identifier.
statePublished, terminal, or awaiting_approval state.
approval-urlBrowser URL when passkey approval is required.
release-uriPublished release AT URI.
release-cidPublished release record CID.
reason-codeStable reason for a terminal intent.

Consulta il riferimento dell’Action per input opzionali, workflow con fonti URL personalizzate, controlli di polling e il comportamento esatto degli output.

Risoluzione dei problemi

PACKAGE_PROFILE_REQUIRED

Il profilo del pacchetto manca, è privo di impostazioni di delegated-release, usa un URL di repository non canonico oppure nomina un repository diverso dal workflow di GitHub.

Esegui la configurazione del profilo localmente con l’account del publisher, quindi riavvia il workflow:

pnpm exec emdash-plugin profile setup

Questo controllo viene eseguito prima che il servizio accetti i caricamenti di bundle o provenance.

Repository pubblico richiesto

GitHub usa una root di fiducia Sigstore privata per i repository privati e interni. Il verificatore delle release attualmente si fida solo della provenance pubblica di GitHub. Sposta il workflow di release in un repository pubblico oppure pubblica localmente con emdash-plugin publish.

WORKLOAD_NOT_ALLOWED

Il repository, il proprietario, il file di workflow, il ref o l’ambiente di GitHub non corrisponde alla policy del workflow approvata. Apri la dashboard delle release e approva una nuova connessione del workflow con l’ambito previsto.

PROFILE_FETCH_FAILED

Il servizio non ha potuto verificare il profilo dal PDS del publisher. Riprova quando il provider dell’account è disponibile. Esegui emdash-plugin profile setup se il profilo è stato rimosso o modificato.

POLL_TIMEOUT

L’Action ha raggiunto timeout-minutes prima che fossero completate l’approvazione del workflow, l’approvazione della release o la pubblicazione. Controlla lo stato dell’intent nella dashboard delle release prima di rieseguire. Una riesecuzione della stessa esecuzione di GitHub Actions riusa la sua chiave di idempotenza.

Revocare la pubblicazione automatica

Seleziona Turn off automated publishing nella dashboard delle release. La revoca cancella la delega di release trattenuta. I profili di pacchetto esistenti, le release, le etichette di moderazione, i plugin installati e l’accesso alla dashboard non cambiano.

Ricollega la pubblicazione e approva di nuovo il workflow prima della prossima release automatica.

Documentazione correlata