ReleaseNotes güncellemesi
This commit is contained in:
parent
cedf788787
commit
b4c8fc3a2b
10 changed files with 125 additions and 300 deletions
7
.gitignore
vendored
7
.gitignore
vendored
|
|
@ -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
|
||||
# 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
|
||||
11
README.md
11
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`
|
||||
|
|
|
|||
|
|
@ -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
|
|||
/// <summary>
|
||||
/// 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
|
||||
/// sırasında <c>api/scripts/generate-release-notes.sh</c> tarafından git
|
||||
/// tag'lerinden üretilir. Böylece yeni bir sürüm tag'i eklemek için DbMigrator
|
||||
/// Kaynak, konteynere mount edilen <c>release-notes.json</c> dosyasıdır; bu dosya
|
||||
/// deploy sırasında <c>configs/release-notes/generate-release-notes.sh</c> 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
|
||||
/// <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
|
||||
/// 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<ReleaseNoteStartupService> _logger;
|
||||
|
||||
public ReleaseNoteStartupService(
|
||||
IServiceProvider serviceProvider,
|
||||
IHostApplicationLifetime applicationLifetime,
|
||||
IHostEnvironment environment,
|
||||
IConfiguration configuration,
|
||||
ILogger<ReleaseNoteStartupService> 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
|
|||
}
|
||||
}
|
||||
|
||||
/// <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(
|
||||
IServiceProvider services,
|
||||
List<ReleaseNoteSeedDto> items)
|
||||
|
|
|
|||
|
|
@ -54,16 +54,9 @@
|
|||
<None Remove="Logs\**" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<!-- Sürüm notları: build sırasında git tag'lerinden üretilir, açılışta
|
||||
ReleaseNoteStartupService tarafından veritabanına senkronize edilir. -->
|
||||
<!-- 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>
|
||||
<!-- Sürüm notları (release-notes.json) artık bu projeye kopyalanmaz: dosya
|
||||
configs/release-notes altında üretilir ve konteynere mount edilir. api build
|
||||
context'i içindeyken her yeni tag imajı gereksiz yere yeniden derletiyordu. -->
|
||||
|
||||
</Project>
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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*"[^"]*"' \
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
18
configs/release-notes/README.md
Normal file
18
configs/release-notes/README.md
Normal 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.
|
||||
|
|
@ -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
|
||||
Loading…
Reference in a new issue