From 83a6e24769a533cd2b1069eba3a88f8c48bee7ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ziya=20Ye=C5=9Filbah=C3=A7e?= Date: Fri, 6 Nov 2026 23:43:41 +0300 Subject: [PATCH] =?UTF-8?q?release-publish:=20Release=20sonras=C4=B1=20pak?= =?UTF-8?q?et=20indeksi=20ad=C4=B1m=C4=B1=20(index-publish.sh),=20lock=20y?= =?UTF-8?q?=C3=B6nergesi=20g=C3=BCncellendi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 --- CHANGELOG.md | 5 +++++ README.md | 2 +- scripts/release-publish.sh | 20 +++++++++++++++----- scripts/release.sh | 4 ++-- test/test_release_publish.sh | 30 +++++++++++++++++++++++++++++- 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ffdbbf..63b3ce0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ Biçim [Keep a Changelog](https://keepachangelog.com/) esas alınmıştır. +## [Unreleased] + +### Değişti +- `scripts/release-publish.sh`: Release ve özet doğrulamasından sonra paket indeksini günceller (`sshpocket-index/scripts/index-publish.sh`, `SSHPOCKET_INDEX_DIR`); betik yoksa etiketten önce durur; indeks hatası yayımlanmış Release'i geçersiz kılmaz. Normal sürümde `components.lock` PR'ı gerekmez. Paket içeriği değişmedi (sürüm gerektirmez). Gerçek `index-publish.sh` ile DENENMEDİ (atrap betikle test edildi). + ## [0.1.1] - 2026-11-06 ### Eklendi diff --git a/README.md b/README.md index eab7074..d2b0908 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ test/e2e/lab/up.sh && test/e2e/lab/run.sh preview -e utility_timezone=Europe/Ist ```bash PAKET_SIGNING_KEY=~/.ssh/ scripts/release-publish.sh --dry-run # ne yapacağını gösterir, hiçbir şey yapmaz ``` -İmzalayıcı `linux-hardening` ile aynıdır (ad alanı `sshpocket-component`). Kilit satırını sshpocket reposunda `scripts/lock-component.sh utility --repo syhgorath/utility` ile ekleyin. +İmzalayıcı `linux-hardening` ile aynıdır (ad alanı `sshpocket-component`). Release sonrası `scripts/release-publish.sh` paket indeksini de günceller (`$SSHPOCKET_INDEX_DIR/scripts/index-publish.sh`, varsayılan `~/Developer/sshpocket-index`; indeks deposunda yerel commit, push sizde). Normal sürümde `components.lock` PR'ı GEREKMEZ; indeks adımı başarısız olursa Release geçerli kalır ve `index-publish.sh utility syhgorath/utility --archive dist/… --sig dist/….sig` tek başına yeniden çalıştırılır. ## Geliştirme Şablon: [sshpocket-paket-sablonu](https://github.com/syhgorath/sshpocket-paket-sablonu). Standart: sshpocket `docs/package-standard.md`. `tools/validate/` vendored kopyadır (elle düzenlemeyin; `tools/sync-validator.sh`). diff --git a/scripts/release-publish.sh b/scripts/release-publish.sh index e206465..4fc3212 100755 --- a/scripts/release-publish.sh +++ b/scripts/release-publish.sh @@ -1,13 +1,13 @@ #!/usr/bin/env bash # release-publish.sh (linux-hardening'den uyarlandı) - release.sh'in ÖNCESİNİ ve SONRASINI yapar (bakımcı aracı, yerelde çalışır): kontroller, etiket, paket+imza (release.sh), GitHub Release, yüklenen -# dosyaların özet doğrulaması ve components.lock'a yazılacak bilgilerin yazdırılması. +# dosyaların özet doğrulaması, paket indeksine yazma (sshpocket-index/scripts/index-publish.sh) ve components.lock taban bilgisinin yazdırılması. # # PAKET_SIGNING_KEY=~/.ssh/ scripts/release-publish.sh --dry-run # ne yapacağını gösterir, HİÇBİR ŞEY yapmaz # PAKET_SIGNING_KEY=~/.ssh/ scripts/release-publish.sh # onay ister, sonra etiketler, imzalar, Release açar # --yes (onay sorma), --no-ci-check (main CI kontrolünü atla: önerilmez) # -# Özel imza anahtarı ASLA repoya, CI'a veya sohbete konmaz; yalnızca release.sh'e PAKET_SIGNING_KEY ile aktarılır. components.lock sshpocket reposundadır: bu betik ona DOKUNMAZ, -# yalnızca yazılacak SHA-256 ve imzalayıcı satırını yazdırır. Ayrıntı: README.md "Sürüm yayını". +# Özel imza anahtarı ASLA repoya, CI'a veya sohbete konmaz; yalnızca release.sh'e (ve indeks betiğine) PAKET_SIGNING_KEY ile aktarılır. components.lock sshpocket reposundadır: bu betik ona DOKUNMAZ, +# yalnızca SHA-256 ve imzalayıcı satırını bilgi olarak yazdırır. İndeks betiği: $SSHPOCKET_INDEX_DIR (varsayılan ~/Developer/sshpocket-index). Ayrıntı: README.md "Sürüm yayını". set -euo pipefail cd "$(dirname "$0")/.." @@ -24,6 +24,7 @@ for a in "$@"; do done command -v git >/dev/null || die "git yok" command -v gh >/dev/null || die "gh (GitHub CLI) yok" +INDEX_PUBLISH="${SSHPOCKET_INDEX_DIR:-$HOME/Developer/sshpocket-index}/scripts/index-publish.sh" VERSION=$(tr -d '[:space:]' < VERSION) [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || die "VERSION geçersiz: '$VERSION'" @@ -62,13 +63,17 @@ trap 'rm -f "$NOTES"' EXIT awk -v v="$VERSION" '$0 ~ "^## \\[" v "\\]" {f=1; next} /^## \[/ {f=0} f' CHANGELOG.md | sed '/./,$!d' > "$NOTES" [ -s "$NOTES" ] || die "CHANGELOG.md [$VERSION] bölümü boş" +# İndeks betiği yoksa etiket/Release'ten ÖNCE dur (Release'siz-indeksli ya da indeksiz kalmasın) +[ -x "$INDEX_PUBLISH" ] || die "indeks betiği yok: $INDEX_PUBLISH (SSHPOCKET_INDEX_DIR ile sshpocket-index deposunun yerini verin)" + echo "Sürüm: $TAG (commit ${HEAD_SHA:0:7})" echo "Yapılacaklar:" echo " 1) git tag -a $TAG -m \"$ID $VERSION\" && git push origin $TAG" echo " 2) scripts/release.sh (paket + imza + kendi doğrulaması)" echo " 3) gh release create $TAG $ARCHIVE $ARCHIVE.sig --title $TAG --notes-file " echo " 4) yüklenen dosyaların SHA-256 özetini yerel dosyalarla karşılaştır" -echo " 5) components.lock için SHA-256 ve imzalayıcı satırını yazdır (sshpocket reposuna DOKUNULMAZ)" +echo " 5) components.lock taban bilgisi için SHA-256 ve imzalayıcı satırını yazdır (bilgi; sshpocket reposuna DOKUNULMAZ)" +echo " 6) indeks: $INDEX_PUBLISH $ID $VERSION --archive $ARCHIVE --sig $ARCHIVE.sig (indeks deposunda yerel commit; push sizde)" if [ "$DRY" = 1 ]; then echo "[dry-run] hiçbir şey yapılmadı."; exit 0; fi if [ "$YES" = 0 ]; then read -r -p "Devam edilsin mi? (etiket itilir, Release yayımlanır) [y/N] " ans scripts/release.sh # 3) dist/-.tar.gz ve .tar.gz.sig dosyalarını GitHub'da vX.Y.Z Release'ine yükleyin. -# 4) sshpocket reposuna kilit satırı ekleyen PR: scripts/lock-component.sh --repo --write +# 4) paket indeksi: sshpocket-index/scripts/index-publish.sh (release-publish.sh çağırır). components.lock yalnızca taban yükseltmek için. # # Güvenceler (yayından ÖNCE): temiz çalışma alanı, etiket = HEAD, CHANGELOG başlığı, tek kök dizin -/, VERSION = component.json = etiket, # geliştirme dosyası yok, sözleşme uyum denetimi (❌ varsa durur), imza yayından önce kendi public anahtarıyla doğrulanır. @@ -63,4 +63,4 @@ ssh-keygen -Y verify -f "$SIGNERS" -I "$SIGNER_ID" -n "$NS" -s "$ARCHIVE.sig" < echo "✅ $ARCHIVE ve $ARCHIVE.sig hazır" echo "components.lock imzalayıcı satırı (kilit PR'ında linux-hardening ile aynı olmalı):" echo " $SIGNER_ID namespaces=\"$NS\" $PUB" -echo " Sonraki adım: dosyaları GitHub'da $TAG Release'ine yükleyin, sonra sshpocket'te scripts/lock-component.sh ile kilide yazın." +echo " Sonraki adım: dosyaları GitHub'da $TAG Release'ine yükleyin, sonra indeks betiğini çalıştırın (scripts/release-publish.sh bunu sizin için yapar)." diff --git a/test/test_release_publish.sh b/test/test_release_publish.sh index 460a74a..164ba0e 100755 --- a/test/test_release_publish.sh +++ b/test/test_release_publish.sh @@ -41,7 +41,17 @@ fresh() { # temiz depo + yerel bare origin (main, takip ediyor) && git -c user.email=t@t -c user.name=t commit -qm base \ && git remote add origin "$TMP/o.git" && git push -q -u origin main) } -pub() { (cd "$TMP/r" && PATH="$BIN:$PATH" PAKET_SIGNING_KEY="$KEY" bash scripts/release-publish.sh "$@" 2>&1); } +# Atrap indeks betiği (gerçeği sshpocket-index deposunda): çağrıları index.log'a yazar; FAKE_INDEX_FAIL=1 ise hata verir +IDX="$TMP/idx"; mkdir -p "$IDX/scripts" +cat > "$IDX/scripts/index-publish.sh" <<'IDXS' +#!/usr/bin/env bash +echo "index-publish $*" >> "$FAKE_INDEX_LOG"; echo "ATRAP-INDEKS-CAGRILDI" +[ "${FAKE_INDEX_FAIL:-0}" = 1 ] && { echo "indeks hatasi (atrap)" >&2; exit 1; } +exit 0 +IDXS +chmod +x "$IDX/scripts/index-publish.sh" +export FAKE_INDEX_LOG="$TMP/index.log" +pub() { (cd "$TMP/r" && PATH="$BIN:$PATH" SSHPOCKET_INDEX_DIR="${IDX_DIR:-$IDX}" PAKET_SIGNING_KEY="$KEY" bash scripts/release-publish.sh "$@" 2>&1); } expect_fail() { if printf '%s' "$2" | grep -q '^HATA:'; then ok "$1 reddedildi"; else bad "$1 REDDEDILMEDI: $2"; fi; } echo "-- dry-run: ne yapacagini gosterir, HICBIR SEY yapmaz" @@ -49,6 +59,7 @@ fresh; out=$(pub --dry-run); rc=$? expect_eq "dry-run cikis 0" "0" "$rc" expect_contains " plan: etiket" "$out" "git tag -a v$V" expect_contains " plan: gh release create" "$out" "gh release create v$V" +expect_contains " plan: 6) indeks" "$out" "6) indeks: $IDX/scripts/index-publish.sh utility $V" expect_contains " [dry-run] hicbir sey yapilmadi" "$out" "[dry-run] hiçbir şey yapılmadı" if (cd "$TMP/r" && git rev-parse -q --verify "refs/tags/v$V" >/dev/null); then bad "dry-run etiket OLUSTURDU"; else ok "dry-run etiket olusturmadi"; fi if git --git-dir="$TMP/o.git" rev-parse -q --verify "refs/tags/v$V" >/dev/null; then bad "dry-run etiketi ITTI"; else ok "dry-run etiketi itmedi"; fi @@ -87,6 +98,23 @@ expect_contains " ozet dogrulandi mesaji" "$out" "yüklenen dosyaların özeti expect_contains " components.lock bilgisi: SHA-256" "$out" "SHA-256" expect_contains " components.lock bilgisi: imzalayici satiri" "$out" 'namespaces="sshpocket-component"' expect_not_contains " sshpocket reposuna dokunmaz (components.lock yazilmaz)" "$out" "components.lock'a yazıldı" +echo "-- indeks adimi" +rm -f "$FAKE_INDEX_LOG"; fresh; out=$(pub --dry-run) +if [ -f "$FAKE_INDEX_LOG" ]; then bad "dry-run indeks betigini CALISTIRDI"; else ok "dry-run indeks betigini calistirmadi"; fi +rm -f "$FAKE_INDEX_LOG"; fresh; out=$(pub --yes); rc=$? +idxcall=$(cat "$FAKE_INDEX_LOG" 2>/dev/null) +expect_eq "indeks adimli tam kosu cikis 0" "0" "$rc" +expect_contains " indeks: --archive --sig" "$idxcall" "index-publish utility $V sahip/depo --archive dist/utility-$V.tar.gz --sig dist/utility-$V.tar.gz.sig" +expect_contains " indeks guncellendi mesaji" "$out" "İndeks güncellendi" +expect_not_contains " lock-component yonergesi yok" "$out" "SİZ güncelleyin" +if printf '%s' "$out" | awk '/ATRAP-INDEKS-CAGRILDI/ {i=NR} /✅/ {s=NR} END {exit !(s && i && i < s)}'; then ok "indeks adimi son ✅ satirindan once"; else bad "indeks adimi son ✅ satirindan SONRA ya da yok"; fi +fresh; IDX_DIR="$TMP/yok" ; out=$(pub --yes); rc=$?; unset IDX_DIR +if [ "$rc" != "0" ] && printf '%s' "$out" | grep -q "indeks betiği yok"; then ok "indeks betigi yoksa reddedildi"; else bad "indeks betigi yokken devam etti (rc=$rc): $out"; fi +if git --git-dir="$TMP/o.git" rev-parse -q --verify "refs/tags/v$V" >/dev/null; then bad "indeks betigi yokken etiket itildi"; else ok "indeks betigi yokken etiket itilmedi (Release'ten once durdu)"; fi +fresh; export FAKE_INDEX_FAIL=1; out=$(pub --yes); rc=$?; unset FAKE_INDEX_FAIL +if [ "$rc" != "0" ]; then ok "indeks hatasi cikis kodu 0 degil"; else bad "indeks hatasi yutuldu"; fi +expect_contains " hata: Release gecerli, betik tek basina yeniden calistirilabilir" "$out" "tek başına yeniden çalıştırılabilir" +if [ -f "$TMP/gh.create" ]; then ok "indeks hatasinda Release zaten acilmisti"; else bad "Release yok"; fi echo "-- ozet UYUSMAZSA durur" fresh; export FAKE_DIGEST=kotu; out=$(pub --yes); rc=$?; unset FAKE_DIGEST if [ "$rc" != "0" ] && printf '%s' "$out" | grep -q "özeti uyuşmuyor"; then ok "uyusmayan ozet reddedildi"; else bad "uyusmayan ozet KABUL EDILDI (rc=$rc): $out"; fi