|
| 1 | +# Publicacao do pacote `msgram-parser` |
| 2 | + |
| 3 | +Guia de como empacotar e publicar este repositorio no PyPI. Escrito para os |
| 4 | +proximos grupos: leia inteiro antes da primeira release. |
| 5 | + |
| 6 | +Pacote no PyPI: **`msgram-parser`**. |
| 7 | + |
| 8 | +--- |
| 9 | + |
| 10 | +## TL;DR |
| 11 | + |
| 12 | +A publicacao e automatica via GitHub Actions e **Trusted Publishing (OIDC)**: |
| 13 | +nao existe token nem secret no repositorio. Tudo e disparado por **tag git**. |
| 14 | + |
| 15 | +| Tag que voce cria | Onde publica | Quando usar | |
| 16 | +|--------------------------|--------------------|--------------------------------------| |
| 17 | +| `vX.Y.ZrcN` (`v1.2.2rc1`)| TestPyPI | Testar o pacote antes de producao | |
| 18 | +| `vX.Y.Z` (`v1.2.2`) | PyPI (producao) | Release final, depois de validar a rc| |
| 19 | + |
| 20 | +**Trava de seguranca:** a tag final (`vX.Y.Z`) so publica em producao se ja |
| 21 | +existir uma release candidate (`vX.Y.ZrcN`) da mesma versao no TestPyPI. Sem rc, |
| 22 | +o job falha. E impossivel publicar em producao sem ter testado antes. |
| 23 | + |
| 24 | +--- |
| 25 | + |
| 26 | +## Fluxo completo de uma release (passo a passo) |
| 27 | + |
| 28 | +1. **Bump da versao para a rc.** Em `pyproject.toml`, ajuste: |
| 29 | + ```toml |
| 30 | + version = "1.2.2rc1" |
| 31 | + ``` |
| 32 | + A versao do `pyproject.toml` tem que bater EXATAMENTE com a tag, senao o CI |
| 33 | + falha de proposito (step "Validar tag == versao do pyproject"). |
| 34 | +2. **Commit + tag da rc:** |
| 35 | + ```bash |
| 36 | + git commit -am "chore: bump 1.2.2rc1" |
| 37 | + git tag v1.2.2rc1 |
| 38 | + git push origin develop --tags |
| 39 | + ``` |
| 40 | + O push da tag dispara o workflow, que publica no **TestPyPI**. |
| 41 | +3. **Teste a rc** instalando do TestPyPI (secao abaixo). Rode o que precisar. |
| 42 | +4. **Se estiver tudo certo, prepare a final.** No `pyproject.toml`: |
| 43 | + ```toml |
| 44 | + version = "1.2.2" |
| 45 | + ``` |
| 46 | +5. **Commit + tag final:** |
| 47 | + ```bash |
| 48 | + git commit -am "chore: release 1.2.2" |
| 49 | + git tag v1.2.2 |
| 50 | + git push origin develop --tags |
| 51 | + ``` |
| 52 | + O workflow roda o **gate** (confere que `1.2.2rcN` existe no TestPyPI) e, se |
| 53 | + passar, publica em **producao**. |
| 54 | + |
| 55 | +Achou um problema na rc? Corrija, suba a versao da rc (`1.2.2rc2`) e repita do |
| 56 | +passo 1. So promova para final quando a rc estiver boa. |
| 57 | + |
| 58 | +--- |
| 59 | + |
| 60 | +## Pre-requisitos: configurar o Trusted Publisher (uma vez por projeto) |
| 61 | + |
| 62 | +Quem tiver acesso de **owner** do projeto no PyPI precisa registrar o publisher |
| 63 | +confiavel nos DOIS indices (sao contas/sites separados): |
| 64 | + |
| 65 | +- Producao: <https://pypi.org/manage/project/msgram-parser/settings/publishing/> |
| 66 | +- Teste: <https://test.pypi.org/manage/project/msgram-parser/settings/publishing/> |
| 67 | + |
| 68 | +Em cada um, adicione um "GitHub" trusted publisher com: |
| 69 | + |
| 70 | +| Campo | Valor | |
| 71 | +|---------------------|------------------------------------| |
| 72 | +| Owner | `fga-eps-mds` | |
| 73 | +| Repository name | `2026.1-MeasureSoftGram-Parser` | |
| 74 | +| Workflow filename | `python-publish.yml` | |
| 75 | +| Environment name | `pypi` no PyPI / `testpypi` no TestPyPI | |
| 76 | + |
| 77 | +Depois, no GitHub do repo (Settings > Environments), crie os environments |
| 78 | +**`testpypi`** e **`pypi`**. Recomendado: no `pypi`, marque "Required reviewers" |
| 79 | +com alguem do time, assim toda release de producao passa por um OK humano alem |
| 80 | +do gate da rc. |
| 81 | + |
| 82 | +> Nota: Trusted Publishing substitui os antigos secrets `PYPI_API_TOKEN` e |
| 83 | +> `TEST_PYPI_API_TOKEN`. Eles nao sao mais usados e podem ser removidos. |
| 84 | +
|
| 85 | +--- |
| 86 | + |
| 87 | +## Como testar a partir do TestPyPI |
| 88 | + |
| 89 | +O TestPyPI nao tem todas as dependencias pesadas (requests, numpy, pandas). Por |
| 90 | +isso o `--extra-index-url` aponta para o PyPI de producao, de onde essas deps |
| 91 | +sao baixadas: |
| 92 | + |
| 93 | +```bash |
| 94 | +uv venv --python 3.10 .venv |
| 95 | +uv pip install --python .venv/bin/python \ |
| 96 | + --index-url https://test.pypi.org/simple/ \ |
| 97 | + --extra-index-url https://pypi.org/simple/ \ |
| 98 | + "msgram-parser==1.2.2rc1" |
| 99 | + |
| 100 | +.venv/bin/python -c "import genericparser; print('import ok')" |
| 101 | +``` |
| 102 | + |
| 103 | +(Com `pip` puro: `pip install --index-url ... --extra-index-url ... msgram-parser==1.2.2rc1`.) |
| 104 | + |
| 105 | +--- |
| 106 | + |
| 107 | +## Ordem de publicacao entre os pacotes do MeasureSoftGram |
| 108 | + |
| 109 | +O ecossistema tem tres pacotes com dependencia entre eles: |
| 110 | + |
| 111 | +``` |
| 112 | +msgram (CLI) -> depende de -> msgram-core + msgram-parser |
| 113 | +``` |
| 114 | + |
| 115 | +`msgram-parser` (este repo) **nao depende** dos outros, entao faz parte da |
| 116 | +primeira onda. Ordem recomendada ao subir versoes novas em producao: |
| 117 | + |
| 118 | +1. **msgram-core** e **msgram-parser** (este repo entra aqui) |
| 119 | +2. so depois, **msgram** (CLI) |
| 120 | + |
| 121 | +Motivo: quando o CLI for publicado, o PyPI precisa ja ter as versoes novas de |
| 122 | +core e parser disponiveis para resolver as dependencias. |
| 123 | + |
| 124 | +--- |
| 125 | + |
| 126 | +## Versionamento |
| 127 | + |
| 128 | +- Segue [PEP 440](https://peps.python.org/pep-0440/). Release candidate e |
| 129 | + `X.Y.ZrcN` (ex: `1.2.2rc1`), final e `X.Y.Z`. |
| 130 | +- Cada versao so pode ser publicada **uma vez** em cada indice. Para republicar, |
| 131 | + suba o numero (nao da para sobrescrever no PyPI nem no TestPyPI). |
| 132 | +- A tag git sempre tem o prefixo `v` (`v1.2.2rc1`, `v1.2.2`). |
| 133 | + |
| 134 | +--- |
| 135 | + |
| 136 | +## Troubleshooting |
| 137 | + |
| 138 | +| Sintoma | Causa provavel / solucao | |
| 139 | +|---|---| |
| 140 | +| `403 ... isn't allowed to upload to project` | Trusted publisher nao configurado ou com campo divergente (owner/repo/workflow/environment). Confira a secao de pre-requisitos. | |
| 141 | +| `400 File already exists` | Essa versao ja foi publicada nesse indice. Suba o numero da versao. | |
| 142 | +| Job de producao falhou no "Gate" | Nao existe rc da mesma versao no TestPyPI. Publique e teste a `vX.Y.ZrcN` primeiro. | |
| 143 | +| `Tag ... difere da versao em pyproject.toml` | A tag e a `version` do `pyproject.toml` precisam ser iguais. Ajuste e re-tague. | |
| 144 | +| `pip` nao acha as deps ao instalar do TestPyPI | Faltou o `--extra-index-url https://pypi.org/simple/`. | |
| 145 | + |
| 146 | +--- |
| 147 | + |
| 148 | +## Referencias |
| 149 | + |
| 150 | +- Trusted Publishing (PyPI): <https://docs.pypi.org/trusted-publishers/> |
| 151 | +- Action oficial: <https://github.com/pypa/gh-action-pypi-publish> |
| 152 | +- Workflow deste repo: `.github/workflows/python-publish.yml` |
0 commit comments