<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mühendislik on Denomas Handbook</title><link>https://handbook.orneksirket.com/engineering/</link><description>Recent content in Mühendislik on Denomas Handbook</description><generator>Hugo</generator><language>tr</language><atom:link href="https://handbook.orneksirket.com/engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>Açık Kaynak Stratejisi</title><link>https://handbook.orneksirket.com/engineering/open-source-strategy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://handbook.orneksirket.com/engineering/open-source-strategy/</guid><description>&lt;h1 id="açık-kaynak-stratejisi"&gt;Açık Kaynak Stratejisi&lt;/h1&gt;
&lt;p&gt;Denomas, açık kaynaklı projelerin üzerinde katma değer yaratan bir şirkettir. Açık kaynak ekosistemine aktif katkı sağlamak stratejik bir önceliktir.&lt;/p&gt;
&lt;h2 id="upstream-first-yaklaşım"&gt;Upstream-First Yaklaşım&lt;/h2&gt;
&lt;p&gt;Bir açık kaynaklı projede bug fix veya iyileştirme yaptığımızda:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Önce upstream'e gönder&lt;/strong&gt; — Değişikliği orijinal projeye PR/MR olarak gönder&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kabul edilene kadar fork'ta tut&lt;/strong&gt; — Upstream kabul edene kadar kendi fork'umuzda kullan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Upstream kabul edince fork'u senkronize et&lt;/strong&gt; — Fork'taki özel patch'i kaldır&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bu yaklaşım:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Toplulukla ilişkimizi güçlendirir&lt;/li&gt;
&lt;li&gt;Fork bakım yükünü azaltır&lt;/li&gt;
&lt;li&gt;Ürün kalitesini artırır&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fork-kuralları"&gt;Fork Kuralları&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Durum&lt;/th&gt;
 &lt;th&gt;Aksiyon&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Bug fix&lt;/td&gt;
 &lt;td&gt;Upstream'e PR + fork'ta geçici patch&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Yeni özellik (genel)&lt;/td&gt;
 &lt;td&gt;Upstream'e PR&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Denomas'a özel entegrasyon&lt;/td&gt;
 &lt;td&gt;Sadece fork'ta, ayrı katman&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Güvenlik yaması&lt;/td&gt;
 &lt;td&gt;Upstream'e sorumlu ifşa + fork'ta patch&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="td-alert td-alert--md alert alert-info" role="alert"&gt;&lt;div class="td-alert-heading alert-heading" role="heading"&gt;ürünleşme yaklaşımı İlişkisi&lt;/div&gt;
 &lt;div class="td-alert-body"&gt;
 &lt;p&gt;Fork'lar, Mühendislik'nin COPY fazına karşılık gelir. COMBINE ve TRANSFORM fazları ise Denomas'a özel katma değeri temsil eder. Bu katmanlar upstream'e gönderilmez.&lt;/p&gt;</description></item><item><title>CI/CD Pipeline</title><link>https://handbook.orneksirket.com/engineering/ci-cd-pipeline/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://handbook.orneksirket.com/engineering/ci-cd-pipeline/</guid><description>&lt;h1 id="cicd-pipeline"&gt;CI/CD Pipeline&lt;/h1&gt;
