ReleaseNotes güncellemesi

This commit is contained in:
Sedat ÖZTÜRK 2026-08-15 09:30:36 +03:00
parent cedf788787
commit b4c8fc3a2b
10 changed files with 125 additions and 300 deletions

7
.gitignore vendored
View file

@ -4,6 +4,7 @@ configs/**/data/**
**/.DS_Store **/.DS_Store
logs/ logs/
# Build sırasında git tag'lerinden üretilir (api/scripts/generate-release-notes.sh). # Deploy sırasında git tag'lerinden üretilir (configs/release-notes/generate-release-notes.sh)
# Takip edilirse deploy'daki `git pull` yerel değişiklikle çakışır ve dosya eskir. # ve API konteynerine mount edilir. Takip edilirse deploy'daki `git pull` yerel
api/src/Sozsoft.Platform.HttpApi.Host/release-notes.json # değişiklikle çakışır ve dosya eskir.
configs/release-notes/release-notes.json

View file

@ -702,10 +702,13 @@ konfigürasyonu ile üretilir.
yoktur. Changelog `/admin/changeLog` ekranında gösterilir; sürüm numarası son görülenden 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 — 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). 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` - **Sürüm notu akışı — DbMigrator gerektirmez:** `configs/release-notes/generate-release-notes.sh`
build sırasında (`build/api.sh`) git tag'lerinden `HttpApi.Host/release-notes.json` üretir, deploy sırasında (`deploy/app.sh`) git tag'lerinden `configs/release-notes/release-notes.json`
dosya API imajına gömülür ve `ReleaseNoteStartupService` uygulama açılışında tabloyu bu üretir, dosya API konteynerine `/etc/api/release-notes` altına salt okunur mount edilir ve
dosyayla eşitler. Yeni sürüm için tag atıp API'yi deploy etmek yeterlidir. Notlar `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. **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, - **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` git'ten silinen tag tablodan da (hard delete ile) kaldırılır. Bu yüzden `Sas_H_ReleaseNote`

View file

@ -6,6 +6,7 @@ using System.Linq;
using System.Text.Json; using System.Text.Json;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -32,11 +33,14 @@ public class ReleaseNoteSeedFileDto
/// <summary> /// <summary>
/// Sürüm notlarını uygulama açılışında veritabanına senkronize eder. /// Sürüm notlarını uygulama açılışında veritabanına senkronize eder.
/// ///
/// Kaynak, imaja gömülen <c>release-notes.json</c> dosyasıdır; bu dosya build /// Kaynak, konteynere mount edilen <c>release-notes.json</c> dosyasıdır; bu dosya
/// sırasında <c>api/scripts/generate-release-notes.sh</c> tarafından git /// deploy sırasında <c>configs/release-notes/generate-release-notes.sh</c> tarafından
/// tag'lerinden üretilir. Böylece yeni bir sürüm tag'i eklemek için DbMigrator /// 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. /// ç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
/// <c>COPY . .</c> 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 /// 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 /// 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). /// 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"; 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 IServiceProvider _serviceProvider;
private readonly IHostApplicationLifetime _applicationLifetime; private readonly IHostApplicationLifetime _applicationLifetime;
private readonly IHostEnvironment _environment; private readonly IHostEnvironment _environment;
private readonly IConfiguration _configuration;
private readonly ILogger<ReleaseNoteStartupService> _logger; private readonly ILogger<ReleaseNoteStartupService> _logger;
public ReleaseNoteStartupService( public ReleaseNoteStartupService(
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
IHostApplicationLifetime applicationLifetime, IHostApplicationLifetime applicationLifetime,
IHostEnvironment environment, IHostEnvironment environment,
IConfiguration configuration,
ILogger<ReleaseNoteStartupService> logger) ILogger<ReleaseNoteStartupService> logger)
{ {
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
_applicationLifetime = applicationLifetime; _applicationLifetime = applicationLifetime;
_environment = environment; _environment = environment;
_configuration = configuration;
_logger = logger; _logger = logger;
} }
@ -79,9 +89,9 @@ public class ReleaseNoteStartupService : IHostedService
private async Task SyncAsync() 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); _logger.LogWarning("{FileName} bulunamadı, sürüm notları senkronize edilmedi.", FileName);
return; return;
@ -134,6 +144,44 @@ public class ReleaseNoteStartupService : IHostedService
} }
} }
/// <summary>
/// Dosya yolunu sırayla dener: açık ayar (<c>App:ReleaseNotesPath</c>), konteynerdeki
/// mount noktası, son olarak yerel geliştirmede depodaki <c>configs/release-notes</c>
/// klasörü. Hiçbiri yoksa null döner.
/// </summary>
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( private static async Task<(int Inserted, int Updated, int Deleted)> SyncItemsAsync(
IServiceProvider services, IServiceProvider services,
List<ReleaseNoteSeedDto> items) List<ReleaseNoteSeedDto> items)

View file

@ -54,16 +54,9 @@
<None Remove="Logs\**" /> <None Remove="Logs\**" />
</ItemGroup> </ItemGroup>
<ItemGroup> <!-- Sürüm notları (release-notes.json) artık bu projeye kopyalanmaz: dosya
<!-- Sürüm notları: build sırasında git tag'lerinden üretilir, açılışta configs/release-notes altında üretilir ve konteynere mount edilir. api build
ReleaseNoteStartupService tarafından veritabanına senkronize edilir. --> context'i içindeyken her yeni tag imajı gereksiz yere yeniden derletiyordu. -->
<!-- Web SDK json dosyalarını zaten Content olarak alır; burada yalnızca
kopyalama davranışı güncelleniyor (Include duplicate hatası verir). -->
<Content Update="release-notes.json">
<CopyToPublishDirectory>Always</CopyToPublishDirectory>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project> </Project>

View file

@ -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"
]
}
]
}

View file

@ -42,6 +42,10 @@ services:
- sql-backups:/etc/api/cdn/host/backup - sql-backups:/etc/api/cdn/host/backup
- seeds:/etc/api/seeds - seeds:/etc/api/seeds
- api-keys:/root/.aspnet/DataProtection-Keys - 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: networks:
- db - db
- default - default

View file

@ -1,31 +1,17 @@
#!/bin/bash #!/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 set -e
cd ~/sozsoft-platform cd ~/sozsoft-platform
git checkout main git checkout main
# --tags --force: sürüm notları git tag'lerinden üretiliyor; yerel tag origin'den git fetch --prune && git pull
# farklı commit'e bakıyorsa --force olmadan reddedilir ve yeni tag'ler gelmez.
git fetch --prune --prune-tags --tags --force && git pull
cd ~/sozsoft-platform/api cd ~/sozsoft-platform/api
# Sürüm notları git tag'lerinden üretilir ve API imajına gömülür; uygulama # Sürüm notları burada ÜRETİLMEZ. Dosya api build context'i içindeyken her yeni
# açılışta bunları veritabanına senkronize eder (DbMigrator gerekmez). # tag Dockerfile'daki `COPY . .` katmanını geçersiz kılıyor ve kodda hiçbir
# `bash ...` ile çağrılır: depo Windows'tan yönetildiği için çalıştırma bitinin # değişiklik olmasa bile imaj baştan derleniyordu. Artık configs/release-notes
# kaybolması "Permission denied" verip sürüm notlarını sessizce düşürüyordu. # altında deploy sırasında üretilip konteynere mount ediliyor
RELEASE_NOTES=src/Sozsoft.Platform.HttpApi.Host/release-notes.json # (configs/deployment/scripts/deploy/app.sh).
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
VERSION=$(cat ~/sozsoft-platform/api/src/Sozsoft.Platform.HttpApi.Host/appsettings.json \ VERSION=$(cat ~/sozsoft-platform/api/src/Sozsoft.Platform.HttpApi.Host/appsettings.json \
| grep -o '"[^"]*"\s*:\s*"[^"]*"' \ | grep -o '"[^"]*"\s*:\s*"[^"]*"' \

View file

@ -10,7 +10,23 @@ docker compose -f docker-compose-app.yml -f docker-compose-app.${ENV}.yml --prof
cd ~/sozsoft-platform cd ~/sozsoft-platform
git checkout main 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 cd ~/sozsoft-platform/configs/deployment
docker compose -f docker-compose-app.yml -f docker-compose-app.${ENV}.yml --profile api pull docker compose -f docker-compose-app.yml -f docker-compose-app.${ENV}.yml --profile api pull

View file

@ -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.

View file

@ -2,30 +2,26 @@
set -e set -e
# Sürüm notlarını git tag'lerinden üretir: # 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 # Dosya İMAJA GÖMÜLMEZ. Konteynere docker-compose-app.yml üzerinden
# çıktısına kopyalanır, yani imaja gömülür ve konteynerde ContentRootPath # `/etc/api/release-notes` altına salt okunur mount edilir; ReleaseNoteStartupService
# altında (/srv/app) yer alır. ReleaseNoteStartupService açılışta tam bu yolu # açılışta bu yolu okuyup `Sas_H_ReleaseNote` tablosuyla eşitler, DbMigrator gerekmez.
# okuyup `Sas_H_ReleaseNote` tablosuyla eşitler; DbMigrator gerekmez.
# #
# ÖNEMLİ: Çıktı yolu ReleaseNoteStartupService'in okuduğu yolla aynı olmak # Neden api/ altında değil: dosya api build context'i içindeyken her yeni tag
# ZORUNDA. Daha önce script `api/release-notes/` altına yazıyordu; orası ne # Dockerfile'daki `COPY . .` katmanını geçersiz kılıyor ve kodda hiçbir değişiklik
# publish çıktısına kopyalanıyor ne de konteynere mount ediliyordu, dolayısıyla # olmasa bile API imajı baştan derleniyordu. configs/ altında olduğu için artık
# imajdaki eski (commit'lenmiş) dosya kullanılıyor ve yeni tag'ler hiç # API imajı bit bazında aynı kalır ve docker cache'ten yüklenir.
# görünmüyordu.
# #
# Çıktı .gitignore'dadır: takip edilseydi deploy'daki `git pull` her seferinde # Çıktı .gitignore'dadır: takip edilseydi deploy'daki `git pull` her seferinde
# yerel değişiklikle çakışırdı. # 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
# Deploy akışında configs/deployment/scripts/build/api.sh tarafından otomatik # çalıştırılabilir.
# çağrılır; elle de çalıştırılabilir.
# #
# Dış bağımlılığı yoktur (jq/node gerekmez): JSON kaçışları sed ile yapılır. # Dış bağımlılığı yoktur (jq/node gerekmez): JSON kaçışları sed ile yapılır.
cd "$(dirname "$0")/.." cd "$(dirname "$0")"
OUTPUT="src/Sozsoft.Platform.HttpApi.Host/release-notes.json" OUTPUT="release-notes.json"
mkdir -p "$(dirname "$OUTPUT")"
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo "> git deposu yok, ${OUTPUT} güncellenmedi." >&2 echo "> git deposu yok, ${OUTPUT} güncellenmedi." >&2