Releases automatizados de plugins

Nesta página

Releases automatizados compilam e publicam um plugin sandboxed quando você envia uma tag de versão ou inicia um workflow do GitHub Actions manualmente. Sua conta Atmosphere continua proprietária do perfil do pacote e dos registros de release. O GitHub identifica o workflow aprovado, e o serviço de release verifica a build e grava o release por meio de uma delegação restrita. O repositório não armazena uma credencial de conta Atmosphere.

Use emdash-plugin publish para um release iniciado do seu computador. Use este guia quando o GitHub Actions deve compilar e publicar releases.

Pré-requisitos

Prepare o seguinte antes de começar:

  • Um repositório GitHub público contendo um plugin EmDash sandboxed.
  • @emdash-cms/plugin-cli instalado como dependência de desenvolvimento. Plugins criados com a CLI já o incluem.
  • Um emdash-plugin.jsonc válido com slug, publisher, license, um autor e um contato de segurança. Defina repo como a URL canônica do GitHub, ou confirme o remoto GitHub detectado durante a configuração interativa.
  • Uma versão em package.json, ou em emdash-plugin.jsonc para um plugin somente de registro.
  • A conta Atmosphere nomeada por publisher.
  • Um navegador que suporte passkeys. A aprovação de release exige verificação do usuário.

Execute a verificação do manifesto antes de configurar o workflow:

pnpm exec emdash-plugin validate