&lt;p&gt;Denomas, tüm projelerinde &lt;strong&gt;GitLab CI/CD&lt;/strong&gt; kullanır. Pipeline, kodun commit edilmesinden üretim ortamına deploy edilmesine kadar tüm aşamaları otomatize eder. CI/CD altyapısı &lt;code&gt;code.denomas.com&lt;/code&gt; ve &lt;code&gt;code.ilimteknoloji.com&lt;/code&gt; adreslerindeki self-hosted GitLab instance'ları üzerinde çalışır.&lt;/p&gt;
&lt;h2 id="pipeline-aşamaları"&gt;Pipeline Aşamaları&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────────┐ ┌──────────────┐
│ lint │ → │ test │ → │ build │ → │ scan │ → │ deploy-staging │ → │ deploy-prod │
└──────────┘ └──────────┘ └──────────┘ └──────────┘ └────────────────┘ └──────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="1-lint"&gt;1. lint&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pre-commit hook doğrulaması (&lt;code&gt;pre-commit run --all-files&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Python: &lt;strong&gt;ruff&lt;/strong&gt; lint + &lt;strong&gt;ruff-format&lt;/strong&gt; kontrolü + &lt;strong&gt;mypy&lt;/strong&gt; tip kontrolü&lt;/li&gt;
&lt;li&gt;JavaScript: &lt;strong&gt;ESLint&lt;/strong&gt; (airbnb-base preset)&lt;/li&gt;
&lt;li&gt;YAML/JSON format kontrolü (&lt;strong&gt;yamllint&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Ansible: &lt;strong&gt;ansible-lint&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Docker: &lt;strong&gt;hadolint&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Shell: &lt;strong&gt;shellcheck&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Docstring kontrolü (public fonksiyonlarda zorunlu)&lt;/li&gt;
&lt;li&gt;Conventional Commit format kontrolü&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-test"&gt;2. test&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Birim testleri&lt;/strong&gt; — &lt;code&gt;pytest --cov=src --cov-fail-under=80&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entegrasyon testleri&lt;/strong&gt; — API endpoint testleri, veritabanı migration testleri&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Odoo testleri&lt;/strong&gt; — Odoo test framework ile modül testleri (&lt;code&gt;odoo-bin --test-enable&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ansible testleri&lt;/strong&gt; — &lt;code&gt;molecule test&lt;/code&gt; ile rol doğrulaması&lt;/li&gt;
&lt;li&gt;Kapsam raporu oluşturma (Cobertura formatı, GitLab MR'da görselleştirme)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-build"&gt;3. build&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Docker image oluşturma (multi-stage build)&lt;/li&gt;
&lt;li&gt;Semantic versiyon etiketi (&lt;code&gt;$CI_COMMIT_TAG&lt;/code&gt; veya &lt;code&gt;$CI_COMMIT_SHORT_SHA&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Docker image'ı GitLab Container Registry'ye push&lt;/li&gt;
&lt;li&gt;Ansible artifact'ları paketleme (roller + playbook'lar)&lt;/li&gt;
&lt;li&gt;Hugo site build (handbook ve website projeleri için)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-scan"&gt;4. scan&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SAST:&lt;/strong&gt; Bandit (Python), Semgrep (&lt;code&gt;p/owasp-top-ten&lt;/code&gt; ruleset), GitLab SAST template&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependency Scan:&lt;/strong&gt; Trivy (container + dependency CVE taraması)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lisans Kontrolü:&lt;/strong&gt; Uyumsuz lisans tespiti (GPL kontrol)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Container Image Scan:&lt;/strong&gt; Trivy ile Docker image güvenlik taraması&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secret Detection:&lt;/strong&gt; GitLab Secret Detection template&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-deploy-staging"&gt;5. deploy-staging&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ansible playbook ile staging ortamına deploy (&lt;code&gt;ansible-playbook deploy-staging.yml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Otomatik smoke testleri (&lt;code&gt;ansible-playbook smoke-test.yml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Performans testi (&lt;strong&gt;k6&lt;/strong&gt; ile yük testi)&lt;/li&gt;
&lt;li&gt;Staging URL'i MR'a yorum olarak eklenir&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-deploy-prod"&gt;6. deploy-prod&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://handbook.orneksirket.com/engineering/release-process/"&gt;Dual-track deployment&lt;/a&gt;
 stratejisine göre&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Track 1 (SaaS):&lt;/strong&gt; &lt;code&gt;main&lt;/code&gt; merge sonrası &lt;code&gt;when: manual&lt;/code&gt; onay → canary deploy → kademeli rollout&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Track 2 (Self-Managed):&lt;/strong&gt; Release tag'i sonrası paketleme ve dağıtım&lt;/li&gt;
&lt;li&gt;Production deploy sonrası otomatik health check&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tam-gitlab-ciyml-örneği"&gt;Tam &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; Örneği&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# .gitlab-ci.yml — Denomas standart pipeline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;python:3.10-slim&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;variables&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Genel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PIP_CACHE_DIR&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;$CI_PROJECT_DIR/.cache/pip&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PRE_COMMIT_HOME&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;$CI_PROJECT_DIR/.cache/pre-commit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Docker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DOCKER_IMAGE&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;$CI_REGISTRY_IMAGE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DOCKER_TAG&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;$CI_COMMIT_SHORT_SHA&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Deployment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ANSIBLE_INVENTORY&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;inventory/$CI_ENVIRONMENT_NAME&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ANSIBLE_FORCE_COLOR&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# SAST&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;SAST_EXCLUDED_PATHS&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;tests/,migrations/,docs/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;SECURE_LOG_LEVEL&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;warn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;cache&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;key&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${CI_COMMIT_REF_SLUG}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;paths&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;.cache/pip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;.cache/pre-commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;.venv/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;stages&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;lint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;scan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;deploy-staging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;deploy-prod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ─── LINT ─────────────────────────────────────────────&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;lint:pre-commit&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;stage&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;lint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;pip install pre-commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;pre-commit run --all-files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rules&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_PIPELINE_SOURCE == &amp;#34;merge_request_event&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_COMMIT_BRANCH == &amp;#34;develop&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;lint:mypy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;stage&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;lint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;pip install -r requirements-dev.txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;mypy src/ --ignore-missing-imports&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rules&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_PIPELINE_SOURCE == &amp;#34;merge_request_event&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;allow_failure&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ─── TEST ─────────────────────────────────────────────&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;test:unit&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;stage&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;postgres:15-alpine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;redis:7-alpine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;variables&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_DB&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;test_db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_USER&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;test_user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;POSTGRES_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;$CI_DB_PASSWORD&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DATABASE_URL&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;postgresql://test_user:$CI_DB_PASSWORD@postgres:5432/test_db&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;REDIS_URL&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;redis://redis:6379/0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;pip install -r requirements-dev.txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;pytest --cov=src --cov-report=xml --cov-report=term --cov-fail-under=80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;artifacts&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;reports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;coverage_report&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;coverage_format&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;cobertura&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;path&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;coverage.xml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;expire_in&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;days&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rules&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_PIPELINE_SOURCE == &amp;#34;merge_request_event&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_COMMIT_BRANCH == &amp;#34;develop&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;test:integration&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;stage&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;postgres:15-alpine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;redis:7-alpine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;pip install -r requirements-dev.txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;pytest tests/integration/ -v --tb=short&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rules&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_PIPELINE_SOURCE == &amp;#34;merge_request_event&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ─── BUILD ────────────────────────────────────────────&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;build:docker&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;stage&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;docker:24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;docker:24.0-dind&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;docker build -t $DOCKER_IMAGE:$DOCKER_TAG -t $DOCKER_IMAGE:latest .&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;docker push $DOCKER_IMAGE:$DOCKER_TAG&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;docker push $DOCKER_IMAGE:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rules&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_COMMIT_BRANCH == &amp;#34;develop&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_COMMIT_BRANCH == &amp;#34;main&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_COMMIT_TAG&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ─── SCAN ─────────────────────────────────────────────&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;scan:bandit&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;stage&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;scan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;pip install bandit[toml]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;bandit -c pyproject.toml -r src/ -f json -o bandit-report.json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;artifacts&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;paths&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;bandit-report.json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;expire_in&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;days&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rules&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_PIPELINE_SOURCE == &amp;#34;merge_request_event&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;scan:semgrep&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;stage&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;scan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;returntocorp/semgrep&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;semgrep --config=p/owasp-top-ten --config=p/python --json -o semgrep-report.json src/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;artifacts&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;paths&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;semgrep-report.json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;expire_in&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;days&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rules&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_PIPELINE_SOURCE == &amp;#34;merge_request_event&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;scan:trivy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;stage&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;scan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;aquasec/trivy:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;entrypoint&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;trivy image --exit-code 1 --severity HIGH,CRITICAL $DOCKER_IMAGE:$DOCKER_TAG&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rules&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_COMMIT_BRANCH == &amp;#34;develop&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_COMMIT_BRANCH == &amp;#34;main&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;include&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;template&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Security/SAST.gitlab-ci.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;template&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Security/Secret-Detection.gitlab-ci.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ─── DEPLOY STAGING ───────────────────────────────────&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;deploy_staging&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;stage&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;deploy-staging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible/ansible-runner:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;ansible-playbook deploy-staging.yml -e &amp;#34;docker_tag=$DOCKER_TAG&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;ansible-playbook smoke-test.yml -e &amp;#34;environment=staging&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;staging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;url&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://staging.denomas.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rules&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_COMMIT_BRANCH == &amp;#34;staging&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ─── DEPLOY PRODUCTION ───────────────────────────────&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;deploy_canary&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;stage&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;deploy-prod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible/ansible-runner:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;ansible-playbook deploy-canary.yml -e &amp;#34;docker_tag=$DOCKER_TAG canary_weight=5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;canary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;url&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://canary.denomas.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rules&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_COMMIT_BRANCH == &amp;#34;main&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;manual&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;deploy_production&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;stage&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;deploy-prod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible/ansible-runner:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;ansible-playbook deploy-production.yml -e &amp;#34;docker_tag=$DOCKER_TAG&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;ansible-playbook smoke-test.yml -e &amp;#34;environment=production&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;production&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;url&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://denomas.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rules&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;if&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;$CI_COMMIT_BRANCH == &amp;#34;main&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;manual&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;needs&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;deploy_canary&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ortam-değişkenleri-cicd-variables"&gt;Ortam Değişkenleri (CI/CD Variables)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Değişken&lt;/th&gt;
 &lt;th&gt;Tür&lt;/th&gt;
 &lt;th&gt;Kapsam&lt;/th&gt;
 &lt;th&gt;Açıklama&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CI_REGISTRY_USER&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Protected&lt;/td&gt;
 &lt;td&gt;Tüm projeler&lt;/td&gt;
 &lt;td&gt;GitLab Container Registry kullanıcı&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CI_REGISTRY_PASSWORD&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Protected, Masked&lt;/td&gt;
 &lt;td&gt;Tüm projeler&lt;/td&gt;
 &lt;td&gt;GitLab Container Registry parola&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CI_DB_PASSWORD&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Protected, Masked&lt;/td&gt;
 &lt;td&gt;Tüm projeler&lt;/td&gt;
 &lt;td&gt;Test veritabanı parolası&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ANSIBLE_SSH_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Protected, File&lt;/td&gt;
 &lt;td&gt;Deploy projeleri&lt;/td&gt;
 &lt;td&gt;Deployment SSH anahtarı&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;SENTRY_DSN&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Protected&lt;/td&gt;
 &lt;td&gt;Production&lt;/td&gt;
 &lt;td&gt;Hata izleme DSN&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;GRAFANA_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Protected, Masked&lt;/td&gt;
 &lt;td&gt;Monitoring&lt;/td&gt;
 &lt;td&gt;Grafana dashboard API&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;VAULT_TOKEN&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Protected, Masked&lt;/td&gt;
 &lt;td&gt;Production&lt;/td&gt;
 &lt;td&gt;HashiCorp Vault erişim token&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="td-alert td-alert--md alert alert-caution" role="alert"&gt;&lt;div class="td-alert-heading alert-heading" role="heading"&gt;Sır Yönetimi&lt;/div&gt;
 &lt;div class="td-alert-body"&gt;
 &lt;p&gt;Hassas değerler &lt;strong&gt;asla&lt;/strong&gt; &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; içinde açık metin olarak yazılmaz. Tüm sırlar GitLab CI/CD Variables'da &lt;strong&gt;Protected&lt;/strong&gt; ve &lt;strong&gt;Masked&lt;/strong&gt; olarak tanımlanır. Detaylar için &lt;a href="https://handbook.orneksirket.com/engineering/architecture-principles/"&gt;Mimari Prensipler — Zero Trust&lt;/a&gt;
 bölümüne bakınız.&lt;/p&gt;</description></item><item><title>İzleme ve Gözlemlenebilirlik</title><link>https://handbook.orneksirket.com/engineering/monitoring-observability/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://handbook.orneksirket.com/engineering/monitoring-observability/</guid><description>&lt;h1 id="izleme-ve-gözlemlenebilirlik"&gt;İzleme ve Gözlemlenebilirlik&lt;/h1&gt;
&lt;p&gt;Denomas'ta her sistem gözlemlenebilir olmalıdır. Üç temel sinyal üzerinden izleme yaparız: metrikler, loglar ve tracing.&lt;/p&gt;
&lt;h2 id="izleme-yığını"&gt;İzleme Yığını&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Katman&lt;/th&gt;
 &lt;th&gt;Araç&lt;/th&gt;
 &lt;th&gt;Amaç&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Metrikler&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Prometheus + VictoriaMetrics&lt;/td&gt;
 &lt;td&gt;Zaman serisi metrik toplama&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Görselleştirme&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Grafana&lt;/td&gt;
 &lt;td&gt;Dashboard ve alerting&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Loglama&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Loki&lt;/td&gt;
 &lt;td&gt;Merkezi log toplama&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Tracing&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;OpenTelemetry + Jaeger&lt;/td&gt;
 &lt;td&gt;Dağıtık izleme&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Hata İzleme&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Sentry&lt;/td&gt;
 &lt;td&gt;Uygulama hata yakalama&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Altyapı İzleme&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Denomas Denetim Otomasyon (Zabbix)&lt;/td&gt;
 &lt;td&gt;IT/OT izleme&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="apdex-skoru"&gt;Apdex Skoru&lt;/h2&gt;
&lt;p&gt;Apdex (Application Performance Index), kullanıcı memnuniyetini ölçen standart bir metriktir.&lt;/p&gt;</description></item><item><title>Kalite Mühendisliği</title><link>https://handbook.orneksirket.com/engineering/quality-engineering/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://handbook.orneksirket.com/engineering/quality-engineering/</guid><description>&lt;h1 id="kalite-mühendisliği"&gt;Kalite Mühendisliği&lt;/h1&gt;
&lt;p&gt;Kalite, Denomas'ta ayrı bir aşama değildir. Geliştirme sürecinin içine gömülü bir disiplindir.&lt;/p&gt;
&lt;h2 id="test-piramidi"&gt;Test Piramidi&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; ╱ ╲
 ╱ E2E ╲ — Az ama kritik
 ╱───────╲
 ╱ Enteg. ╲ — Servisler arası
 ╱─────────────╲
 ╱ Birim Testleri ╲ — Çok ve hızlı
 ╱─────────────────────╲
&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Seviye&lt;/th&gt;
 &lt;th&gt;Hedef Kapsam&lt;/th&gt;
 &lt;th&gt;Çalıştırma&lt;/th&gt;
 &lt;th&gt;Araç&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Birim&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;%80+&lt;/td&gt;
 &lt;td&gt;Her commit&lt;/td&gt;
 &lt;td&gt;pytest, jest&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Entegrasyon&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Kritik akışlar&lt;/td&gt;
 &lt;td&gt;Her MR&lt;/td&gt;
 &lt;td&gt;pytest + testcontainers&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;E2E&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Kullanıcı senaryoları&lt;/td&gt;
 &lt;td&gt;Her release&lt;/td&gt;
 &lt;td&gt;Playwright, Cypress&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Performans&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Kritik endpoint'ler&lt;/td&gt;
 &lt;td&gt;Haftalık&lt;/td&gt;
 &lt;td&gt;k6&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="hata-bütçesi-error-budget"&gt;Hata Bütçesi (Error Budget)&lt;/h2&gt;
&lt;p&gt;Her üretim servisi için aylık hata bütçesi tanımlanır:&lt;/p&gt;</description></item><item><title>Kod İnceleme</title><link>https://handbook.orneksirket.com/engineering/code-review/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://handbook.orneksirket.com/engineering/code-review/</guid><description>&lt;h1 id="kod-inceleme"&gt;Kod İnceleme&lt;/h1&gt;
&lt;p&gt;Kod inceleme, Denomas mühendislik kültürünün temel taşlarından biridir. Her değişiklik, merge edilmeden önce en az bir takım arkadaşının incelemesinden geçer.&lt;/p&gt;
&lt;h2 id="ilkeler"&gt;İlkeler&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Her MR Review Alır&lt;/strong&gt; — İstisna yoktur, tek satırlık değişiklikler bile&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yapıcı Geri Bildirim&lt;/strong&gt; — Eleştiri koda yöneliktir, kişiye değil&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Öğrenme Aracı&lt;/strong&gt; — Review, hem yazar hem reviewer için öğrenme fırsatıdır&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Otomasyon Desteği&lt;/strong&gt; — Linter ve testler review öncesi otomatik çalışır&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="merge-request-standartları"&gt;Merge Request Standartları&lt;/h2&gt;
&lt;p&gt;Her MR şu bilgileri içermelidir:&lt;/p&gt;</description></item><item><title>Kod Kalitesi</title><link>https://handbook.orneksirket.com/engineering/code-quality/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://handbook.orneksirket.com/engineering/code-quality/</guid><description>&lt;h1 id="kod-kalitesi"&gt;Kod Kalitesi&lt;/h1&gt;
&lt;p&gt;Denomas'ta kod kalitesi, geliştirme sürecinin ayrılmaz bir parçasıdır. Her commit, pre-commit hook'larından geçer; her MR, &lt;strong&gt;Otomatik Kalite Kapısı&lt;/strong&gt;ndan geçmek zorundadır. Bu kapı, bilinen güvenlik açıklarının (SQL injection, XSS vb.) koda girmesini en başından engeller.&lt;/p&gt;
&lt;h2 id="temel-kural"&gt;Temel Kural&lt;/h2&gt;
&lt;div class="callout callout-info" role="alert"&gt;&lt;p&gt;&lt;strong&gt;Her commit pre-commit hook'larından geçmelidir. İstisnasız.&lt;/strong&gt;&lt;/p&gt;

 &lt;/div&gt;&lt;h2 id="pre-commit-hooks"&gt;Pre-commit Hooks&lt;/h2&gt;
&lt;p&gt;Tüm projelerde aşağıdaki pre-commit hook'ları aktiftir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# .pre-commit-config.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;repos&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Genel dosya kontrolleri&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;repo&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://github.com/pre-commit/pre-commit-hooks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rev&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;v4.6.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hooks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;trailing-whitespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;end-of-file-fixer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;check-yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;args&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#39;--allow-multiple-documents&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;check-json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;check-merge-conflict&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;detect-private-key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;check-added-large-files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;args&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#39;--maxkb=1024&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;no&lt;/span&gt;-&lt;span style="color:#ae81ff"&gt;commit-to-branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;args&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#39;--branch&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;main&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;--branch&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;master&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Python: Ruff (flake8 + isort + pyupgrade birleşimi)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;repo&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://github.com/astral-sh/ruff-pre-commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rev&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;v0.4.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hooks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ruff&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;args&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#39;--fix&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ruff-format&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Python: Black (formatter)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;repo&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://github.com/psf/black&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rev&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;24.4.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hooks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;black&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;args&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#39;--line-length=120&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Python: MyPy (tip kontrolü)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;repo&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://github.com/pre-commit/mirrors-mypy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rev&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;v1.10.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hooks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mypy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;additional_dependencies&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#39;types-requests&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;types-redis&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;args&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#39;--ignore-missing-imports&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Python: Bandit (güvenlik taraması)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;repo&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://github.com/PyCQA/bandit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rev&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1.7.8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hooks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bandit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;args&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#39;-c&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;pyproject.toml&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;-r&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;additional_dependencies&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#39;bandit[toml]&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Ansible&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;repo&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://github.com/ansible/ansible-lint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rev&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;v24.2.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hooks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ansible-lint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Docker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;repo&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://github.com/hadolint/hadolint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rev&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;v2.12.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hooks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;hadolint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Shell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;repo&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://github.com/shellcheck-py/shellcheck-py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rev&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;v0.10.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hooks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;shellcheck&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Commit message format (Conventional Commits)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;repo&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://github.com/compilerla/conventional-pre-commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rev&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;v3.2.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hooks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;conventional-pre-commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;stages&lt;/span&gt;: [&lt;span style="color:#ae81ff"&gt;commit-msg]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;args&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#39;feat&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;fix&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;docs&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;style&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;refactor&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;test&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;chore&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;ci&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="td-alert td-alert--md alert alert-warning" role="alert"&gt;&lt;div class="td-alert-heading alert-heading" role="heading"&gt;Doğrudan Ana Dala Commit Yasak&lt;/div&gt;
 &lt;div class="td-alert-body"&gt;
 &lt;p&gt;&lt;code&gt;no-commit-to-branch&lt;/code&gt; hook'u, doğrudan &lt;code&gt;main&lt;/code&gt; veya &lt;code&gt;master&lt;/code&gt; dalına commit yapılmasını engeller. Tüm değişiklikler feature branch üzerinden MR ile gelmelidir.&lt;/p&gt;</description></item><item><title>Mimari Prensipler</title><link>https://handbook.orneksirket.com/engineering/architecture-principles/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://handbook.orneksirket.com/engineering/architecture-principles/</guid><description>&lt;h1 id="mimari-prensipler"&gt;Mimari Prensipler&lt;/h1&gt;
&lt;p&gt;Denomas'ın tüm ürünleri ve altyapısı aşağıdaki mimari prensipler üzerine inşa edilir. Mimari, &lt;strong&gt;&amp;quot;Önce Teknik Temel (Foundation First)&amp;quot;&lt;/strong&gt; felsefesine dayanır. Müşteriye sunulacak özellikler geliştirilmeden önce tüm geliştirme ve otomasyon altyapısı mükemmelleştirilir.&lt;/p&gt;
&lt;h2 id="teknoloji-yığını-technology-stack"&gt;Teknoloji Yığını (Technology Stack)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Bileşen&lt;/th&gt;
 &lt;th&gt;Teknoloji&lt;/th&gt;
 &lt;th&gt;Versiyon / Detay&lt;/th&gt;
 &lt;th&gt;Gerekçe&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Ana Platform&lt;/td&gt;
 &lt;td&gt;Odoo&lt;/td&gt;
 &lt;td&gt;18.0+ (Python 3.10+)&lt;/td&gt;
 &lt;td&gt;CRM, satış, faturalandırma, muhasebe için zengin özellik seti&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Backend Framework&lt;/td&gt;
 &lt;td&gt;Python / Django&lt;/td&gt;
 &lt;td&gt;4.2+ LTS&lt;/td&gt;
 &lt;td&gt;Mikroservisler ve harici API'ler için&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Mikroservisler&lt;/td&gt;
 &lt;td&gt;Python (FastAPI)&lt;/td&gt;
 &lt;td&gt;0.100+&lt;/td&gt;
 &lt;td&gt;Yüksek performanslı API güdümlü servisler&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Veritabanı&lt;/td&gt;
 &lt;td&gt;PostgreSQL&lt;/td&gt;
 &lt;td&gt;15+&lt;/td&gt;
 &lt;td&gt;Nesne-ilişkisel, ölçeklenebilir, güvenilir&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Önbellek / Kuyruk&lt;/td&gt;
 &lt;td&gt;Redis&lt;/td&gt;
 &lt;td&gt;7+&lt;/td&gt;
 &lt;td&gt;Session, cache, Celery broker&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Web Sunucu&lt;/td&gt;
 &lt;td&gt;Caddy&lt;/td&gt;
 &lt;td&gt;Reverse proxy, SSL termination, load balancing&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kaynak Kod Yönetimi&lt;/td&gt;
 &lt;td&gt;GitLab (Self-Hosted)&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;code.denomas.com&lt;/code&gt; ve &lt;code&gt;code.ilimteknoloji.com&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CI/CD&lt;/td&gt;
 &lt;td&gt;GitLab CI/CD&lt;/td&gt;
 &lt;td&gt;Mevcut GitLab Runner'lar ile entegre pipeline&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Ön Yüz (Frontend)&lt;/td&gt;
 &lt;td&gt;Odoo Owl JS Framework&lt;/td&gt;
 &lt;td&gt;Odoo ekosistemi içinde sorunsuz entegrasyon&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Bilişsel Altyapı&lt;/td&gt;
 &lt;td&gt;Node.js tabanlı MCP Sunucuları&lt;/td&gt;
 &lt;td&gt;Model Context Protocol (Yapay Zeka Asistanı erişimi)&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Konteynerizasyon&lt;/td&gt;
 &lt;td&gt;Docker, Docker Compose&lt;/td&gt;
 &lt;td&gt;Tutarlı, izole ve tekrarlanabilir ortamlar&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;IaC&lt;/td&gt;
 &lt;td&gt;Ansible / Terraform&lt;/td&gt;
 &lt;td&gt;Konfigürasyon yönetimi ve cloud provizyon&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;İzleme&lt;/td&gt;
 &lt;td&gt;Prometheus + Grafana&lt;/td&gt;
 &lt;td&gt;Metrik toplama ve görselleştirme&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Loglama&lt;/td&gt;
 &lt;td&gt;Wazuh&lt;/td&gt;
 &lt;td&gt;Merkezi log yönetimi&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="1-api-first"&gt;1. API-First&lt;/h2&gt;
&lt;p&gt;Her ürün ve hizmet, önce API olarak tasarlanır. UI, API'nin bir tüketicisidir.&lt;/p&gt;</description></item><item><title>Mühendislik Yaklaşımı</title><link>https://handbook.orneksirket.com/engineering/development-methodology/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://handbook.orneksirket.com/engineering/development-methodology/</guid><description>&lt;h1 id="mühendislik-yaklaşımı"&gt;Mühendislik Yaklaşımı&lt;/h1&gt;
&lt;p&gt;Bu sayfa Denomas'ın halka açık mühendislik yaklaşımını özetler. İç ürünleşme yöntemleri, iç otomasyon akışları ve rekabetçi mühendislik detayları Internal Handbook içinde tutulur.&lt;/p&gt;
&lt;h2 id="public-ilkeler"&gt;Public İlkeler&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Güçlü teknik temeller üzerine ürün inşa etmek&lt;/li&gt;
&lt;li&gt;Kalite kapılarıyla güvenilir teslimat üretmek&lt;/li&gt;
&lt;li&gt;Açık kaynak ekosistemini ciddiyetle değerlendirmek&lt;/li&gt;
&lt;li&gt;Güvenlik, performans ve bakım kolaylığını birlikte düşünmek&lt;/li&gt;
&lt;li&gt;Dokümantasyon ve mühendislik disiplinini birlikte yürütmek&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="public-teknik-sınır"&gt;Public Teknik Sınır&lt;/h2&gt;
&lt;p&gt;İç ürünleşme metodolojileri, otomasyon akışları, klasör yapıları, iç approval modelleri ve asistan protokolleri public yüzde ayrıntılı olarak paylaşılmaz.&lt;/p&gt;</description></item><item><title>Sürüm Süreci</title><link>https://handbook.orneksirket.com/engineering/release-process/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://handbook.orneksirket.com/engineering/release-process/</guid><description>&lt;h1 id="sürüm-süreci"&gt;Sürüm Süreci&lt;/h1&gt;
&lt;p&gt;Denomas, &lt;strong&gt;dual-track deployment&lt;/strong&gt; stratejisi uygular. Bu strateji, SaaS ve self-managed ürün hatlarının farklı sürüm döngülerini yönetir. Dağıtım süreci &lt;code&gt;code.denomas.com&lt;/code&gt; ve &lt;code&gt;code.ilimteknoloji.com&lt;/code&gt; GitLab altyapıları üzerinde çalışır. &lt;strong&gt;Otomatik Kalite Kapısı&lt;/strong&gt; tüm süreci otomatize eder ve güvence altına alır.&lt;/p&gt;
&lt;h2 id="git-akışı"&gt;Git Akışı&lt;/h2&gt;
&lt;p&gt;Standart ve kanıtlanmış branch stratejisi:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;feature-branch → develop → staging → main
&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Dal&lt;/th&gt;
 &lt;th&gt;Rol&lt;/th&gt;
 &lt;th&gt;Deploy Ortamı&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;feature/*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Yeni özellik veya bug fix geliştirmesi&lt;/td&gt;
 &lt;td&gt;Development (her push)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;develop&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Ana geliştirme dalı, tüm yeni özellikler buraya merge edilir&lt;/td&gt;
 &lt;td&gt;Development&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;staging&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Canlıya çıkmadan önceki son test ortamı&lt;/td&gt;
 &lt;td&gt;Staging (otomatik)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;main&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Sadece stabil, test edilmiş ve canlıya çıkmaya hazır kod&lt;/td&gt;
 &lt;td&gt;Production (manuel onay)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="td-alert td-alert--md alert alert-warning" role="alert"&gt;&lt;div class="td-alert-heading alert-heading" role="heading"&gt;Ana Dala Doğrudan Push Yasak&lt;/div&gt;
 &lt;div class="td-alert-body"&gt;
 &lt;p&gt;&lt;code&gt;main&lt;/code&gt; ve &lt;code&gt;develop&lt;/code&gt; dallarına doğrudan push yapılması pre-commit hook ile engellenmiştir. Tüm değişiklikler Merge Request üzerinden gelmelidir.&lt;/p&gt;</description></item></channel></rss>