From b4c8fc3a2b116972ab7cd52469e54b87026bc102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Sat, 15 Aug 2026 09:30:36 +0300 Subject: [PATCH] =?UTF-8?q?ReleaseNotes=20g=C3=BCncellemesi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 7 +- README.md | 11 +- .../Extensions/ReleaseNoteStartupService.cs | 58 ++++- .../Sozsoft.Platform.HttpApi.Host.csproj | 13 +- .../release-notes.json | 240 ------------------ configs/deployment/docker-compose-app.yml | 4 + configs/deployment/scripts/build/api.sh | 26 +- configs/deployment/scripts/deploy/app.sh | 18 +- configs/release-notes/README.md | 18 ++ .../release-notes}/generate-release-notes.sh | 30 +-- 10 files changed, 125 insertions(+), 300 deletions(-) delete mode 100644 api/src/Sozsoft.Platform.HttpApi.Host/release-notes.json create mode 100644 configs/release-notes/README.md rename {api/scripts => configs/release-notes}/generate-release-notes.sh (71%) diff --git a/.gitignore b/.gitignore index 62775ab2..fd8aad0e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ configs/**/data/** **/.DS_Store logs/ -# Build sırasında git tag'lerinden üretilir (api/scripts/generate-release-notes.sh). -# Takip edilirse deploy'daki `git pull` yerel değişiklikle çakışır ve dosya eskir. -api/src/Sozsoft.Platform.HttpApi.Host/release-notes.json \ No newline at end of file +# Deploy sırasında git tag'lerinden üretilir (configs/release-notes/generate-release-notes.sh) +# ve API konteynerine mount edilir. Takip edilirse deploy'daki `git pull` yerel +# değişiklikle çakışır ve dosya eskir. +configs/release-notes/release-notes.json \ No newline at end of file diff --git a/README.md b/README.md index 7dcee2b5..852245d7 100644 --- a/README.md +++ b/README.md @@ -702,10 +702,13 @@ konfigürasyonu ile üretilir. yoktur. Changelog `/admin/changeLog` ekranında gösterilir; sürüm numarası son görülenden farklıysa kullanıcı giriş sonrası oraya yönlendirilir (tetikleyici bundle değil, sürümdür — yalnızca yeni bir git tag'i eklenmiş olsa da çalışır). -- **Sürüm notu akışı — DbMigrator gerektirmez:** `api/scripts/generate-release-notes.sh` - build sırasında (`build/api.sh`) git tag'lerinden `HttpApi.Host/release-notes.json` üretir, - dosya API imajına gömülür ve `ReleaseNoteStartupService` uygulama açılışında tabloyu bu - dosyayla eşitler. Yeni sürüm için tag atıp API'yi deploy etmek yeterlidir. Notlar +- **Sürüm notu akışı — DbMigrator gerektirmez:** `configs/release-notes/generate-release-notes.sh` + deploy sırasında (`deploy/app.sh`) git tag'lerinden `configs/release-notes/release-notes.json` + üretir, dosya API konteynerine `/etc/api/release-notes` altına salt okunur mount edilir ve + `ReleaseNoteStartupService` uygulama açılışında tabloyu bu dosyayla eşitler. Dosya imaja + **gömülmez**: api build context'i içindeyken her yeni tag Dockerfile'daki `COPY . .` + katmanını geçersiz kılıp imajı gereksiz yere yeniden derletiyordu; artık kod değişmediyse + imaj cache'ten gelir. Yeni sürüm için tag atıp deploy etmek yeterlidir. Notlar **annotated** tag mesajından okunur (`git tag -a 1.2.0 -m "..."`), her satır bir madde. - **Tablo git tag listesinin aynasıdır:** yeni tag eklenir, mesajı düzeltilen tag güncellenir, git'ten silinen tag tablodan da (hard delete ile) kaldırılır. Bu yüzden `Sas_H_ReleaseNote` diff --git a/api/src/Sozsoft.Platform.HttpApi.Host/Extensions/ReleaseNoteStartupService.cs b/api/src/Sozsoft.Platform.HttpApi.Host/Extensions/ReleaseNoteStartupService.cs index b246872b..38416248 100644 --- a/api/src/Sozsoft.Platform.HttpApi.Host/Extensions/ReleaseNoteStartupService.cs +++ b/api/src/Sozsoft.Platform.HttpApi.Host/Extensions/ReleaseNoteStartupService.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Text.Json; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; @@ -32,11 +33,14 @@ public class ReleaseNoteSeedFileDto /// /// Sürüm notlarını uygulama açılışında veritabanına senkronize eder. /// -/// Kaynak, imaja gömülen release-notes.json dosyasıdır; bu dosya build -/// sırasında api/scripts/generate-release-notes.sh tarafından git -/// tag'lerinden üretilir. Böylece yeni bir sürüm tag'i eklemek için DbMigrator +/// Kaynak, konteynere mount edilen release-notes.json dosyasıdır; bu dosya +/// deploy sırasında configs/release-notes/generate-release-notes.sh tarafından +/// git tag'lerinden üretilir. Böylece yeni bir sürüm tag'i eklemek için DbMigrator /// çalıştırmak GEREKMEZ — API'yi deploy etmek yeterlidir. /// +/// Dosya imaja GÖMÜLMEZ: api build context'i içindeyken her yeni tag Dockerfile'daki +/// COPY . . katmanını geçersiz kılıp imajı gereksiz yere yeniden derletiyordu. +/// /// Tablo git tag listesinin birebir aynadır: yeni tag eklenir, mesajı düzeltilen /// tag güncellenir, silinen tag veritabanından da kaldırılır. Dosya okunamaz veya /// boşsa hiçbir şey yapılmaz (yanlışlıkla tablo boşaltılmasın diye). @@ -45,20 +49,26 @@ public class ReleaseNoteStartupService : IHostedService { private const string FileName = "release-notes.json"; + // Konteynerde docker-compose-app.yml ile mount edilen yol. + private const string MountedDirectory = "/etc/api/release-notes"; + private readonly IServiceProvider _serviceProvider; private readonly IHostApplicationLifetime _applicationLifetime; private readonly IHostEnvironment _environment; + private readonly IConfiguration _configuration; private readonly ILogger _logger; public ReleaseNoteStartupService( IServiceProvider serviceProvider, IHostApplicationLifetime applicationLifetime, IHostEnvironment environment, + IConfiguration configuration, ILogger logger) { _serviceProvider = serviceProvider; _applicationLifetime = applicationLifetime; _environment = environment; + _configuration = configuration; _logger = logger; } @@ -79,9 +89,9 @@ public class ReleaseNoteStartupService : IHostedService private async Task SyncAsync() { - var path = Path.Combine(_environment.ContentRootPath, FileName); + var path = ResolvePath(); - if (!File.Exists(path)) + if (path == null) { _logger.LogWarning("{FileName} bulunamadı, sürüm notları senkronize edilmedi.", FileName); return; @@ -134,6 +144,44 @@ public class ReleaseNoteStartupService : IHostedService } } + /// + /// Dosya yolunu sırayla dener: açık ayar (App:ReleaseNotesPath), konteynerdeki + /// mount noktası, son olarak yerel geliştirmede depodaki configs/release-notes + /// klasörü. Hiçbiri yoksa null döner. + /// + private string ResolvePath() + { + var configured = _configuration["App:ReleaseNotesPath"]; + if (!string.IsNullOrWhiteSpace(configured)) + { + // Klasör verildiyse dosya adı eklenir. + var resolved = Directory.Exists(configured) ? Path.Combine(configured, FileName) : configured; + return File.Exists(resolved) ? resolved : null; + } + + var mounted = Path.Combine(MountedDirectory, FileName); + if (File.Exists(mounted)) + { + return mounted; + } + + // Yerel geliştirme: ContentRootPath api/src/Sozsoft.Platform.HttpApi.Host, + // aranan yol depo kökündeki configs/release-notes. + var directory = new DirectoryInfo(_environment.ContentRootPath); + while (directory != null) + { + var candidate = Path.Combine(directory.FullName, "configs", "release-notes", FileName); + if (File.Exists(candidate)) + { + return candidate; + } + + directory = directory.Parent; + } + + return null; + } + private static async Task<(int Inserted, int Updated, int Deleted)> SyncItemsAsync( IServiceProvider services, List items) diff --git a/api/src/Sozsoft.Platform.HttpApi.Host/Sozsoft.Platform.HttpApi.Host.csproj b/api/src/Sozsoft.Platform.HttpApi.Host/Sozsoft.Platform.HttpApi.Host.csproj index 264f4285..aa16fac6 100644 --- a/api/src/Sozsoft.Platform.HttpApi.Host/Sozsoft.Platform.HttpApi.Host.csproj +++ b/api/src/Sozsoft.Platform.HttpApi.Host/Sozsoft.Platform.HttpApi.Host.csproj @@ -54,16 +54,9 @@ - - - - - Always - Always - - + diff --git a/api/src/Sozsoft.Platform.HttpApi.Host/release-notes.json b/api/src/Sozsoft.Platform.HttpApi.Host/release-notes.json deleted file mode 100644 index 413de7f9..00000000 --- a/api/src/Sozsoft.Platform.HttpApi.Host/release-notes.json +++ /dev/null @@ -1,240 +0,0 @@ -{ - "ReleaseNotes": [ - { - "version": "1.2.1", - "releaseDate": "2026-08-13", - "commit": "ee121db5211ffbd28496b87ce9e4776ff96f7640", - "notes": [ - "Zaafiyet testleri ve güncellemeleri", - "React 19 upgrade", - "Devexpress 26.1.4", - "Migrations ve Seeds klasör düzenlemesi", - "New Version Check komponent düzenlemesi" - ] - }, - { - "version": "1.1.11", - "releaseDate": "2026-08-11", - "commit": "783c1fe1d35f7cb8f23fb63fad26123cbe54aafc", - "notes": [ - "Claude.ai optimizasyon güncellemesi" - ] - }, - { - "version": "1.1.10", - "releaseDate": "2026-07-31", - "commit": "2eef3ead35848341350659828a14dc4a463e57af", - "notes": [ - "Kullanıcılara User Type sütunu eklendi. Hem \"İç Kullanıcılar\" hemde \"Dış Kullanıcılar\" tanımlanabiliyor.", - "Lisans adedi sadece İç Kullanıcılar üzerinden çalışıyor.", - "Scheduler ve TodoBard komponentler geliştirildi.", - "Lookup editorlerin Static değerlere dil desteği eklendi." - ] - }, - { - "version": "1.1.09", - "releaseDate": "2026-07-29", - "commit": "b0e78ac619dfebac2eb17edfc04551217ca4b93e", - "notes": [ - "Wizard yetenekleri artırıldı. Menu Order eklendi.", - "GanttView sample düzenlemeleri", - "Schedulerview sample düzenlemeleri", - "CryptographyXml version 10.0.10" - ] - }, - { - "version": "1.1.08", - "releaseDate": "2026-07-16", - "commit": "24e92fcb82eef0ee26ca5d65e08c5404f132a09e", - "notes": [ - "CardView komponenti geliştirildi.", - "Todo / Kanban komponenti geliştirildi.", - "Licence information", - "Check New Versiyon komponenti." - ] - }, - { - "version": "1.1.07", - "releaseDate": "2026-07-13", - "commit": "50cb3eaf979eb5027172a92a4e941ed64aa3671e", - "notes": [ - "localStorage tüm bilgiler easy-peasy içerisinde birleştirildi.", - "Codex 5.6 sol optimizasyon yapıldı. Bir çok komponent Lazy load ile yüklendi.", - "Workflow komponentinden birden fazla kişi onay verebilir.", - "Posta Kodu eklendi.", - "Sales Order kısmında Yeni ve Eski müşteri sipariş ayrımı yapıldı" - ] - }, - { - "version": "1.1.06", - "releaseDate": "2026-07-06", - "commit": "bab639ce6343b451b81d6688e4f7af666f0233da", - "notes": [ - "Çekirdek kod için optimizasyon", - "List Reportlara Gruplu ve Alttoplam eklendi.", - "Paketlerdeki deprecated uyarları kaldırıldı" - ] - }, - { - "version": "1.1.05", - "releaseDate": "2026-06-27", - "commit": "352cf047b0af1b8aad53b632a41161efcc6cecdf", - "notes": [ - "Ai için Ollama kurulumu yapıldı. Ayrıca Gemma LLM ile çalıştırıldı.", - "DynamicReport eklendi. ReportDesigner ile çalışan bir rapor tasarlandı.", - "DynamicGridReport eklendi. Grid üzerinde otomatik rapor alınabiliyor.", - "DynamicTreeReport eklendi. Tree üzerinden otomatik rapor alınabiliyor.", - "DynamicFormReport eklendi. Single ekranlarda otomatik rapor eklendi.", - "Demo sayfası menüden ayrıldı." - ] - }, - { - "version": "1.1.04", - "releaseDate": "2026-06-04", - "commit": "20e7fae481ce69e9a678508ce03b5ed7831aea9f", - "notes": [ - "Settingde yapılan ayarlar Auth komponentlerine uygulandı.", - "Public home ve diğer sayfaların tasarım değişikliği yapıldı.", - "Route Type Dinamik ve Normal olarak ayrıldı.", - "Form Devexpress DefaultValue özelliği eklendi.", - "Devexpress DarkModa uygun şekilde güncellendi.", - "Grid, Tree ve FormDevexpress setReadonly özelliği eklendi." - ] - }, - { - "version": "1.1.03", - "releaseDate": "2026-05-30", - "commit": "96f7091d46c248ba3c42849fe5d870db0ab96982", - "notes": [ - "User Detail komponentinin içerisinde Avatar ekleme", - "EditForm un içerisinde EditorOptions dinamik oluşturulması", - "Editform un içerisinde EditorScript dinamik oluşturulması" - ] - }, - { - "version": "1.1.02", - "releaseDate": "2026-05-27", - "commit": "84b9f6510787bd82f3797728fd675f755b4caa2d", - "notes": [ - ".NET 10 yükseltildi.", - "Abp Framework 10 yükseltildi.", - "Sql Query Manager problemleri giderildi.", - "AuditLog problemleri giderildi.", - "Tenan yapısını uygunluğu için düzenlemeler yapıldı." - ] - }, - { - "version": "1.1.01", - "releaseDate": "2026-05-24", - "commit": "6262baa6f12d695a25d83304af985092715d439a", - "notes": [ - "Workflow tanımlaması yapılabilir.", - "Dark mod için uygulama güncellemesi", - "Form Field kısmında düzenleme", - "Hangfire Recurring Job düzenlemesi." - ] - }, - { - "version": "1.0.10", - "releaseDate": "2026-05-11", - "commit": "414006204e324018be597a598d3dd102868c5cca", - "notes": [ - "Backup dosyalarını son 5 günün kalması", - "Grid için Fit Columns özelliği eklendi.", - "Notification Desktop, UiActivity, UiToast özelliği eklendi", - "Versiyon güncellemeleri için \"System Updating\" mesajı" - ] - }, - { - "version": "1.0.9", - "releaseDate": "2026-05-09", - "commit": "e9d8f5ebac35fc7b21f08139dfe175ed548c14b4", - "notes": [ - "Video Rooms düzenlemesi", - "Genel Liste düzenlemeleri" - ] - }, - { - "version": "1.0.8", - "releaseDate": "2026-05-07", - "commit": "6fa266f23ed4f67384b7bef0e4030420cb788af5", - "notes": [ - "Intranet ve Sosyal Duvar", - "Listelerde ImageUploadandViewer", - "Survey Widget", - "Event, Category ve Type" - ] - }, - { - "version": "1.0.7", - "releaseDate": "2026-05-04", - "commit": "4444fce93b4f62ad6698099fefe7da1614d2859c", - "notes": [ - "Departman tanımlama", - "Job Position tanımlama", - "Wizard ve SQl Data güncellemeleri", - "Organizasyon Şemanı eklendi" - ] - }, - { - "version": "1.0.6", - "releaseDate": "2026-05-03", - "commit": "b2dfb04879a93709b04f8f0fc3bd4f5af1f7c01b", - "notes": [ - "SalesOrder ve SalesOrderItem listFormu tanımlandı.", - "Sql Backup dosyalarını File Manager içerisinde görüntülenebiliyor.", - "Wizard File Manager komponenti oluşturuldu.", - "Wizard komponentini Edit özelliği eklendi." - ] - }, - { - "version": "1.0.5", - "releaseDate": "2026-04-28", - "commit": "b9cc68ff41d675fefadab79f5ea2c5e7f376708a", - "notes": [ - "AllowAdding özelliği eklendi.", - "Kulllanıcı bazında Workhour özelliği eklendi.", - "ConcurrentUser sınırlaması getirildi.", - "Uygulamadan kullanıcıyı kickleme özelliği getirildi.", - "Uygulama açıkken DbMigrator çağrısı yapıldı." - ] - }, - { - "version": "1.0.4", - "releaseDate": "2026-03-30", - "commit": "e9ce256c0706de408e08a462bee9e4a72653f2c7", - "notes": [ - "Role Yetkilerini kopyalama", - "Place Holder güncellemesi", - "Kayıt kopyalama özelliği" - ] - }, - { - "version": "1.0.3", - "releaseDate": "2026-03-28", - "commit": "130d35c37703935e34948419f2ee900cc1b6b28c", - "notes": [ - "Report Template View And Design" - ] - }, - { - "version": "1.0.2", - "releaseDate": "2026-03-21", - "commit": "196b0dc24b7a815586166679b58ab4f9334bd40e", - "notes": [ - "Artificial Intelligence Chat Bot güncellemeleri" - ] - }, - { - "version": "1.0.1", - "releaseDate": "2026-03-18", - "commit": "ac7784c030825158641e9042c50dede2067c0486", - "notes": [ - "Public Site Designer", - "Menu Groups", - "Sql Query Manager", - "Listform Wizard" - ] - } - ] -} diff --git a/configs/deployment/docker-compose-app.yml b/configs/deployment/docker-compose-app.yml index 5305d418..db818e37 100644 --- a/configs/deployment/docker-compose-app.yml +++ b/configs/deployment/docker-compose-app.yml @@ -42,6 +42,10 @@ services: - sql-backups:/etc/api/cdn/host/backup - seeds:/etc/api/seeds - api-keys:/root/.aspnet/DataProtection-Keys + # Surum notlari imaja gomulmez; deploy sirasinda git tag'lerinden uretilip + # buradan okunur (ReleaseNoteStartupService). Boylece yeni tag API imajini + # yeniden derletmez. + - ../release-notes:/etc/api/release-notes:ro networks: - db - default diff --git a/configs/deployment/scripts/build/api.sh b/configs/deployment/scripts/build/api.sh index 1c843722..62a56200 100644 --- a/configs/deployment/scripts/build/api.sh +++ b/configs/deployment/scripts/build/api.sh @@ -1,31 +1,17 @@ #!/bin/bash -# set -e: sürüm notu üretimi sessizce başarısız olursa imaj eski/eksik notlarla -# derlenmesin. Daha önce böyle olmuştu: dosya git'te takip edildiği için hata -# fark edilmiyordu. set -e cd ~/sozsoft-platform git checkout main -# --tags --force: sürüm notları git tag'lerinden üretiliyor; yerel tag origin'den -# farklı commit'e bakıyorsa --force olmadan reddedilir ve yeni tag'ler gelmez. -git fetch --prune --prune-tags --tags --force && git pull +git fetch --prune && git pull cd ~/sozsoft-platform/api -# Sürüm notları git tag'lerinden üretilir ve API imajına gömülür; uygulama -# açılışta bunları veritabanına senkronize eder (DbMigrator gerekmez). -# `bash ...` ile çağrılır: depo Windows'tan yönetildiği için çalıştırma bitinin -# kaybolması "Permission denied" verip sürüm notlarını sessizce düşürüyordu. -RELEASE_NOTES=src/Sozsoft.Platform.HttpApi.Host/release-notes.json -bash scripts/generate-release-notes.sh - -# Dosya publish çıktısına csproj üzerinden girer; yoksa imaj sürüm notsuz kalır -# ve API açılışta "release-notes.json bulunamadı" uyarısı verir. Sessizce devam -# etmek yerine burada dur. -if [ ! -s "$RELEASE_NOTES" ]; then - echo "HATA: ${RELEASE_NOTES} üretilemedi, imaj derlenmiyor." >&2 - exit 1 -fi +# Sürüm notları burada ÜRETİLMEZ. Dosya api build context'i içindeyken her yeni +# tag Dockerfile'daki `COPY . .` katmanını geçersiz kılıyor ve kodda hiçbir +# değişiklik olmasa bile imaj baştan derleniyordu. Artık configs/release-notes +# altında deploy sırasında üretilip konteynere mount ediliyor +# (configs/deployment/scripts/deploy/app.sh). VERSION=$(cat ~/sozsoft-platform/api/src/Sozsoft.Platform.HttpApi.Host/appsettings.json \ | grep -o '"[^"]*"\s*:\s*"[^"]*"' \ diff --git a/configs/deployment/scripts/deploy/app.sh b/configs/deployment/scripts/deploy/app.sh index 31868ed3..779486ff 100644 --- a/configs/deployment/scripts/deploy/app.sh +++ b/configs/deployment/scripts/deploy/app.sh @@ -10,7 +10,23 @@ docker compose -f docker-compose-app.yml -f docker-compose-app.${ENV}.yml --prof cd ~/sozsoft-platform git checkout main -git fetch && git pull +# --tags --force: sürüm notları git tag'lerinden üretiliyor; yerel tag origin'den +# farklı commit'e bakıyorsa --force olmadan reddedilir ve yeni tag'ler gelmez. +git fetch --prune --prune-tags --tags --force && git pull + +# Sürüm notları imaja gömülü değil; konteynere configs/release-notes klasöründen +# mount ediliyor ve API açılışta veritabanına senkronize ediyor (DbMigrator +# gerekmez). `bash ...` ile çağrılır: depo Windows'tan yönetildiği için +# çalıştırma biti kaybolunca "Permission denied" verip notları sessizce düşürüyordu. +RELEASE_NOTES=~/sozsoft-platform/configs/release-notes/release-notes.json +bash ~/sozsoft-platform/configs/release-notes/generate-release-notes.sh + +# Dosya yoksa API açılışta "release-notes.json bulunamadı" uyarısı verir ve +# changelog eskir; sessizce devam etmek yerine burada dur. +if [ ! -s "$RELEASE_NOTES" ]; then + echo "HATA: ${RELEASE_NOTES} üretilemedi, deploy durduruldu." >&2 + exit 1 +fi cd ~/sozsoft-platform/configs/deployment docker compose -f docker-compose-app.yml -f docker-compose-app.${ENV}.yml --profile api pull diff --git a/configs/release-notes/README.md b/configs/release-notes/README.md new file mode 100644 index 00000000..6490629e --- /dev/null +++ b/configs/release-notes/README.md @@ -0,0 +1,18 @@ +# release-notes + +`release-notes.json` git tag'lerinden üretilir ve API konteynerine salt okunur +mount edilir (`/etc/api/release-notes`). İmaja gömülmez. + +- Üretim: `bash configs/release-notes/generate-release-notes.sh` +- Deploy akışında otomatik çağrılır: `configs/deployment/scripts/deploy/app.sh` +- Okuyan taraf: `ReleaseNoteStartupService` (uygulama açılışında `Sas_H_ReleaseNote` + tablosunu bu dosyayla eşitler) + +Bu klasör API build context'inin dışındadır; böylece yeni bir tag atmak API imajını +yeniden derletmez, docker cache'i bozulmaz. + +Farklı bir yol kullanılacaksa `App:ReleaseNotesPath` (env: `App__ReleaseNotesPath`) +ayarı ile ezilebilir. + +`release-notes.json` `.gitignore`'dadır; deploy'daki `git pull` ile çakışmaması için +takip edilmez. diff --git a/api/scripts/generate-release-notes.sh b/configs/release-notes/generate-release-notes.sh similarity index 71% rename from api/scripts/generate-release-notes.sh rename to configs/release-notes/generate-release-notes.sh index 3a1e30c0..3f897353 100644 --- a/api/scripts/generate-release-notes.sh +++ b/configs/release-notes/generate-release-notes.sh @@ -2,30 +2,26 @@ set -e # Sürüm notlarını git tag'lerinden üretir: -# api/src/Sozsoft.Platform.HttpApi.Host/release-notes.json +# configs/release-notes/release-notes.json # -# Dosya csproj'daki `Content Update="release-notes.json"` kuralıyla publish -# çıktısına kopyalanır, yani imaja gömülür ve konteynerde ContentRootPath -# altında (/srv/app) yer alır. ReleaseNoteStartupService açılışta tam bu yolu -# okuyup `Sas_H_ReleaseNote` tablosuyla eşitler; DbMigrator gerekmez. +# Dosya İMAJA GÖMÜLMEZ. Konteynere docker-compose-app.yml üzerinden +# `/etc/api/release-notes` altına salt okunur mount edilir; ReleaseNoteStartupService +# açılışta bu yolu okuyup `Sas_H_ReleaseNote` tablosuyla eşitler, DbMigrator gerekmez. # -# ÖNEMLİ: Çıktı yolu ReleaseNoteStartupService'in okuduğu yolla aynı olmak -# ZORUNDA. Daha önce script `api/release-notes/` altına yazıyordu; orası ne -# publish çıktısına kopyalanıyor ne de konteynere mount ediliyordu, dolayısıyla -# imajdaki eski (commit'lenmiş) dosya kullanılıyor ve yeni tag'ler hiç -# görünmüyordu. +# Neden api/ altında değil: dosya api build context'i içindeyken her yeni tag +# Dockerfile'daki `COPY . .` katmanını geçersiz kılıyor ve kodda hiçbir değişiklik +# olmasa bile API imajı baştan derleniyordu. configs/ altında olduğu için artık +# API imajı bit bazında aynı kalır ve docker cache'ten yüklenir. # # Çıktı .gitignore'dadır: takip edilseydi deploy'daki `git pull` her seferinde -# yerel değişiklikle çakışırdı. -# -# Deploy akışında configs/deployment/scripts/build/api.sh tarafından otomatik -# çağrılır; elle de çalıştırılabilir. +# yerel değişiklikle çakışırdı. Bu yüzden dosya BUILD makinesinde değil, DEPLOY +# sırasında sunucuda üretilir (configs/deployment/scripts/deploy/app.sh); elle de +# çalıştırılabilir. # # Dış bağımlılığı yoktur (jq/node gerekmez): JSON kaçışları sed ile yapılır. -cd "$(dirname "$0")/.." -OUTPUT="src/Sozsoft.Platform.HttpApi.Host/release-notes.json" -mkdir -p "$(dirname "$OUTPUT")" +cd "$(dirname "$0")" +OUTPUT="release-notes.json" if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then echo "> git deposu yok, ${OUTPUT} güncellenmedi." >&2