Configurar releases automatizados

  1. Entre na CLI do plugin com a conta Atmosphere proprietária do pacote.

    pnpm exec emdash-plugin login alice.example.com

    A CLI armazena esta sessão local de publicação fora do projeto. O GitHub Actions nunca a recebe.

  2. Prepare o perfil do pacote e gere o workflow a partir do diretório do plugin.

    pnpm exec emdash-plugin release setup

    O comando lê os metadados do pacote em emdash-plugin.jsonc. Se o perfil do pacote estiver ausente, oferece criá-lo. Se o perfil existir sem configurações de delegated-release, oferece adicioná-las preservando os metadados existentes do pacote.

    Em um monorepo, execute o comando dentro do pacote do plugin ou passe --dir <plugin-directory>. Se o manifesto não contiver repo, a configuração detecta o remoto GitHub origin e pré-preenche o prompt do repositório.

    A configuração pergunta quando um release precisa de aprovação:

    • When plugin permissions increase é o padrão. Um release espera aprovação quando seu acesso declarado se expande em relação ao último release.
    • For every release exige aprovação para cada versão.

    A configuração também pergunta se os releases exigem provenance verificável. Require provenance é o padrão para releases automatizados. Escolha Allow releases without provenance somente quando o mesmo perfil também precisar aceitar releases publicados diretamente de um ambiente local confiável.

    A conta Atmosphere com a qual você entrou torna-se o aprovador inicial. O perfil vincula o pacote à URL canônica do repositório GitHub e registra a política de provenance selecionada.

    Execute apenas a etapa do perfil quando um arquivo de workflow já existir:

    pnpm exec emdash-plugin profile setup

    Após publicar o perfil do pacote, este comando mostra os comandos de release manual e do GitHub Actions.

    Em um terminal não interativo, passe --yes para aceitar as políticas padrão. Passe --repository <https-url> quando nem o manifesto nem o remoto Git fornecerem o repositório, --provenance optional para permitir releases sem provenance, e --confirmation always para exigir aprovação em cada release.

  3. Revise e confirme o workflow gerado.

    O comando cria .github/workflows/emdash-release.yml. Ele não envia o arquivo e não substitui um workflow existente a menos que você passe --force.

    Se o repositório contiver .changeset/config.json, a configuração interativa oferece Follow Changesets releases. Quando o Changesets libera um pacote contendo emdash-plugin.jsonc, o workflow reutilizável do EmDash publica a mesma versão. Conecte-o ao workflow Changesets existente conforme descrito abaixo. Caso contrário, o workflow gerado é executado para tags de pacote que correspondem a <slug>@<version>. Ambas as variantes suportam execuções manuais e podem ser selecionadas explicitamente com --trigger changesets|tags|manual.

    O workflow concede a cada job apenas as permissões contents, id-token e attestations necessárias; fixa Actions de terceiros em identificadores de commit completos; executa a versão exata da CLI do plugin que gerou o arquivo; resolve cada pacote a partir do seu manifesto; constrói um bundle do plugin; cria provenance de build do GitHub para esses bytes exatos; e passa ambos os arquivos para a Action de release do EmDash.

    O workflow fica na raiz do repositório e é compartilhado por todos os pacotes de plugin desse repositório. Executar release setup a partir de um pacote aninhado ainda escreve .github/workflows/emdash-release.yml na raiz.

  4. Abra o painel do serviço de release e entre com a mesma conta Atmosphere.

    Selecione Authorize publishing. Seu provedor de conta mostra a permissão delegada exata. A concessão retida pode criar registros de release de pacote e enviar blobs de pacote ou de imagem de listagem. Ela não pode criar ou editar perfis de pacote, atualizar ou excluir releases, nem escrever em outra collection.

  5. Inicie o workflow de release.

    Com Changesets, faça o merge do pull request de versão e deixe o job de publicação concluir. A Action Changesets passa os pacotes que liberou para o workflow reutilizável do EmDash. Pacotes npm comuns são ignorados; pacotes contendo emdash-plugin.jsonc publicam a mesma versão no EmDash.

    Com o gatilho de tag de pacote, atualize a versão do pacote antes de criar a tag de versão. Os seguintes comandos iniciam um release 1.2.3:

    git tag gallery@1.2.3
    git push origin gallery@1.2.3

    Você também pode selecionar Run workflow na página GitHub Actions do repositório.

  6. Aprove cada escopo de ref do repositório na primeira execução.

    O serviço verifica que o perfil do pacote iniciador nomeia o repositório GitHub antes de criar uma solicitação de conexão. A Action escreve um link no resumo do job do GitHub e espera. Abra o link e confirme o repositório, o arquivo de workflow, a branch ou tag e o ambiente.

    Para uma execução acionada por tag, escolha All package version tags ou Only this tag. Uma execução manual solicita aprovação na primeira vez que sua branch é usada. Confirmar outro escopo de tag ou branch o adiciona à conexão do repositório sem remover escopos existentes. O serviço armazena os IDs do repositório e do proprietário do GitHub, bem como os refs e ambientes aprovados. Pacotes posteriores reutilizam esses escopos somente quando seus perfis assinados nomeiam o mesmo repositório.

    Aprovações de pacote criadas por workflows gerados mais antigos permanecem limitadas aos pacotes originais. O primeiro pacote ou ref sem correspondência solicita uma conexão de repositório; o serviço não amplia automaticamente uma aprovação de pacote existente.

  7. Aprove o release quando necessário.

    Um release que expande as permissões do plugin, ou um perfil configurado para confirmação em cada release, entra em Awaiting approval. Abra a URL de aprovação a partir da saída da Action ou do painel de releases. Cadastre uma passkey se a conta aprovadora ainda não tiver uma, revise a alteração de permissão e aprove ou rejeite o release.

    A configuração padrão da Action retorna com sucesso quando o release alcança Awaiting approval. O workflow do serviço continua aguardando a decisão do navegador e publica após a aprovação.

Conectar um workflow Changesets

O .github/workflows/emdash-release.yml gerado aceita o JSON de pacotes publicados da Action Changesets por meio de workflow_call. Adicione uma saída ao job Changesets existente e, em seguida, chame o workflow EmDash a partir de um job dependente. Substitua release e changesets quando o job ou passo existente usar outro ID.

Changesets Action v2 usa a saída published-packages. Adicione a seguinte saída de job e o chamador a um workflow que use 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 a saída do passo em camel-case publishedPackages. Use esta expressão para um workflow que use 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

Mantenha o Changesets responsável pelo pull request de versão e pela publicação do pacote. O chamador EmDash é executado somente quando o Changesets reporta published: true. Para pacotes privados somente EmDash, defina privatePackages.version e privatePackages.tag como true em .changeset/config.json. Adicione aplicações privadas não relacionadas e fixtures de teste a ignore.

Adicionar outro pacote

Prepare o perfil do pacote a partir do seu diretório de origem. O workflow raiz existente e a conexão do repositório são reutilizados:

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

Com Changesets, adicione o pacote a um changeset e faça o merge do pull request de versão. Com o gatilho de tag de pacote, atualize a versão do pacote e envie sua tag:

git tag comments@1.0.0
git push origin comments@1.0.0

O workflow resolve comments para um emdash-plugin.jsonc, verifica a versão selecionada e confirma que o perfil assinado nomeia o repositório conectado antes de aceitar uploads de artefatos. IDs de pacote duplicados e divergências de versão falham antes da attestation.

O que o serviço de release verifica

O serviço conclui estas verificações antes de gravar um release:

  1. O token OpenID Connect (OIDC) do GitHub nomeia um repositório, proprietário, workflow, ref, ambiente, commit, execução e runner hospedado no GitHub autorizados.
  2. O perfil do pacote existe, está assinado pelo publisher, contém configurações de delegated-release e nomeia o mesmo repositório GitHub canônico.
  3. O pacote e a versão solicitados correspondem ao bundle do plugin compilado.
  4. A checksum do pacote corresponde aos bytes enviados.
  5. A provenance do GitHub cobre o mesmo bundle, repositório, workflow, commit e execução.
  6. O acesso declarado do registro de release corresponde ao manifesto do bundle.
  7. O registro de versão ainda não existe.
  8. Qualquer aprovação por passkey necessária cobre o resultado exato da verificação e a revisão atual do perfil.

A Action solicita um token OIDC do GitHub novo para cada chamada ao serviço. Arquivos de bundle e provenance entram em armazenamento transitório privado somente após a autorização do workflow. O serviço envia bytes verificados de pacote e imagem para o personal data server (PDS) do publisher, cria o registro de release lá e expõe a provenance verificada por meio de uma URL imutável endereçada por checksum.

Limites de autoridade

Cada credencial tem uma função:

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.

O serviço armazena o estado do publisher e do aprovador separadamente. Entrar para ver seus releases não concede acesso de operador, e uma identidade de operador não pode aprovar um release como publisher.

Comportamento da Action

O workflow gerado usa a Action de apps/release-action. A Action aceita um bundle compilado mais provenance Sigstore bruta, ou um release-file de compatibilidade contendo fontes de artefatos HTTPS vinculadas a checksum. Não combine release-file com entradas de bundle ou provenance.

O workflow gerado padrão fornece estas entradas. Elas são mostradas aqui para que você possa revisar o arquivo gerado sem precisar inferir o que cada valor autoriza:

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.

A Action retorna estas saídas:

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.

Consulte a referência da Action para entradas opcionais, workflows com fontes URL personalizadas, controles de polling e o comportamento exato das saídas.

Solução de problemas

PACKAGE_PROFILE_REQUIRED

O perfil do pacote está ausente, não tem configurações de delegated-release, usa uma URL de repositório não canônica ou nomeia um repositório diferente do workflow do GitHub.

Execute a configuração do perfil localmente com a conta do publisher e inicie o workflow novamente:

pnpm exec emdash-plugin profile setup

Esta verificação é executada antes de o serviço aceitar uploads de bundle ou provenance.

Repositório público necessário

O GitHub usa uma raiz de confiança Sigstore privada para repositórios privados e internos. O verificador de release atualmente confia apenas em provenance pública do GitHub. Mova o workflow de release para um repositório público ou publique localmente com emdash-plugin publish.

WORKLOAD_NOT_ALLOWED

O repositório, proprietário, arquivo de workflow, ref ou ambiente do GitHub não corresponde à política de workflow aprovada. Abra o painel de releases e aprove uma nova conexão de workflow com o escopo pretendido.

PROFILE_FETCH_FAILED

O serviço não pôde verificar o perfil a partir do PDS do publisher. Tente novamente quando o provedor da conta estiver disponível. Execute emdash-plugin profile setup se o perfil foi removido ou alterado.

POLL_TIMEOUT

A Action atingiu timeout-minutes antes que a aprovação do workflow, a aprovação do release ou a publicação fossem concluídas. Verifique o estado do intent no painel de releases antes de executar novamente. Uma nova execução da mesma execução do GitHub Actions reutiliza sua chave de idempotência.

Revogar a publicação automatizada

Selecione Turn off automated publishing no painel de releases. A revogação limpa a delegação de release retida. Perfis de pacote existentes, releases, rótulos de moderação, plugins instalados e o login do painel não mudam.

Reconecte a publicação e aprove o workflow novamente antes do próximo release automatizado.

Documentação relacionada