Skip to content

ci: wydanie tylko z main albo z tagu na main - #50

Merged
mbeczynski merged 1 commit into
mainfrom
ci/publikacja-tylko-z-main
Nov 4, 2026
Merged

mbeczynski merged 1 commit into
mainfrom
ci/publikacja-tylko-z-main

Conversation

@mbeczynski

Copy link
Copy Markdown
Contributor

Problem

workflow_dispatch („Run workflow”) uruchomione na gałęzi innej niż main liczyło release=true → GitHub Release, tag i aktualizacja casku w RenaCode/homebrew-tap z nie scalonego kodu. Tag v* wypchnięty na dowolny commit też wydawał.

Zmiany (.github/workflows/release.yml)

  • decide: ref inny niż refs/heads/main (i nie tag) = dry run (jak PR). Tag v* wydaje tylko, gdy jego commit jest na main (git merge-base --is-ancestor $GITHUB_SHA refs/remotes/origin/main), inaczej job kończy się błędem. Checkout w decide z fetch-depth: 0.
  • Drugi bezpiecznik w jobie release: IS_RELEASE = decide.release == 'true' && (ref == main || ref startsWith refs/tags/v).
  • Tap token / Check tap access: tylko przy wydaniu albo w PR (sonda instalacji aplikacji w PR zostaje), nie w dry runie z gałęzi.
  • Wydanie z main i z tagu na main działa jak dotąd.

Test (.github/test-release-workflow.sh, job Release workflow guard w ci.yml)

  • wyciąga skrypt kroku decide i URUCHAMIA go ze stubem git dla: push/dispatch na main (wersja 1.3.2), PR, dispatch i push na gałęzi, tag na main, tag spoza main (błąd); stub merge-base akceptuje tylko $GITHUB_SHA wobec refs/remotes/origin/main;
  • IS_RELEASE porównywane w całości;
  • kroki joba release wyliczane z pliku: każdy, który czyta secrets.* / token tapu albo publikuje, musi mieć if: env.IS_RELEASE == 'true' (wyjątek: token tapu — wydanie albo PR).
  • Kanarki (każda mutacja → czerwony): bez sprawdzenia gałęzi, merge-base wobec HEAD, bez merge-base, IS_RELEASE bez refu albo z || true, Push cask to tap bez if, Tap token bez if, zły if po id:, nowy krok z sekretem bez if.

Ograniczenia — rekomendacja dla właściciela (ustawienia repo, NIE zmienione w tym PR)

Plik workflow chroni przed pomyłką, nie przed kimś z prawem zapisu: bieg używa pliku workflow ze swojego refu, więc gałąź może te warunki usunąć. Twarda blokada to ustawienia repo:

  1. Environment (np. release) z regułą wdrożeń tylko dla main i tagów v*; przenieść do niego sekrety CM_SIGNING_P12_BASE64, CM_SIGNING_P12_PASSWORD, TAP_APP_KEY i dodać environment: do joba release.
  2. Ruleset na tagi v* (tworzenie tylko przez właściciela / Actions).

Ryzyko pozostające: PR z gałęzi tego repo uruchamia swój kod przed krokiem Tap token (np. podmiana git przez $GITHUB_PATH) i może przeczytać token tapu (1 h, tylko homebrew-tap). Zostawione celowo dla sondy instalacji aplikacji w PR; environment z p. 1 to zamyka.

Nie uruchamiano workflow_dispatch.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AU1Mhxpy65J75YYTkmt7NF

Reczne "Run workflow" na innej galezi dawalo release=true i wydawalo
nie scalony kod (GitHub Release + cask w tapie). Teraz:
- decide: galaz inna niz main = dry run; tag v* tylko gdy commit jest
  na main (merge-base), inaczej blad;
- IS_RELEASE w jobie release sprawdza ref niezaleznie od decide;
- token tapu tylko przy wydaniu i w PR, nie w dry run z galezi.

.github/test-release-workflow.sh uruchamia skrypt decide ze stubem git
dla kazdego rodzaju refu i sprawdza, ze kazdy krok z sekretem albo
publikujacy ma warunek IS_RELEASE. Wpiety w ci.yml.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AU1Mhxpy65J75YYTkmt7NF
@mbeczynski
mbeczynski merged commit 44bc752 into main Nov 4, 2026
6 checks passed
@mbeczynski
mbeczynski deleted the ci/publikacja-tylko-z-main branch November 4, 2026 13:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant