{"id":3170,"date":"2026-08-04T18:28:14","date_gmt":"2026-08-04T18:28:14","guid":{"rendered":"https:\/\/yazilimperver.net\/?p=3170"},"modified":"2026-08-08T10:06:32","modified_gmt":"2026-08-08T10:06:32","slug":"sdl-painter-proje-altyapisi-devam-faz-0-ci-cd","status":"publish","type":"post","link":"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/","title":{"rendered":"sdl-painter &#8211; Proje Altyap\u0131s\u0131(faz 0) &#8211; CI\/CD"},"content":{"rendered":"<div>Merhaba dostlar! Bir <span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/yazilimperver.net\/index.php\/2026\/07\/03\/sdl-painter-proje-altyapisi-faz-0\/\">\u00f6nceki yaz\u0131mda<\/a><\/strong> <\/span>CI\/CD ile ilgili konulara \u00e7ok de\u011finemedi\u011fimden ve bu konular\u0131 ayr\u0131 bir yaz\u0131 olarak sizler ile payla\u015faca\u011f\u0131mdan bahsetmi\u015ftim. \u0130\u015fte bu yaz\u0131 onu v\u00fccut bulmu\u015f hali.<\/div>\n<div>Altyap\u0131y\u0131 kurarken en \u00e7ok vakit alan k\u0131s\u0131mlardan birisi de CI\/CD olabiliyor; bir\u00e7ok kendine has hususu i\u00e7erdi\u011fi i\u00e7in ben de buraya ta\u015f\u0131d\u0131m. G\u00fczel ve \u00f6nemli taraf\u0131 da \u015fu: burada anlatacaklar\u0131m\u0131n \u00e7o\u011fu SDLPainter&#8217;a \u00f6zel de\u011fil asl\u0131nda, herhangi bir modern C++\/CMake\/Conan projesine birebir ta\u015f\u0131yabilirsiniz.<\/div>\n<div><\/div>\n<div>CI\/CD&#8217;yi &#8220;sona b\u0131rak\u0131lan angarya&#8221; olarak de\u011fil, projenin as\u0131l \u00e7\u0131kt\u0131lar\u0131 ve altyap\u0131lar\u0131ndan biri olarak de\u011ferlendirdim. Gerek\u00e7em ise basit: kodlamaya ba\u015flad\u0131ktan sonra altyap\u0131yla u\u011fra\u015fmak bazen zul gelebiliyor. Her push&#8217;ta iki platformda derlenen, testleri headless ko\u015fan, format\u0131 denetleyen bir pipelinen\u0131m\u0131n olmas\u0131, sonraki fazlarda da g\u00f6n\u00fcl rahatl\u0131\u011f\u0131yla hareket etmeme olan sa\u011fl\u0131yor.<\/div>\n<div><\/div>\n<div>Burada bahsetti\u011fim pipeline&#8217;a y\u00f6nelik hususlar gitlab&#8217;a \u00f6zg\u00fc, bununla birlikte, gitlabda kotam\u0131n \u00e7ok h\u0131zl\u0131 bir \u015fekilde bitebildi\u011fini g\u00f6rd\u00fcm \ud83d\ude42 Bu yaz\u0131mda her iki pipeline&#8217;a da y\u00f6nelik konulara de\u011finece\u011fim.<\/div>\n<div><\/div>\n<h2><span style=\"color: #0000ff;\"><strong>Be\u015f A\u015famal\u0131 Pipeline<\/strong><\/span><\/h2>\n<div>\u00d6ncelikle pipeline&#8217;\u00een a\u015famalar\u0131ndan ba\u015flayal\u0131m. Pipeline&#8217;\u0131m be\u015f a\u015famadan olu\u015fuyor:<\/div>\n<pre class=\"lang:yaml decode:true\">stages:\r\n\u00a0 - build\r\n\u00a0 - test\r\n\u00a0 - quality\r\n\u00a0 - docs\r\n\u00a0 - release<\/pre>\n<table class=\"code-line\" dir=\"auto\" data-line=\"25\">\n<thead class=\"code-line\" dir=\"auto\" data-line=\"25\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"25\">\n<th>A\u015fama<\/th>\n<th>Job&#8217;lar<\/th>\n<th>Ne yap\u0131yor?<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"code-line\" dir=\"auto\" data-line=\"27\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"27\">\n<td>build<\/td>\n<td><code>build:linux:debug\/release<\/code>,\u00a0<code>build:windows:debug\/release<\/code><\/td>\n<td>\u0130ki platform \u00d7 iki konfig\u00fcrasyon<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"28\">\n<td>test<\/td>\n<td><code>test:unit<\/code>,\u00a0<code>test:unit:asan<\/code><\/td>\n<td>GTest (headless) + ASan\/UBSan<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"29\">\n<td>quality<\/td>\n<td><code>quality:clang-format<\/code>,\u00a0<code>quality:clang-tidy<\/code><\/td>\n<td>Format + statik analiz<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"30\">\n<td>docs<\/td>\n<td><code>pages<\/code><\/td>\n<td>Doxygen \u2192 GitLab Pages (yaln\u0131z\u00a0<code>main<\/code>)<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"31\">\n<td>release<\/td>\n<td><code>release:publish<\/code><\/td>\n<td><code>v*.*.*<\/code>\u00a0tag&#8217;inde otomatik release<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div><\/div>\n<div>Burada ben SDLPainter i\u00e7in hem windows hem de linux pipeline&#8217;lar\u0131 olu\u015fturdum ama siz hedef sadece bir hedef platform i\u00e7in de olu\u015fturabilirsiniz.<\/div>\n<p id=\"easWven\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3171 \" src=\"https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d.png\" alt=\"\" width=\"1228\" height=\"463\" srcset=\"https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d.png 1867w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d-300x113.png 300w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d-1024x386.png 1024w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d-768x289.png 768w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d-1536x578.png 1536w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d-500x188.png 500w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d-150x56.png 150w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d-1200x452.png 1200w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d-400x151.png 400w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d-800x301.png 800w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d-200x75.png 200w\" sizes=\"auto, (max-width: 1228px) 100vw, 1228px\" \/><\/p>\n<h3><span style=\"color: #0000ff;\"><strong>Haz\u0131r \u0130maj Yerine Kendi Docker \u0130maj\u0131m\u0131z<\/strong><\/span><\/h3>\n<div>\u0130lk olarak, bu tarz uygulamalar i\u00e7in klasik yolu izledim: `ubuntu:24.04` imaj\u0131, her job&#8217;\u0131n ba\u015f\u0131nda `apt-get install` ile derleyici + ara\u00e7lar, sonra `conan install`. \u00c7al\u0131\u015f\u0131yor \u2014 ama her pipeline dakikalarca ayn\u0131 paketleri indirip SDL3&#8217;\u00fc ba\u015ftan derliyor. SDL3&#8217;\u00fcn X11\/Wayland\/audio gibi bir d\u00fczine sistem ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 oldu\u011funu da hesaba kat\u0131nca bu s\u00fcre ciddi oranda uzuyor.<\/div>\n<div>Peki \u00e7\u00f6z\u00fcm ne?: t\u00fcm ara\u00e7lar\u0131 <strong>ve<\/strong> \u00f6nceden olu\u015fturulmu\u015f Conan cache&#8217;i i\u00e7eren \u00f6zel bir Docker imaj\u0131 olu\u015fturmak. Bunu da `debian:13-slim` tabanl\u0131, multi-stage bir `Dockerfile` ile \u00fc\u00e7 varyant \u00fcreterek yap\u0131yoruz:<\/div>\n<ul>\n<li><strong>builder<\/strong> \u2014 GCC 13, Clang 18 (format + tidy dahil), CMake, Ninja, Conan 2 ve SDL3&#8217;\u00fcn t\u00fcm sistem ba\u011f\u0131ml\u0131l\u0131klar\u0131. As\u0131l numara \u015furada: imaj build edilirken `conanfile.py` kopyalan\u0131p Debug + Release (Vulkan&#8217;l\u0131 varyantlar dahil) i\u00e7in `conan install &#8211;build=missing` \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor. Yani SDL3, spdlog, GTest ve arkada\u015flar\u0131 <strong>imaj\u0131n i\u00e7inde derlenmi\u015f halde<\/strong> bekliyor. <strong>Buras\u0131 \u00f6nemli, bir daha olu\u015fturulmuyor ya da indirilmiyor.<\/strong><\/li>\n<li><strong>ci<\/strong> \u2014 builder \u00fczerine coverage ara\u00e7lar\u0131 (lcov, gcovr) ve headless test i\u00e7in Mesa&#8217;n\u0131n yaz\u0131l\u0131m renderer&#8217;lar\u0131 ekleniyor (birazdan gelece\u011fiz).<\/li>\n<li><strong>windows-cross<\/strong>\u2014 builder \u00fczerine MinGW-w64; Linux container i\u00e7inde Windows `.exe` \u00fcretmek i\u00e7in. Bir uyar\u0131: bu hedefte Vulkan **desteklenmiyor** \u2014 `vulkan-loader` recipe&#8217;\u0131 Windows&#8217;ta `USE_MASM=True`&#8217;yu hardcode etti\u011fi i\u00e7in MinGW gcc derleyemiyor; `conanfile.py configure()` bu hedefte `with_vulkan`&#8217;\u0131 otomatik `False` \u00e7ekiyor. Windows&#8217;ta Vulkan gerekiyorsa native MSVC build kullan\u0131lmal\u0131, buna da y\u00f6nelik bir giri\u015fimim oldu ona da de\u011finece\u011fim.<\/li>\n<\/ul>\n<div>Sonu\u00e7 olarak, job i\u00e7indeki `conan install` art\u0131k cache&#8217;ten besleniyor ve bu ad\u0131mlar saniyeler s\u00fcr\u00fcyor. Branch bazl\u0131 CI cache&#8217;iyle u\u011fra\u015fmaya da gerek kalmad\u0131 \u2014 cache, imaj\u0131n kendisi.<\/div>\n<div><\/div>\n<div>Bu arada imajlar\u0131 sizler de build etmek zorunda de\u011filsin: haz\u0131r build&#8217;leri <a href=\"https:\/\/hub.docker.com\/r\/yazilimperver\/sdl-painter\/tags\">Docker Hub&#8217;da<\/a> da yay\u0131nl\u0131yorum \ud83d\ude42 `ci-v1.0` (Linux, ~2,2 GB) ile \u00e7ekip projeyi mount&#8217;layarak lokalde de CI ile birebir ayn\u0131 ortamda derleyebilirsin; MinGW cross-compile (`windows-cross-v1.0`) ve native MSVC (`windows-v1.0`) varyantlar\u0131 da orada \ud83d\ude09<\/div>\n<div><\/div>\n<div>\n<pre class=\"lang:yaml decode:true \">build:linux:debug:\r\n\u00a0 stage: build\r\n\u00a0 image: $CI_REGISTRY_IMAGE \u00a0 # \u00d6nceden haz\u0131rlanm\u0131\u015f Conan cache'li \u00f6zel imaj\r\n\u00a0 script:\r\n\u00a0 \u00a0 - |\r\n\u00a0 \u00a0 \u00a0 conan install . --output-folder=build\/linux-debug\/generators --build=missing \\\r\n\u00a0 \u00a0 \u00a0 \u00a0 -s build_type=Debug \\\r\n\u00a0 \u00a0 \u00a0 \u00a0 -o \"&amp;:with_vulkan=True\"\r\n\u00a0 \u00a0 - cmake --preset linux-debug\r\n\u00a0 \u00a0 - cmake --build --preset linux-debug<\/pre>\n<p>Dikkat: lokalde \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131z komutlar\u0131n ayn\u0131s\u0131. Preset&#8217;lerin meyvesi burada toplan\u0131yor.<\/p>\n<\/div>\n<div>Peki bu yakla\u015f\u0131m\u0131n bir handikap\u0131 yok mu? Var tabii: `conanfile.py`&#8217;a yeni ba\u011f\u0131ml\u0131l\u0131k ekledi\u011finde imaj\u0131 yeniden build edip registry&#8217;ye push etmemiz gerekiyor. Ama ba\u011f\u0131ml\u0131l\u0131k listesi her commit&#8217;te de\u011fi\u015fmiyor; haftada bir imaj g\u00fcncellemek, her pipeline&#8217;da 10 dakika beklemekten \u00e7ok daha ucuz.<\/div>\n<div>Docker&#8217;a y\u00f6nelik detay bilgiler i\u00e7in a\u015fa\u011f\u0131daki adreslere de g\u00f6z atabilirsiniz:<\/div>\n<ul>\n<li><a href=\"https:\/\/github.com\/yazilimperver\/sdl-painter\/blob\/main\/doc\/docker.md\">Docker A\u015famalar\u0131 \u2014 Kullan\u0131m K\u0131lavuzu<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/yazilimperver\/sdl-painter\/blob\/main\/doc\/docker-hub-deployment.md\">Docker Hub&#8217;a Docker \u0130maj Y\u00fckleme<\/a><\/li>\n<\/ul>\n<h3><span style=\"color: #0000ff;\"><strong>GPU&#8217;suz Makinede Grafik Testi: Headless CI<\/strong><\/span><\/h3>\n<div>CI runner&#8217;lar\u0131nda ne ekran var ne GPU. Peki SDL penceresi a\u00e7an, OpenGL context isteyen testler nas\u0131l ko\u015facak? \u0130ki ortam de\u011fi\u015fkeniyle:<\/div>\n<div><\/div>\n<div>\n<pre class=\"lang:yaml decode:true\">test:unit:\r\n\u00a0 stage: test\r\n\u00a0 needs: [\"build:linux:debug\"]\r\n\u00a0 variables:\r\n\u00a0 \u00a0 SDL_VIDEODRIVER: \"offscreen\"\r\n\u00a0 \u00a0 VK_ICD_FILENAMES: \"\/usr\/share\/vulkan\/icd.d\/lvp_icd.x86_64.json\"\r\n\u00a0 script:\r\n\u00a0 \u00a0 - ctest --preset linux-debug --output-on-failure<\/pre>\n<\/div>\n<ul>\n<li>`SDL_VIDEODRIVER=offscreen` \u2014 SDL3&#8217;e &#8220;pencereyi g\u00f6r\u00fcnmez \u00e7iz&#8221; diyor. X11\/Wayland gerekmiyor.<\/li>\n<li>`VK_ICD_FILENAMES` \u2014 Vulkan taraf\u0131nda Mesa&#8217;n\u0131n **lavapipe** s\u00fcr\u00fcc\u00fcs\u00fcn\u00fc i\u015faret ediyor: GPU olmadan Vulkan API&#8217;sini CPU \u00fczerinde sunan bir yaz\u0131l\u0131m renderer&#8217;\u0131. OpenGL kod yollar\u0131 i\u00e7in de imajda `MESA_LOADER_DRIVER_OVERRIDE=llvmpipe` ayarl\u0131.<\/li>\n<\/ul>\n<div>Bu \u00fc\u00e7l\u00fc sayesinde renderer testleri ger\u00e7ek bir grafik API&#8217;siyle, ama tamamen CPU \u00fczerinde ko\u015fuyor. Yava\u015f m\u0131? Evet. Birim test i\u00e7in yeterli mi? Fazlas\u0131yla.<\/div>\n<div><\/div>\n<h3><strong><span style=\"color: #0000ff;\">\u00a0ASan\/UBSan: Bellek Hatalar\u0131n\u0131 \u00dcretime S\u0131zmadan Yakala<\/span><\/strong><\/h3>\n<div>`test:unit:asan` job&#8217;\u0131 `linux-debug-asan` preset&#8217;iyle kendi build&#8217;ini yap\u0131p testleri AddressSanitizer + UndefinedBehaviorSanitizer aktif ko\u015fuyor. Use-after-free, buffer overflow, signed overflow gibi C++ klasikleri lokalde sessizce \u00e7al\u0131\u015f\u0131p CI&#8217;da k\u0131rm\u0131z\u0131 yan\u0131yor \u2014 tam da istedi\u011fimiz bu.<\/div>\n<div><\/div>\n<div>Bu job&#8217;da k\u00fc\u00e7\u00fck ama \u00f6nemli bir detay var:<\/div>\n<div><\/div>\n<pre class=\"lang:yaml decode:true \">test:unit:asan:\r\n\u00a0 needs: [] \u00a0 # hi\u00e7bir job'\u0131 bekleme, pipeline ba\u015f\u0131nda hemen ba\u015fla<\/pre>\n<div>GitLab&#8217;da `needs` ile pipeline bir Directed Acyclic Graph (DAG)&#8217;a d\u00f6n\u00fc\u015f\u00fcyor: ASan job&#8217;\u0131 kendi derlemesini yapt\u0131\u011f\u0131 i\u00e7in build a\u015famas\u0131n\u0131 beklemesine gerek yok. Bo\u015funa s\u0131rada bekletmek yerine pipeline&#8217;\u0131n ilk saniyesinde start al\u0131yor. Ayn\u0131 numara `quality:clang-format` i\u00e7in de ge\u00e7erli \u2014 o da yaln\u0131zca kaynak kodu okuyor, build \u00e7\u0131kt\u0131s\u0131na ihtiyac\u0131 yok. Ek bir kazan\u0131m daha: alakas\u0131z bir build job&#8217;\u0131 (mesela Windows cross-compile) patlad\u0131\u011f\u0131nda bu job&#8217;lar SKIP olmuyor, sonu\u00e7lar\u0131n\u0131 yine \u00fcretiyor.<\/div>\n<div><\/div>\n<h3><strong><span style=\"color: #0000ff;\">Quality: Format Zorunlu Gibi, Tidy Yol G\u00f6sterici<\/span><\/strong><\/h3>\n<pre class=\"lang:yaml decode:true \">quality:clang-format:\r\n\u00a0 stage: quality\r\n\u00a0 needs: []\r\n\u00a0 script:\r\n\u00a0 \u00a0 - find include\/ src\/ -name '*.h' -o -name '*.cpp' | xargs clang-format-18 --dry-run --Werror\r\n\u00a0 allow_failure: true\r\n\r\nquality:clang-tidy:\r\n\u00a0 stage: quality\r\n\u00a0 needs: [\"build:linux:debug\"]\r\n\u00a0 script:\r\n\u00a0 \u00a0 - find src\/ -name '*.cpp' | xargs clang-tidy-18 -p build\/linux-debug\/ --extra-arg=-Wno-unknown-warning-option\r\n\u00a0 allow_failure: true<\/pre>\n<div>\u0130kisi de \u015fu an `<strong>allow_failure: true<\/strong>` \u2014 pipeline&#8217;\u0131 k\u0131rm\u0131yor, sar\u0131 \u00fcnlemle uyar\u0131yor. Format (clang-format) i\u00e7in hedef bunu zamanla zorunluya \u00e7evirmek olabilir, \u015fimdilik bu \u015fekilde burakt\u0131m. Tidy (clang-tidy) ise statik analiz uyar\u0131lar\u0131 temizlendik\u00e7e s\u0131k\u0131la\u015facak. S\u0131f\u0131r\u0131nc\u0131 g\u00fcnden her \u015feyi `<strong>&#8211;Werror<\/strong>` yapmak kula\u011fa disiplinli geliyor ama pratikte &#8220;pipeline yine k\u0131rm\u0131z\u0131, bo\u015f ver&#8221; k\u00fclt\u00fcr\u00fcne davetiye \u00e7\u0131kar\u0131yor. \u00d6nce sinyali g\u00f6r\u00fcn\u00fcr k\u0131l, sonra zorunlu k\u0131l.<\/div>\n<div><\/div>\n<div>clang-tidy sat\u0131r\u0131ndaki `<strong>&#8211;extra-arg=-Wno-unknown-warning-option<\/strong>` da saatlerce u\u011fra\u015ft\u0131ran cinsten bir detay: `compile_commands.json` GCC ile \u00fcretildi\u011fi i\u00e7in i\u00e7inde GCC&#8217;ye \u00f6zel flag&#8217;ler var (<strong>`-Wduplicated-cond`<\/strong> gibi). clang-tidy bunlar\u0131 tan\u0131may\u0131nca her dosyada hata f\u0131rlat\u0131yor \u2014 ve bu s\u00fcr\u00fcc\u00fc seviyesi diagnostic, `.clang-tidy` dosyas\u0131ndaki `Checks` filtresiyle de kapat\u0131lam\u0131yor. Tek \u00e7are komut sat\u0131r\u0131ndan susturmak.<\/div>\n<h3><span style=\"color: #0000ff;\"><strong>Docs ve Release: Pipeline&#8217;\u0131n Tatl\u0131 Bonuslar\u0131<\/strong><\/span><\/h3>\n<div><strong>`pages`<\/strong> job&#8217;\u0131 yaln\u0131zca <strong>`main`<\/strong> branch&#8217;inde \u00e7al\u0131\u015f\u0131yor; Doxygen ile API dok\u00fcmantasyonunu \u00fcretip GitLab Pages&#8217;e yay\u0131nl\u0131yor. Doxygen yap\u0131land\u0131rmas\u0131 job i\u00e7inde dinamik \u00fcretiliyor \u2014 proje versiyonunu `CMakeLists.txt`&#8217;den `grep`&#8217;liyor, tema olarak <a href=\"https:\/\/github.com\/jothepro\/doxygen-awesome-css\">doxygen-awesome-css<\/a>\u00a0kullan\u0131yor. Her merge&#8217;de dok\u00fcmantasyon kendi kendini g\u00fcncelliyor; &#8220;doc g\u00fcncellemeyi unuttuk&#8221; diye bir \u015fey yok.<\/div>\n<div><\/div>\n<div><strong>`release:publish` <\/strong>ise `vX.Y.Z` format\u0131nda bir tag push&#8217;land\u0131\u011f\u0131nda devreye giriyor:<\/div>\n<div><\/div>\n<div>\n<pre class=\"lang:yaml decode:true\">release:publish:\r\n\u00a0 stage: release\r\n\u00a0 rules:\r\n\u00a0 \u00a0 - if: $CI_COMMIT_TAG =~ \/^v\\d+\\.\\d+\\.\\d+$\/\r\n\u00a0 release:\r\n\u00a0 \u00a0 tag_name: $CI_COMMIT_TAG\r\n\u00a0 \u00a0 name: \"SDLPainter $CI_COMMIT_TAG\"\r\n\u00a0 \u00a0 description: .\/CHANGELOG.md<\/pre>\n<\/div>\n<div>Tag att\u0131\u011f\u0131n\u0131zda, release notlar\u0131n\u0131 `CHANGELOG.md`&#8217;den alan bir GitLab Release otomatik olu\u015fmakta.<\/div>\n<div><\/div>\n<h3><span style=\"color: #0000ff;\"><strong>Ayn\u0131 Repo \u0130ki Pipeline: GitLab + GitHub Actions<\/strong><\/span><\/h3>\n<div>Proje GitLab&#8217;da ya\u015f\u0131yor ama ayn\u0131 pipeline&#8217;\u0131 GitHub Actions&#8217;a da ta\u015f\u0131d\u0131m (`.github\/workflows\/ci.yml`). Hatta ba\u015fta da bahsetti\u011fim gibi art\u0131k, github taraf\u0131na daha \u00e7ok bak\u0131yorum \ud83d\ude42<\/div>\n<div>Job isimlerini de bile bilerek ayn\u0131 tuttum (`build:linux:debug`, `test:unit:asan`&#8230;) \u2014 iki aray\u00fczde de ayn\u0131 ad\u0131mlar\u0131 g\u00f6r\u00fcyorsun. Linux job&#8217;lar\u0131 yine ayn\u0131 Docker imaj\u0131n\u0131 kullan\u0131yor; yani Conan cache avantaj\u0131 GitHub taraf\u0131nda da ge\u00e7erli.<\/div>\n<div><\/div>\n<div>\u0130ki \u00f6nemli fark var:<\/div>\n<ul>\n<li>Birincisi <strong>Windows stratejisi.<\/strong>\u00a0GitLab&#8217;da Windows build&#8217;i Linux container i\u00e7inde MinGW-w64 cross-compile ile yap\u0131l\u0131yordu (SaaS Windows runner&#8217;larla u\u011fra\u015fmamak i\u00e7in). GitHub&#8217;da ise `windows-latest` runner&#8217;\u0131 haz\u0131r geldi\u011finden native MSVC&#8217;i kullanabiliyoruz:<\/li>\n<\/ul>\n<pre class=\"lang:yaml decode:true \">build-windows-release:\r\n\u00a0 runs-on: windows-latest\r\n\u00a0 steps:\r\n\u00a0 \u00a0 - uses: ilammy\/msvc-dev-cmd@v1 \u00a0 \u00a0 # MSVC ortam\u0131n\u0131 haz\u0131rla\r\n\u00a0 \u00a0 - name: Cache Conan packages\r\n\u00a0 \u00a0 \u00a0 uses: actions\/cache@v4\r\n\u00a0 \u00a0 \u00a0 with:\r\n\u00a0 \u00a0 \u00a0 \u00a0 path: ${{ env.CONAN_HOME }}\r\n\u00a0 \u00a0 \u00a0 \u00a0 key: conan-windows-release-${{ hashFiles('conanfile.py') }}<\/pre>\n<div>Windows&#8217;ta \u00f6zel imaj olmad\u0131\u011f\u0131ndan Conan cache&#8217;i `actions\/cache` ile, anahtar\u0131 `conanfile.py`&#8217;\u0131n hash&#8217;ine ba\u011flayarak \u00e7\u00f6z\u00fcyoruz: ba\u011f\u0131ml\u0131l\u0131klar de\u011fi\u015fmedik\u00e7e cache ge\u00e7erli, de\u011fi\u015fti\u011fi commit&#8217;te otomatik tazeleniyor.<\/div>\n<ul>\n<li>\u0130kinci fark ise:<\/li>\n<\/ul>\n<div><strong>Concurrency. <\/strong>GitHub taraf\u0131nda art arda push&#8217;larda eski pipeline&#8217;\u0131 otomatik iptal eden bir ayar var \u2014 bu sayede, runner dakikas\u0131 s\u0131n\u0131rl\u0131ysa bizlere avantaj sa\u011fl\u0131yor ki bu \u00f6nemli bir ayr\u0131nt\u0131.<\/div>\n<pre class=\"lang:yaml decode:true\">concurrency:\r\n\u00a0 group: ${{ github.workflow }}-${{ github.ref }}\r\n\u00a0 cancel-in-progress: ${{ !startsWith(github.ref, 'refs\/tags\/') }}<\/pre>\n<div>Tag pipeline&#8217;lar\u0131 bilin\u00e7li olarak iptal kapsam\u0131 d\u0131\u015f\u0131nda \u2014 yar\u0131m kalan bir release istemeyiz.<\/div>\n<div><\/div>\n<div>Sonu\u00e7 olarak github pipelinem\u0131z:<\/div>\n<p id=\"CMHggVE\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3172 \" src=\"https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a7223e0ed6a2.png\" alt=\"\" width=\"898\" height=\"329\" srcset=\"https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a7223e0ed6a2.png 1746w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a7223e0ed6a2-300x110.png 300w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a7223e0ed6a2-1024x375.png 1024w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a7223e0ed6a2-768x282.png 768w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a7223e0ed6a2-1536x563.png 1536w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a7223e0ed6a2-500x183.png 500w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a7223e0ed6a2-150x55.png 150w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a7223e0ed6a2-1200x440.png 1200w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a7223e0ed6a2-400x147.png 400w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a7223e0ed6a2-800x293.png 800w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a7223e0ed6a2-200x73.png 200w\" sizes=\"auto, (max-width: 898px) 100vw, 898px\" \/><\/p>\n<div>\n<p>Ve gitlab pipelinem\u0131z:<\/p>\n<p id=\"ACzQqoU\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3173 \" src=\"https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a72240150322.png\" alt=\"\" width=\"939\" height=\"163\" srcset=\"https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a72240150322.png 1629w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a72240150322-300x52.png 300w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a72240150322-1024x178.png 1024w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a72240150322-768x133.png 768w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a72240150322-1536x267.png 1536w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a72240150322-500x87.png 500w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a72240150322-150x26.png 150w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a72240150322-1200x208.png 1200w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a72240150322-400x69.png 400w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a72240150322-800x139.png 800w, https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a72240150322-200x35.png 200w\" sizes=\"auto, (max-width: 939px) 100vw, 939px\" \/><\/p>\n<\/div>\n<h2><span style=\"color: #0000ff;\"><strong>Sonu\u00e7<\/strong><\/span><\/h2>\n<div>CI\/CD konulara\u0131na y\u00f6nelik \u00e7\u0131kar\u0131lacak en \u00f6nemli ders: <strong>pipeline&#8217;\u0131 h\u0131zl\u0131 tut, hatalar\u0131 \u00a0g\u00f6r\u00fcn\u00fcr k\u0131l, lokal ile CI&#8217;\u0131 hizala,<\/strong>\u00a0gerisi art\u0131k detay kal\u0131yor \ud83d\ude42<\/div>\n<div><\/div>\n<div>Pratikte bunu sa\u011flayan \u00fc\u00e7 \u00f6nemli etken var: \u00f6nceden haz\u0131rlanm\u0131\u015f Conan cache&#8217;li \u00f6zel Docker imajlar\u0131 (dakikalar\u0131, yakla\u015f\u0131k 30 dk, saniyeye indiren as\u0131l kahraman), CMake Presets ile lokal\u2013CI komut e\u015fitli\u011fi ve `needs` DAG&#8217;\u0131 ile ba\u011f\u0131ms\u0131z job&#8217;lar\u0131n pipeline ba\u015f\u0131nda hemen ko\u015fmas\u0131. Bu altyap\u0131n\u0131n \u00e7o\u011fu SDLPainter&#8217;dan ba\u011f\u0131ms\u0131z; s\u0131radaki C++ projenizde, sizler de ayn\u0131s\u0131n\u0131 rahatl\u0131kla uygulayabilirsiniz. Uygularsan\u0131z veya yard\u0131ma ihtiyac\u0131n\u0131z olursa,beni de haberdar etmeyi unutmay\u0131n!<\/div>\n<div><\/div>\n<div>\u0130lgili repolar i\u00e7in a\u015fa\u011f\u0131daki adreslere ba\u015fvurabilirsiniz. \u015eimdilik aktif olarak github&#8217;a commitleri yapaca\u011f\u0131m. Bununla birlikte hem gitlab hem github CI\/CD betikleri ayn\u0131 repoda ya\u015fayabiliyor.<\/div>\n<div><\/div>\n<div>Kaynak kod:<\/div>\n<ul>\n<li><a href=\"https:\/\/gitlab.com\/yazilimperver\/sdl-painter\">GitLab Repo<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/yazilimperver\/sdl-painter\">GitHub Repo<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba dostlar! Bir \u00f6nceki yaz\u0131mda CI\/CD ile ilgili konulara \u00e7ok de\u011finemedi\u011fimden ve bu konular\u0131 ayr\u0131 bir yaz\u0131 olarak sizler ile payla\u015faca\u011f\u0131mdan bahsetmi\u015ftim. \u0130\u015fte bu yaz\u0131 onu v\u00fccut bulmu\u015f hali. Altyap\u0131y\u0131 kurarken en \u00e7ok vakit alan k\u0131s\u0131mlardan birisi de CI\/CD olabiliyor; bir\u00e7ok kendine has hususu i\u00e7erdi\u011fi i\u00e7in ben de buraya ta\u015f\u0131d\u0131m. G\u00fczel ve \u00f6nemli taraf\u0131 da&#8230; <a class=\"more-link\" href=\"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"dsgo_overlay_header":false,"dsgo_overlay_header_text_color":"","dsgo_overlay_skip_top_bar":false,"_designsetgo_exclude_llms":false,"footnotes":""},"categories":[10,41,188],"tags":[1219,13,1037,155,260,1034,1211,1220,51,829,1128,1214,1218],"class_list":["post-3170","post","type-post","status-publish","format-standard","hentry","category-c","category-modern-c","category-yazilim-muhendisligi","tag-agents","tag-c","tag-ci-cd","tag-cmake","tag-conan","tag-devops","tag-docker","tag-docker-hub","tag-github","tag-gitlab","tag-jobs","tag-sdl-painter","tag-stages"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>sdl-painter - Proje Altyap\u0131s\u0131(faz 0) - CI\/CD - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"sdl-painter - Proje Altyap\u0131s\u0131(faz 0) - CI\/CD - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Merhaba dostlar! Bir \u00f6nceki yaz\u0131mda CI\/CD ile ilgili konulara \u00e7ok de\u011finemedi\u011fimden ve bu konular\u0131 ayr\u0131 bir yaz\u0131 olarak sizler ile payla\u015faca\u011f\u0131mdan bahsetmi\u015ftim. \u0130\u015fte bu yaz\u0131 onu v\u00fccut bulmu\u015f hali. Altyap\u0131y\u0131 kurarken en \u00e7ok vakit alan k\u0131s\u0131mlardan birisi de CI\/CD olabiliyor; bir\u00e7ok kendine has hususu i\u00e7erdi\u011fi i\u00e7in ben de buraya ta\u015f\u0131d\u0131m. G\u00fczel ve \u00f6nemli taraf\u0131 da... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-04T18:28:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-08T10:06:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1867\" \/>\n\t<meta property=\"og:image:height\" content=\"703\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/index.php\\\/2026\\\/08\\\/04\\\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/index.php\\\/2026\\\/08\\\/04\\\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\\\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/#\\\/schema\\\/person\\\/a5bcaa14bf9a1bed6607d8dbe1071383\"},\"headline\":\"sdl-painter &#8211; Proje Altyap\u0131s\u0131(faz 0) &#8211; CI\\\/CD\",\"datePublished\":\"2026-08-04T18:28:14+00:00\",\"dateModified\":\"2026-08-08T10:06:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/index.php\\\/2026\\\/08\\\/04\\\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\\\/\"},\"wordCount\":1673,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/#\\\/schema\\\/person\\\/534a27860d56170658018ac4c6f1af16\"},\"image\":{\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/index.php\\\/2026\\\/08\\\/04\\\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/yazilimperver.net\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/img_6a722162cf24d.png\",\"keywords\":[\"agents\",\"c++\",\"CI\\\/CD\",\"CMAKE\",\"conan\",\"devops\",\"docker\",\"docker-hub\",\"Github\",\"gitlab\",\"jobs\",\"sdl-painter\",\"stages\"],\"articleSection\":[\"C++\",\"Modern C++\",\"Yaz\u0131l\u0131m M\u00fchendisli\u011fi\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/yazilimperver.net\\\/index.php\\\/2026\\\/08\\\/04\\\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/index.php\\\/2026\\\/08\\\/04\\\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\\\/\",\"url\":\"https:\\\/\\\/yazilimperver.net\\\/index.php\\\/2026\\\/08\\\/04\\\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\\\/\",\"name\":\"sdl-painter - Proje Altyap\u0131s\u0131(faz 0) - CI\\\/CD - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/index.php\\\/2026\\\/08\\\/04\\\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/index.php\\\/2026\\\/08\\\/04\\\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/yazilimperver.net\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/img_6a722162cf24d.png\",\"datePublished\":\"2026-08-04T18:28:14+00:00\",\"dateModified\":\"2026-08-08T10:06:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/index.php\\\/2026\\\/08\\\/04\\\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/yazilimperver.net\\\/index.php\\\/2026\\\/08\\\/04\\\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/index.php\\\/2026\\\/08\\\/04\\\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\\\/#primaryimage\",\"url\":\"https:\\\/\\\/yazilimperver.net\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/img_6a722162cf24d.png\",\"contentUrl\":\"https:\\\/\\\/yazilimperver.net\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/img_6a722162cf24d.png\",\"width\":1867,\"height\":703},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/index.php\\\/2026\\\/08\\\/04\\\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\\\/\\\/yazilimperver.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"sdl-painter &#8211; Proje Altyap\u0131s\u0131(faz 0) &#8211; CI\\\/CD\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/#website\",\"url\":\"https:\\\/\\\/yazilimperver.net\\\/\",\"name\":\"Yaz\u0131l\u0131mperver'in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/#\\\/schema\\\/person\\\/534a27860d56170658018ac4c6f1af16\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/yazilimperver.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/#\\\/schema\\\/person\\\/534a27860d56170658018ac4c6f1af16\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/wp-content\\\/uploads\\\/2018\\\/04\\\/cropped-OnlyIcon-1.png\",\"url\":\"https:\\\/\\\/yazilimperver.net\\\/wp-content\\\/uploads\\\/2018\\\/04\\\/cropped-OnlyIcon-1.png\",\"contentUrl\":\"https:\\\/\\\/yazilimperver.net\\\/wp-content\\\/uploads\\\/2018\\\/04\\\/cropped-OnlyIcon-1.png\",\"width\":512,\"height\":512,\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/wp-content\\\/uploads\\\/2018\\\/04\\\/cropped-OnlyIcon-1.png\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/yazilimperver.net\\\/#\\\/schema\\\/person\\\/a5bcaa14bf9a1bed6607d8dbe1071383\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"description\":\"\u00d6\u011frenmeyi ve payla\u015fmay\u0131 seven bir yaz\u0131l\u0131mperver :)\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"sdl-painter - Proje Altyap\u0131s\u0131(faz 0) - CI\/CD - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/","og_locale":"tr_TR","og_type":"article","og_title":"sdl-painter - Proje Altyap\u0131s\u0131(faz 0) - CI\/CD - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Merhaba dostlar! Bir \u00f6nceki yaz\u0131mda CI\/CD ile ilgili konulara \u00e7ok de\u011finemedi\u011fimden ve bu konular\u0131 ayr\u0131 bir yaz\u0131 olarak sizler ile payla\u015faca\u011f\u0131mdan bahsetmi\u015ftim. \u0130\u015fte bu yaz\u0131 onu v\u00fccut bulmu\u015f hali. Altyap\u0131y\u0131 kurarken en \u00e7ok vakit alan k\u0131s\u0131mlardan birisi de CI\/CD olabiliyor; bir\u00e7ok kendine has hususu i\u00e7erdi\u011fi i\u00e7in ben de buraya ta\u015f\u0131d\u0131m. G\u00fczel ve \u00f6nemli taraf\u0131 da... Continue reading &#8594;","og_url":"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2026-08-04T18:28:14+00:00","article_modified_time":"2026-08-08T10:06:32+00:00","og_image":[{"width":1867,"height":703,"url":"https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d.png","type":"image\/png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"9 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/#article","isPartOf":{"@id":"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/yazilimperver.net\/#\/schema\/person\/a5bcaa14bf9a1bed6607d8dbe1071383"},"headline":"sdl-painter &#8211; Proje Altyap\u0131s\u0131(faz 0) &#8211; CI\/CD","datePublished":"2026-08-04T18:28:14+00:00","dateModified":"2026-08-08T10:06:32+00:00","mainEntityOfPage":{"@id":"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/"},"wordCount":1673,"commentCount":0,"publisher":{"@id":"https:\/\/yazilimperver.net\/#\/schema\/person\/534a27860d56170658018ac4c6f1af16"},"image":{"@id":"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/#primaryimage"},"thumbnailUrl":"https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d.png","keywords":["agents","c++","CI\/CD","CMAKE","conan","devops","docker","docker-hub","Github","gitlab","jobs","sdl-painter","stages"],"articleSection":["C++","Modern C++","Yaz\u0131l\u0131m M\u00fchendisli\u011fi"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/","url":"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/","name":"sdl-painter - Proje Altyap\u0131s\u0131(faz 0) - CI\/CD - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/yazilimperver.net\/#website"},"primaryImageOfPage":{"@id":"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/#primaryimage"},"image":{"@id":"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/#primaryimage"},"thumbnailUrl":"https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d.png","datePublished":"2026-08-04T18:28:14+00:00","dateModified":"2026-08-08T10:06:32+00:00","breadcrumb":{"@id":"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/#primaryimage","url":"https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d.png","contentUrl":"https:\/\/yazilimperver.net\/wp-content\/uploads\/2026\/08\/img_6a722162cf24d.png","width":1867,"height":703},{"@type":"BreadcrumbList","@id":"https:\/\/yazilimperver.net\/index.php\/2026\/08\/04\/sdl-painter-proje-altyapisi-devam-faz-0-ci-cd\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/yazilimperver.net\/"},{"@type":"ListItem","position":2,"name":"sdl-painter &#8211; Proje Altyap\u0131s\u0131(faz 0) &#8211; CI\/CD"}]},{"@type":"WebSite","@id":"https:\/\/yazilimperver.net\/#website","url":"https:\/\/yazilimperver.net\/","name":"Yaz\u0131l\u0131mperver'in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/yazilimperver.net\/#\/schema\/person\/534a27860d56170658018ac4c6f1af16"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/yazilimperver.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/yazilimperver.net\/#\/schema\/person\/534a27860d56170658018ac4c6f1af16","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/yazilimperver.net\/wp-content\/uploads\/2018\/04\/cropped-OnlyIcon-1.png","url":"https:\/\/yazilimperver.net\/wp-content\/uploads\/2018\/04\/cropped-OnlyIcon-1.png","contentUrl":"https:\/\/yazilimperver.net\/wp-content\/uploads\/2018\/04\/cropped-OnlyIcon-1.png","width":512,"height":512,"caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/yazilimperver.net\/wp-content\/uploads\/2018\/04\/cropped-OnlyIcon-1.png"}},{"@type":"Person","@id":"https:\/\/yazilimperver.net\/#\/schema\/person\/a5bcaa14bf9a1bed6607d8dbe1071383","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g","caption":"yaz\u0131l\u0131mperver"},"description":"\u00d6\u011frenmeyi ve payla\u015fmay\u0131 seven bir yaz\u0131l\u0131mperver :)"}]}},"_links":{"self":[{"href":"https:\/\/yazilimperver.net\/index.php\/wp-json\/wp\/v2\/posts\/3170","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yazilimperver.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yazilimperver.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yazilimperver.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yazilimperver.net\/index.php\/wp-json\/wp\/v2\/comments?post=3170"}],"version-history":[{"count":3,"href":"https:\/\/yazilimperver.net\/index.php\/wp-json\/wp\/v2\/posts\/3170\/revisions"}],"predecessor-version":[{"id":3200,"href":"https:\/\/yazilimperver.net\/index.php\/wp-json\/wp\/v2\/posts\/3170\/revisions\/3200"}],"wp:attachment":[{"href":"https:\/\/yazilimperver.net\/index.php\/wp-json\/wp\/v2\/media?parent=3170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yazilimperver.net\/index.php\/wp-json\/wp\/v2\/categories?post=3170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yazilimperver.net\/index.php\/wp-json\/wp\/v2\/tags?post=3170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}