Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/<anahtar> 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 <sürüm> --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 <sürüm> 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`).
Expand Down
20 changes: 15 additions & 5 deletions scripts/release-publish.sh
Original file line number Diff line number Diff line change
@@ -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/<anahtar> scripts/release-publish.sh --dry-run # ne yapacağını gösterir, HİÇBİR ŞEY yapmaz
# PAKET_SIGNING_KEY=~/.ssh/<anahtar> 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")/.."

Expand All @@ -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'"
Expand Down Expand Up @@ -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 <CHANGELOG [$VERSION] bölümü, $(wc -l < "$NOTES" | tr -d ' ') satır>"
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 <sahip/depo> --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 </dev/tty || ans=""
Expand Down Expand Up @@ -97,7 +102,12 @@ for f in "$ARCHIVE" "$ARCHIVE.sig"; do
[ -n "$got" ] || die "Release'te $(basename "$f") yok"
[ "$got" = "$want" ] || die "$(basename "$f") özeti uyuşmuyor: Release=$got yerel=$want"
done
# 6) indeks: Release ve özet doğrulaması geçti. İndeks hatası Release'i geçersiz kılmaz; indeks betiği tek başına yeniden çalıştırılabilir
if ! "$INDEX_PUBLISH" "$ID" "$VERSION" "$REPO" --archive "$ARCHIVE" --sig "$ARCHIVE.sig"; then
die "indeks güncellenemedi. Release $TAG YAYIMLANDI ve geçerli; index-publish.sh tek başına yeniden çalıştırılabilir: $INDEX_PUBLISH $ID $VERSION $REPO --archive $ARCHIVE --sig $ARCHIVE.sig"
fi
echo ""
echo "✅ $TAG yayımlandı ve yüklenen dosyaların özeti yerelle aynı."
echo "components.lock için (sshpocket reposunda SİZ güncelleyin): sürüm $VERSION, SHA-256 $(SUMOF "$ARCHIVE")"
echo "İndeks güncellendi (indeks deposunda yerel commit; push sizde). components.lock güncellemesi normal sürümde GEREKMEZ, indeks halleder."
echo "components.lock taban bilgisi (yalnızca taban yükseltmek isterseniz, sshpocket reposunda): sürüm $VERSION, SHA-256 $(SUMOF "$ARCHIVE")"
grep -E '^ .* namespaces=' "$OUT" || true
4 changes: 2 additions & 2 deletions scripts/release.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# 1) VERSION, component.json "version" ve CHANGELOG.md'yi güncelleyin; commit + etiket: git tag -a vX.Y.Z -m "..."
# 2) PAKET_SIGNING_KEY=~/.ssh/<ozel_anahtar> scripts/release.sh
# 3) dist/<id>-<sürüm>.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 <id> <sürüm> --repo <sahip/depo> --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 <id>-<sürüm>/, 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.
Expand Down Expand Up @@ -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)."
30 changes: 29 additions & 1 deletion test/test_release_publish.sh
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,25 @@ 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"
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
Expand Down Expand Up @@ -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: <id> <surum> <depo> --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
Expand Down