Pular para o conteúdo principal

Como configurar o TestPyPI para o CI/CD

Os pacotes Python do MeasureSoftGram sao publicados de forma automatizada pelo GitHub Actions, sem armazenar tokens nem segredos no repositorio. A publicacao usa Trusted Publishing (OIDC), em que o PyPI e o TestPyPI confiam diretamente em um workflow especifico do repositorio.

Esta pagina descreve o fluxo de forma generica. Adapte os nomes de projeto e de workflow ao seu pacote.

Visao geral do fluxo por tag

A publicacao e disparada por tags de versao:

  • Tag de pre-lancamento vX.Y.ZrcN publica no TestPyPI.
  • Tag final vX.Y.Z publica no PyPI de producao, com um gate: a publicacao final so ocorre se ja existir a release candidate (rc) correspondente no TestPyPI. O workflow tambem valida que a tag bate com a versao declarada no pyproject.toml.

Esse modelo garante que toda versao final passou antes por um indice de testes.

Passo 1: registrar o Trusted Publisher

No TestPyPI (e, de forma analoga, no PyPI de producao), registre o repositorio como publicador confiavel do projeto. Em Manage > Publishing, adicione um novo Trusted Publisher do tipo GitHub Actions com:

  • Owner: a organizacao no GitHub (fga-eps-mds).
  • Repository: o nome do repositorio do pacote.
  • Workflow: o nome do arquivo do workflow de publicacao (por exemplo, python-publish.yml).
  • Environment: o nome do environment usado pelo job (por exemplo, testpypi para o TestPyPI e pypi para o PyPI).

Quem registra o Trusted Publisher precisa ser proprietario (owner) do projeto no indice correspondente.

Passo 2: criar os environments no GitHub

No repositorio, em Settings > Environments, crie dois environments com os mesmos nomes usados no passo anterior:

  • testpypi
  • pypi

Voce pode adicionar regras de protecao no environment pypi (por exemplo, exigir revisao antes do deploy), reforcando o gate de producao.

Passo 3: configurar o workflow

O job de publicacao roda em ubuntu-latest e precisa de permissao de OIDC. O trecho essencial e:

permissions:
id-token: write

jobs:
publish:
runs-on: ubuntu-latest
environment: testpypi
steps:
- uses: actions/checkout@v4
- name: Build
run: |
python -m pip install --upgrade build
python -m build
- name: Publish to TestPyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
repository-url: https://test.pypi.org/legacy/

Para a publicacao em producao, use o mesmo pypa/gh-action-pypi-publish@release/v1 sem repository-url (o padrao e o PyPI) e associe o job ao environment pypi.

Como a autenticacao e feita via OIDC, nao e necessario criar nem armazenar tokens de API (TEST_PYPI_API_TOKEN, PYPI_API_TOKEN) como segredos. A action troca um token de curta duracao com o indice no momento da publicacao.

Resumo

  1. Registre o Trusted Publisher no TestPyPI e no PyPI, apontando para o owner, o repositorio, o workflow e o environment.
  2. Crie os environments testpypi e pypi no GitHub.
  3. Configure o workflow com id-token: write e a action oficial de publicacao.
  4. Use tags rc para o TestPyPI e tags finais para o PyPI, mantendo o gate entre eles.