CI/CD چیست؟ طراحی پایپ‌لاین امن از کد تا Production

CI/CD روشی برای تبدیل تغییر کد به نسخه‌ای قابل انتشار با فرایندی تکرارپذیر، آزمون‌پذیر و قابل ردیابی است. پایپ‌لاین خوب فقط چند دستور Build و Deploy نیست؛ باید مشخص کند چه چیزی ساخته شده، چه کنترل‌هایی را گذرانده، چه کسی اجازه انتشار دارد، سلامت نسخه چگونه سنجیده می‌شود و در صورت خطا چطور به وضعیت امن برمی‌گردیم.

برای یک وب‌اپلیکیشن، هدف CI/CD «استقرار بیشتر به هر قیمت» نیست. هدف، کوتاه‌کردن حلقه بازخورد و کاهش ریسک هر تغییر است. در این راهنما از تعریف CI و CD شروع می‌کنیم و تا طراحی Stageها، Artifact تغییرناپذیر، تست، Secret، مهاجرت دیتابیس، Canary، مانیتورینگ و Rollback پیش می‌رویم.

CI/CD چیست؟

CI/CD معمولاً سه مفهوم نزدیک را پوشش می‌دهد:

  • Continuous Integration یا یکپارچه‌سازی مداوم: تغییرهای کوچک و پرتکرار در مخزن مشترک ادغام می‌شوند و برای هر تغییر، کنترل‌هایی مانند Lint، Build و Test به‌صورت خودکار اجرا می‌شود.
  • Continuous Delivery یا تحویل مداوم: نسخه‌ای که دروازه‌های کیفیت را گذرانده همیشه آماده انتشار است، اما فرستادن آن به Production می‌تواند تأیید انسانی داشته باشد.
  • Continuous Deployment یا استقرار مداوم: تغییر تأییدشده بدون دکمه انتشار دستی و طبق سیاست تعریف‌شده وارد Production می‌شود.

تفاوت Delivery و Deployment در حذف یا حفظ کنترل انسانیِ مرحله انتشار است، نه در حذف تست و کنترل ریسک. یک تیم می‌تواند Continuous Delivery بالغی داشته باشد و آگاهانه برای Production تأیید دستی بخواهد.

پایپ‌لاین خوب چه خروجی‌ای باید بدهد؟

در پایان هر اجرا باید بتوانید این پرسش‌ها را پاسخ دهید:

  • کدام Commit، Pull Request و Ticket وارد نسخه شد؟
  • Artifact دقیقاً با چه وابستگی‌ها و در چه محیطی ساخته شد؟
  • کدام تست‌ها و اسکن‌ها اجرا شدند و نتیجه آن‌ها کجاست؟
  • چه نسخه‌ای اکنون در Development، Staging و Production است؟
  • چه کسی یا چه Policy انتشار را مجاز کرد؟
  • معیار سلامت بعد از Deploy چه بود؟
  • برای Rollback یا Fix Forward چه مسیر آزموده‌ای وجود دارد؟

اگر پاسخ در پیام‌های پراکنده، حافظه یک نفر یا دستورهای دستی SSH باشد، هنوز فرایند تحویل شما قابل اتکا نیست.

Delivery Contract؛ پایپ‌لاین برای چه تغییری تصمیم می‌گیرد؟

پیش از نوشتن YAML، یک قرارداد تحویل بسازید. این قرارداد ورودی، شواهد لازم، محدوده اثر و اختیار تصمیم‌گیری را برای هر نوع تغییر روشن می‌کند. در غیر این صورت یک اصلاح متن و یک Migration پرریسک از مسیر یکسان می‌گذرند یا استثناها به تصمیم لحظه‌ای تبدیل می‌شوند.

فیلد قراردادپرسش عملینمونه خروجی قابل ثبت
واحد تغییرکدام Commit، سرویس، تنظیم یا Schema عوض می‌شود؟Commit SHA، سرویس و Migration ID
محدوده اثرخطا به چند کاربر، منطقه یا جریان درآمدی می‌رسد؟Blast radius و وابستگی‌ها
شواهدبرای انتشار چه تست، اسکن یا تأییدی لازم است؟Test report، Policy result و Ticket
Artifactدقیقاً چه خروجی تغییرناپذیری ارتقا می‌یابد؟Digest، SBOM و Provenance
Releaseانتشار برای چه Cohort و با چه شیبی انجام می‌شود؟Canary plan و Feature Flag
سلامتادامه یا توقف با کدام SLO و شاخص کسب‌وکار تعیین می‌شود؟Guardrail و Observation window
بازیابیRollback امن است یا Fix Forward لازم می‌شود؟Runbook، مالک و زمان هدف
ممیزیچه کسی یا چه Policy تصمیم نهایی را گرفته است؟Approval، Deployment record و Release marker

Risk Tier را به کنترل‌های واقعی وصل کنید

یک مدل ساده می‌تواند تغییرها را به R1 تا R3 تقسیم کند: R1 مانند اصلاح Copy با Blast radius محدود؛ R2 مانند تغییر API سازگار؛ و R3 مانند مجوز، پرداخت، زیرساخت یا Schema. افزایش سطح ریسک باید کنترل ملموس اضافه کند؛ برای نمونه مالک دوم، تست بازیابی، Canary طولانی‌تر یا ممنوعیت انتشار در زمان بدون On-call. مسیر Emergency نیز باید تعریف شود، اما حذف کنترل در آن با ثبت دلیل، دامنه محدود، تأیید مسئول Incident و بازبینی پس از رخداد جبران شود.

معماری پیشنهادی CI/CD از Commit تا Production

Stageهدفخروجی یا دروازه
Validateبررسی قالب، Lint و تنظیماتخطای سریع و ارزان
TestUnit و Integration و کنترل قراردادگزارش آزمون و Coverage معنادار
Buildساخت یک‌باره Artifactفایل یا Image نسخه‌دار با Digest
Securityاسکن کد، وابستگی، Secret و ArtifactPolicy قبول/رد و گزارش قابل پیگیری
Stagingاستقرار نسخه واقعی در محیط نزدیک به ProductionSmoke/E2E و تأیید مهاجرت
Productionانتشار کنترل‌شدهDeployment Record و وضعیت Rollout
Verifyبررسی سلامت و شاخص‌های کسب‌وکارادامه، توقف یا Rollback

Stageها را فقط برای زیبایی Diagram زیاد نکنید. هر Stage باید بازخورد، مرز امنیتی یا Artifact مشخصی بسازد.

اصل کلیدی: یک‌بار بسازید، همان Artifact را ارتقا دهید

نسخه‌ای که در Production اجرا می‌شود باید همان Artifact آزموده‌شده در Staging باشد. Build دوباره برای هر محیط می‌تواند وابستگی، Timestamp یا خروجی متفاوتی بسازد و اعتماد به تست قبلی را از بین ببرد.

Artifact قابل ردیابی چه ویژگی‌هایی دارد؟

  • نسخه یا Digest یکتا دارد؛
  • به Commit و Pipeline Run متصل است؛
  • بعد از ساخت تغییر نمی‌کند؛
  • Retention و دسترسی مشخص دارد؛
  • در صورت نیاز، Manifest وابستگی یا SBOM همراه آن نگهداری می‌شود؛
  • ارتقای آن بین محیط‌ها ثبت می‌شود.

برای کانتینر، به‌جای تکیه بر Tag متغیری مانند latest، Digest یا Tag تغییرناپذیر نسخه را در سابقه استقرار ثبت کنید. برای مفاهیم Image، Registry و Orchestration، راهنمای مفاهیم DevOps و کانتینر را ببینید.

Provenance، SBOM و Attestation چه تفاوتی دارند؟

Checksum فقط می‌گوید بایت‌های Artifact عوض نشده‌اند؛ برای پاسخ به «چه چیزی، از کدام کد و در کدام فرایند ساخته شد؟» به شواهد بیشتری نیاز دارید. مستندات رسمی Artifact Attestation گیت‌هاب توضیح می‌دهد که Attestation می‌تواند منشأ ساخت را به Artifact پیوند دهد و در صورت نیاز شامل SBOM باشد. این شواهد تضمین نمی‌کند Artifact بی‌نقص یا امن است؛ باید در مرز استقرار Verify و با Policy شما ارزیابی شود.

کنترلچه چیزی را ثابت می‌کند؟محدودیت
Checksum یا Digestهویت محتوای Artifactمنشأ یا مجازبودن سازنده را نشان نمی‌دهد
SBOMفهرست اجزا و نسخه وابستگی‌هابه‌تنهایی اصالت یا نبود آسیب‌پذیری را ثابت نمی‌کند
Provenanceرابطه Source، Builder، Workflow و Artifactبه اعتماد به Builder و صحت Claim وابسته است
Signature/Attestationتمامیت و هویت صادرکننده Claimبدون Verification و Trust policy ارزش عملی محدود دارد
Policy verificationمجازبودن Source، Builder، Dependency و محیط انتشارPolicy باید نسخه‌دار، بازبینی و آزموده شود

در مرحله Build، Subject attestation را به Digest نهایی متصل، Lockfile و نسخه Toolchain را ثبت و SBOM را کنار Artifact نگه دارید. در Deploy، Digest دریافت‌شده، امضای صادرکننده، Repository و Workflow مجاز را دوباره بررسی کنید؛ صرف وجود فایل JSON در کنار Image یک Gate امنیتی نیست.

ترتیب تست‌ها: بازخورد سریع پیش از کنترل‌های گران

Pipeline باید خطاهای ساده را زود پیدا کند. Lint، Type Check و Unit Testهای سریع را جلوتر قرار دهید؛ Integration و E2Eهای کندتر پس از آن اجرا شوند. این ترتیب زمان Runner و انتظار توسعه‌دهنده را کم می‌کند.

یک سبد آزمون متعادل

  • Static Check: قالب، Type، Policy و خطاهای قابل کشف بدون اجرا؛
  • Unit Test: منطق کوچک و ایزوله با بازخورد سریع؛
  • Integration Test: تعامل با دیتابیس، Cache، Queue یا سرویس؛
  • Contract Test: سازگاری تولیدکننده و مصرف‌کننده API؛
  • E2E: چند مسیر حیاتی کاربر، نه تکرار همه حالت‌های Unit؛
  • Smoke Test: سلامت اولیه نسخه پس از استقرار؛
  • Performance/Security Test: کنترل‌های متناسب با ریسک، بخشی در هر Commit و بخشی زمان‌بندی‌شده.

Coverage بالا به‌تنهایی کیفیت را ثابت نمی‌کند. مسیر پرداخت، ورود، سطح دسترسی و عملیات برگشت‌ناپذیر باید بر اساس ریسک پوشش داده شوند. برای طراحی عمیق‌تر، راهنمای تست نرم‌افزار برای وب‌اپلیکیشن مکمل این بخش است.

نمونه ساختار یک پایپ‌لاین

نمونه زیر شبه‌کد است و باید به Syntax پلتفرم و پروژه شما تبدیل شود:

on: pull_request, push-to-main

validate:
  lint
  type-check

test:
  unit
  integration-with-ephemeral-services

build:
  create-artifact-once
  attach-commit-and-digest

security:
  dependency-scan
  secret-scan
  artifact-scan

deploy-staging:
  use-the-same-artifact
  run-migrations-safely
  smoke-and-critical-e2e

deploy-production:
  require-environment-policy
  deploy-progressively
  verify-slo-and-business-signals
  rollback-or-fix-forward

Pipeline واقعی باید Timeout، Retry محدود، Artifact retention، لغو اجرای قدیمی، مدیریت هم‌زمانی و اعلان مسئول را نیز تعریف کند.

بهینه‌سازی زمان CI بدون قربانی‌کردن اعتماد

Fail Fast

کنترل‌های سریع و با احتمال خطای بالا را زود اجرا کنید. اگر Lint در یک دقیقه شکست می‌خورد، اجرای E2E بیست‌دقیقه‌ای ارزش ندارد.

Cache با کلید درست

Cache وابستگی یا خروجی میانی باید به Lockfile، نسخه Runtime و پلتفرم وابسته باشد. Cache مشترک نامعتبر می‌تواند خطایی عجیب یا ریسک Supply Chain بسازد. Artifact تحویلی را با Cache موقت یکی نگیرید.

Parallelism هدفمند

Jobهای مستقل را موازی کنید و Testهای بزرگ را Shard کنید، اما ظرفیت Runner و فشار بر سرویس‌های اشتراکی را بسنجید. موازی‌سازی بی‌حد می‌تواند هزینه و ناپایداری را بالا ببرد.

لغو Pipeline قدیمی

وقتی Commit جدید روی همان Branch آمده، اجرای قدیمی که هنوز به مرحله Deploy نرسیده اغلب ارزش تکمیل ندارد. برای Production، برعکس، باید از Deploy هم‌زمان و جلو افتادن نسخه قدیمی جلوگیری شود.

خود CI یک سرویس با SLO است

اگر بازخورد پایپ‌لاین دیر یا غیرقابل اعتماد باشد، توسعه‌دهنده Job قرمز را Retry می‌کند، تست را دور می‌زند یا تغییر بزرگ‌تری جمع می‌کند. بنابراین سلامت CI را مانند یک سرویس داخلی اندازه بگیرید، نه فقط نتیجه سبز و قرمز هر اجرا را.

سیگنالپرسشاقدام نمونه
Queue timeJob تا گرفتن Runner چقدر منتظر می‌ماند؟ظرفیت، اولویت و Autoscaling Runner
Time to first feedbackاولین خطای مفید چه زمانی دیده می‌شود؟Fail fast و جداکردن Critical path
Flake rateچند شکست بدون تغییر کد در Retry سبز می‌شود؟Registry خطا، مالک و Quarantine محدود
Cache hit/correctnessCache چقدر سرعت می‌دهد و چند خطای نامعتبر می‌سازد؟کلید Lockfile، Runtime و Platform
Runner failureچند اجرا به‌علت زیرساخت شکست می‌خورند؟Health check، Image استاندارد و ظرفیت رزرو
Deploy reliabilityچند انتشار به مداخله یا Rework نیاز دارد؟Gate، Progressive delivery و Runbook

Retry خودکار را فقط برای خطاهای موقت و شناخته‌شده محدود کنید. تست Flaky باید شناسه، مالک، نرخ تکرار و مهلت اصلاح داشته باشد؛ Quarantine بی‌انتها اعتماد به کل Suite را می‌سوزاند. برای هر Repository یک بودجه بازخورد تعریف کنید، مثلاً صدک ۹۵ زمان تا اولین نتیجه، و Critical path را با داده واقعی کوتاه کنید.

امنیت CI/CD: پایپ‌لاین بخشی از Production است

Runner می‌تواند کد اجرا کند، Artifact بسازد و گاهی به Cloud یا سرور دسترسی داشته باشد؛ بنابراین هدف باارزشی برای مهاجم است. Workflow را مانند کد Production Review کنید.

  • مجوز Token را به حداقل مورد نیاز هر Job محدود کنید.
  • Secret طولانی‌عمر را در Repository یا Log قرار ندهید.
  • دسترسی Production را به Branch، Environment و نقش مجاز محدود کنید.
  • Dependency و Action شخص ثالث را از منبع قابل اعتماد و نسخه کنترل‌شده بگیرید.
  • کد Pull Request ناشناس را روی Runner دارای Secret یا شبکه داخلی اجرا نکنید.
  • Logها و Artifactها را از داده حساس پاک و دسترسی آن‌ها را محدود کنید.
  • تغییر فایل Pipeline و IaC را با Code Owner و Review محافظت کنید.

راهنمای رسمی امنیت GitHub Actions بر اصل کمترین دسترسی تأکید می‌کند و برای دسترسی Cloud، استفاده از OIDC را به‌جای نگهداری Credential طولانی‌عمر پیشنهاد می‌دهد. OIDC باید با شرط‌های دقیق Repository، Branch/Environment و Audience تنظیم شود؛ فعال‌کردن Token کوتاه‌عمر بدون محدودیت اعتماد کافی نیست.

Threat Model برای Control Plane انتشار

تهدید را از Repository تا Runner، Registry و مقصد Deploy دنبال کنید. مهاجم لازم نیست Production Password را بدزدد؛ گاهی تغییر Workflow، Poison‌کردن Cache یا جایگزینی Artifact همان نتیجه را می‌دهد.

سطح حملهسناریوی محتملکنترل حداقلی
Pull Request ناشناساجرای کد مهاجم کنار Secret یا شبکه داخلیRunner و Workflow جدا، بدون Secret و Approval برای کد غیرقابل اعتماد
Action یا Pluginنسخه Tagشده در آینده عوض می‌شودPin به Commit immutable، Allowlist و به‌روزرسانی کنترل‌شده
Dependency confusionPackage هم‌نام از Registry عمومی دریافت می‌شودNamespace، Lockfile، Registry policy و Verification
Runnerباقی‌ماندن Token، Workspace یا دسترسی شبکهRunner موقت، Image سخت‌سازی‌شده و پاک‌سازی پس از Job
OIDCTrust policy بیش از حد باز استAudience و Subject محدود به Owner، Repository، Ref و Environment مجاز
Artifact/Cacheجایگزینی خروجی یا Cache poisoningDigest، Provenance، Scope جدا و Verify هنگام Deploy
Workflow/IaCتغییر مسیر انتشار بدون بازبینیBranch protection، CODEOWNERS و تأیید مستقل
Logنشت Secret، Header یا داده کاربرRedaction، Retention محدود و آزمون نشت

مرجع رسمی OIDC گیت‌هاب Actions را هنگام نوشتن Trust policy مبنا قرار دهید. برای Repositoryهایی که بعد از ۱۵ ژوئیه ۲۰۲۶ ایجاد شده‌اند، قالب پیش‌فرض Subject از شناسه‌های تغییرناپذیر Owner و Repository استفاده می‌کند؛ Repository قدیمی لزوماً خودکار به این قالب مهاجرت نکرده است. بنابراین Claim واقعی Token را در محیط خود ببینید و Policy را بر اساس حدس یا نمونه قدیمی کپی نکنید.

برای ادغام SAST، SCA، Secret Scan، Container Scan و Policy در چرخه، راهنمای پیاده‌سازی DevSecOps را بخوانید.

Secretها و دسترسی محیط‌ها را چگونه مدیریت کنیم؟

Development، Staging و Production نباید Credential مشترک داشته باشند. Secret هر محیط را با Scope و عمر محدود در Secret Manager یا سازوکار امن پلتفرم نگه دارید. فقط Job مجاز همان محیط باید آن را دریافت کند.

قاعده‌های عملی

  • Secret را در Command Line، Debug Output یا Artifact چاپ نکنید.
  • Masking خودکار را تضمین کامل ندانید؛ شکل تبدیل‌شده Secret ممکن است شناسایی نشود.
  • Rotation، مالک و تاریخ انقضا داشته باشید.
  • Runner موقت را پس از Job پاک کنید و Runner دائمی را سخت‌سازی و وصله کنید.
  • Production Environment را Protected کنید و Audit Trail نگه دارید.
  • دسترسی Deploy را از دسترسی معمول توسعه جدا کنید، به‌ویژه در پروژه حساس.

مستندات Deployment Safety گیت‌لب نیز کنترل محیط محافظت‌شده، جلوگیری از Deployهای هم‌زمان و قدیمی و حفاظت از متغیرهای Production را از ملاحظات اصلی می‌داند.

مهاجرت دیتابیس بدون Downtime

Rollback کد همیشه Rollback دیتابیس نیست. حذف ستون، تغییر نوع یا Migration طولانی ممکن است برگشت نسخه را ناممکن یا سرویس را قفل کند. برای تغییرهای پرریسک از الگوی Expand and Contract استفاده کنید:

  1. Expand: ساختار جدید را به‌شکل سازگار با نسخه قدیمی اضافه کنید.
  2. Migrate: داده را مرحله‌ای Backfill کنید و صحت را بسنجید.
  3. Switch: خواندن/نوشتن را با Feature Flag یا نسخه سازگار منتقل کنید.
  4. Contract: پس از اطمینان و پایان بازه Rollback، ساختار قدیمی را حذف کنید.

Migration باید Idempotent یا دست‌کم وضعیت اجرا و امکان ادامه امن داشته باشد. پیش از Production روی داده‌ای با حجم و شکل نزدیک به واقعیت آزمایش کنید. Backup لازم است، اما Restore آزموده‌شده مهم‌تر از وجود فایل Backup است.

Compatibility Window را صریح تعریف کنید

در Rolling یا Canary، نسخه N و N-۱ مدتی هم‌زمان با یک Schema کار می‌کنند. قرارداد سازگاری باید بگوید هر نسخه چه فیلدی را می‌خواند و می‌نویسد و نقطه بدون بازگشت کجاست.

مرحلهوضعیت Schema و کدGate خروج
Expandساختار جدید اختیاری است و نسخه قدیم همچنان کار می‌کندMigration کوتاه، قفل کنترل‌شده و Schema تأییدشده
Mixed versionsN و N-۱ روی Schema مشترک اجرا می‌شوندContract test و سنجش خواندن/نوشتن هر دو نسخه
SwitchBackfill کامل و مسیر خواندن/نوشتن جدید فعال می‌شودReconciliation، نرخ خطا و امکان برگشت Flag
Contractفیلد یا ساختار قدیمی حذف می‌شودپایان Retention نسخه قدیم و تأیید نبود مصرف‌کننده

Backfill حجیم را داخل Startup اپلیکیشن یا Transaction استقرار پنهان نکنید. آن را Job قابل توقف و ادامه با Progress marker، نرخ محدود و Reconciliation بسازید. تغییر مسیر Read و Write را جداگانه انجام دهید تا ناسازگاری یا Dual-write ناموفق قابل مشاهده باشد.

انتخاب استراتژی استقرار

Rolling Deployment

Replicaها مرحله‌ای جایگزین می‌شوند. هزینه اضافه معمولاً کمتر است، اما نسخه قدیم و جدید مدتی هم‌زمان‌اند؛ API و Database باید سازگار باشند.

Blue‑Green

محیط جدید کنار محیط فعلی آماده و ترافیک جابه‌جا می‌شود. بازگشت سریع‌تر است ولی هزینه ظرفیت و همگام‌سازی State را باید دید.

Canary

نسخه ابتدا برای سهم کوچکی از ترافیک یا گروه کنترل‌شده فعال می‌شود. معیارهای فنی و کسب‌وکار تصمیم گسترش یا توقف را می‌دهند. بدون Observability، Canary فقط Rolling با نام جدید است.

Feature Flag

Deploy کد را از Release قابلیت جدا می‌کند. Flag باید مالک، تاریخ حذف و رفتار امن هنگام خطا داشته باشد؛ Flagهای رهاشده بدهی فنی و مسیرهای آزمون را چند برابر می‌کنند.

مستندات رسمی Kubernetes درباره Rolling Update مشاهده وضعیت Rollout، تاریخچه و بازگردانی Revision را نشان می‌دهد. استفاده از Kubernetes الزامی نیست؛ اصل مهم، داشتن نسخه قابل شناسایی و مسیر بازگشت آزموده است. برای معماری کانتینری، نقش Kubernetes و کانتینرسازی در هاستینگ را ببینید.

Progressive Delivery باید شواهد تولید کند

تقسیم ترافیک به‌تنهایی ریسک را کنترل نمی‌کند. برای هر پله Rollout باید Cohort، مدت مشاهده، Guardrail، اندازه نمونه و اختیار تصمیم از قبل مشخص باشد.

پلهدامنه نمونهشاهد لازم برای ادامه
Pre-productionترافیک مصنوعی و داده غیرحساسSmoke، Contract، Migration و مسیرهای بحرانی
Internalکاربر یا Tenant داخلیخطای Client/Server، UX و سازگاری
Canaryیک تا پنج درصد Cohort پایدارError/Latency نسبت به Control و شاخص کسب‌وکار
Rampپله‌های ازپیش‌تعریف‌شدهعبور Guardrail در هر Observation window
Holdنسخه غالب با پنجره مشاهدهپیامدهای دیررس، Queue، پرداخت و پشتیبانی

Canary و Control باید تا حد ممکن از Region، نوع کاربر و الگوی ترافیک مشابه باشند؛ وگرنه مقایسه گمراه‌کننده می‌شود. برای رخدادهای کم‌تعداد، چند دقیقه داده اندازه نمونه کافی نمی‌سازد. Rollback خودکار را فقط به سیگنال کم‌ابهام وصل کنید؛ برای Migration برگشت‌ناپذیر یا خرابی Dependency مشترک، اجرای خودکار Rollback می‌تواند حادثه را بدتر کند و باید به Stop، Isolation یا Fix Forward تبدیل شود.

دروازه Production: تأیید دستی یا خودکار؟

پاسخ به ریسک و بلوغ تیم بستگی دارد. تأیید دستی می‌تواند برای تغییر مالی، حقوقی یا زیرساختی مفید باشد، اما اگر فقط تشریفاتی و بدون اطلاعات باشد، ایمنی واقعی نمی‌سازد.

در لحظه تأیید باید این اطلاعات حاضر باشد:

  • تغییر و ریسک قابل انتظار؛
  • نتیجه تست و اسکن؛
  • Artifact و Commit دقیق؛
  • وضعیت Migration و سازگاری عقب‌رو؛
  • برنامه Rollout، شاخص توقف و مسئول تصمیم؛
  • Rollback یا Fix Forward آماده.

برای تغییرهای کم‌ریسک و پرتکرار، Policy خودکار همراه Progressive Delivery ممکن است مطمئن‌تر از صف تأییدهای بی‌دقت باشد.

تأیید پس از Deploy و Rollback

موفق‌شدن Job Deploy به معنی موفقیت Release نیست. پس از انتشار، دست‌کم این موارد را بررسی کنید:

  • Health Check و Smoke Test از بیرون زیرساخت؛
  • نرخ خطا، Latency و Saturation نسبت به Baseline؛
  • شاخص‌های کلیدی مانند ورود، پرداخت یا ثبت سفارش؛
  • خطاهای Client و Server بر اساس نسخه؛
  • صف، دیتابیس، Cache و سرویس‌های وابسته؛
  • نتیجه Canary در مقایسه با گروه کنترل.

آستانه توقف را پیش از Deploy مشخص کنید. اگر هر رخداد نیازمند بحث تازه درباره «آیا Rollback کنیم؟» باشد، زمان بازیابی بالا می‌رود. برای طراحی مانیتورینگ و Runbook، راهنمای جلوگیری از قطع سایت و برای بازیابی، راهنمای Disaster Recovery و Runbook بازیابی سایت را ببینید.

معیارهای CI/CD که واقعاً مفیدند

تعداد Job یا درصد Pipeline سبز می‌تواند گمراه‌کننده باشد. معیارها باید سرعت جریان و پایداری را کنار هم نشان دهند. راهنمای رسمی معیارهای DORA این شاخص‌ها را تعریف می‌کند:

  • Change Lead Time: زمان از Commit تا اجرای موفق در Production؛
  • Deployment Frequency: تعداد استقرار در بازه یا فاصله استقرارها؛
  • Change Fail Rate: سهم استقرارهایی که مداخله فوری می‌خواهند؛
  • Failed Deployment Recovery Time: زمان بازیابی از استقرار ناموفق؛
  • Deployment Rework Rate: سهم استقرارهای برنامه‌ریزی‌نشده ناشی از Incident.

این معیارها را ابزار فشار فردی نکنید. هدف، پیدا کردن گلوگاه سیستم است. برای مثال Lead Time بالا ممکن است از صف Review، تست ناپایدار، انتظار محیط یا تأیید دستی بی‌اطلاعات ناشی شود.

ابزار CI/CD را چگونه انتخاب کنیم؟

به‌جای رتبه‌بندی عمومی Jenkins، GitHub Actions، GitLab CI یا سرویس‌های دیگر، نیاز خود را امتیاز دهید:

  • محل Repository و کیفیت یکپارچگی؛
  • Managed یا Self‑Hosted بودن Runner؛
  • شبکه لازم برای دسترسی به سرویس داخلی؛
  • مدل Permission، Environment Protection و Audit؛
  • OIDC، Secret Manager و Artifact Registry؛
  • ظرفیت، Queue Time، Cache و هزینه Runner؛
  • قابلیت Reusable Workflow و Policy مرکزی؛
  • محدودیت دسترسی شبکه، Registry و سرویس فروشنده برای تیم شما؛
  • امکان خروج، Backup تنظیمات و کاهش Vendor Lock‑in.

ابزاری که تیم می‌تواند امن نگهداری کند بهتر از پلتفرمی با صدها قابلیت بلااستفاده است. برای پروژه کوچک، Pipeline ساده و روشن معمولاً ارزشمندتر از Orchestration پیچیده است.

CI/CD برای تیم ایرانی؛ دسترسی را جزئی از معماری بدانید

برای تیمی در ایران، انتخاب ابزار فقط مقایسه قابلیت نیست. اختلال مسیر بین‌المللی، محدودیت حساب یا پرداخت، نرخ ارز و دسترسی نامتقارن Runner به Registry می‌تواند مسیر انتشار را متوقف کند. این ریسک را پنهان نکنید و برای دورزدن کنترل‌های ارائه‌دهنده برنامه نسازید؛ شرایط استفاده و محدودیت‌های حقوقی سرویس را بررسی و معماری مجاز و قابل پشتیبانی انتخاب کنید.

وابستگیآزمون پیش از انتخابراه کاهش ریسک
CI Providerثبت‌نام، احراز، پرداخت و دسترسی تیم پایدار است؟Pipeline as code قابل حمل و Export سابقه ضروری
Package RegistryRunner در سناریوی اختلال Package را دریافت می‌کند؟Mirror مجاز، Lockfile و Verification تمامیت
Artifact RegistryPush، Pull و Restore در Region مقصد چه وضعی دارد؟Retention، Replication و آزمون بازیابی
OIDC/Cloud APIEndpoint و Claimها از Runner قابل دسترس و معتبرند؟Trust policy محدود و مسیر اضطراری حسابرسی‌شده
RunnerManaged runner به شبکه خصوصی یا منبع لازم می‌رسد؟Runner موقت Self-hosted با ظرفیت و Patch مسئولانه
هزینه ارزیدقیقه Runner، Storage و Egress با رشد تیم چقدر است؟Budget alert، Cache درست و TCO سناریومحور
On-callهنگام اختلال چه کسی Credential و زیرساخت را بازیابی می‌کند؟مالک داخلی، Runbook و مانور دوره‌ای

Mirror بدون ثبت منشأ و Digest، ریسک Supply Chain را بیشتر می‌کند. برای Package و Artifact کش‌شده، منبع، زمان همگام‌سازی، Signature/Digest و Policy حذف را نگه دارید. Self-hosted Runner نیز «رایگان» نیست: Patch، Autoscaling، Isolation، Log، پاک‌سازی Workspace و پاسخ به Incident هزینه عملیاتی دارند. پیش از انتخاب، یک Probe ساده از شبکه واقعی Runner تا Repository، Registry، OIDC و مقصد Deploy اجرا و نتیجه را دوره‌ای ثبت کنید.

بازیابی بحران برای مسیر انتشار

اگر خود CI، Registry یا حساب Cloud از دسترس خارج شود، تیم باید بداند چه چیز را از کجا بازسازی کند. فایل Workflow، IaC، Policy و Runbook را نسخه‌دار کنید؛ Backup تنظیمات، Artifactهای حیاتی و کلیدهای بازیابی را با دسترسی کنترل‌شده نگه دارید و Bootstrap یک Runner پاک را تمرین کنید.

  • از روی Repository پاک، Pipeline و Environment حداقلی را بازسازی کنید.
  • Restore Artifact/Registry را با Digest و Provenance بررسی کنید.
  • Credential اضطراری را با دو نفر، عمر محدود و Audit فعال کنید.
  • در مانور، قطع CI Provider یا Registry را شبیه‌سازی و RTO واقعی را ثبت کنید.
  • مسیر دستی اضطراری را به دستورهای امضاشده، دامنه محدود و بازبینی پس از رخداد مقید کنید.

برنامه کامل Backup، Restore، RTO/RPO و تمرین Tabletop را در راهنمای Disaster Recovery و Runbook بازیابی سایت دنبال کنید. هدف ساختن یک Pipeline دوم و بلااستفاده نیست؛ هدف این است که Control Plane تحویل، Single Point of Failure ناشناخته نباشد.

نقشه پیاده‌سازی CI/CD در ۳۰ روز

هفته اول: خط مبنا

  • مسیر فعلی Commit تا Production و همه گام‌های دستی را ثبت کنید.
  • مالک Release، دسترسی‌ها و نقاط شکست پرتکرار را مشخص کنید.
  • Lint، Unit Test و Build قابل تکرار را در CI قرار دهید.

هفته دوم: Artifact و Staging

  • Build یک‌باره و نسخه‌گذاری Artifact را اجرا کنید.
  • Staging را با تنظیم جدا و Secret جدا بسازید.
  • Smoke Test و یک مسیر حیاتی E2E اضافه کنید.

هفته سوم: امنیت و انتشار

  • Permissionها را حداقل و Environment Production را محافظت کنید.
  • Secret Scan و Dependency Scan را با Policy قابل مدیریت اضافه کنید.
  • Deploy تکرارپذیر و جلوگیری از هم‌زمانی Production را پیاده کنید.

هفته چهارم: Verify و بازیابی

  • Release Marker را به مانیتورینگ بفرستید.
  • آستانه توقف و Runbook Rollback را تعریف و تمرین کنید.
  • Lead Time، نرخ شکست و زمان بازیابی را خط مبنا بگیرید.

اشتباه‌های رایج در پایپ‌لاین CI/CD

  • Deploy از لپ‌تاپ: مسیر انتشار قابل تکرار و Audit نیست.
  • Build جدا در هر محیط: نسخه آزموده‌شده با نسخه Production متفاوت می‌شود.
  • Secret در YAML: تاریخچه Git پاک‌کردن Credential را دشوار می‌کند.
  • دسترسی Admin برای Runner: آسیب یک Job به کل زیرساخت گسترش می‌یابد.
  • E2E بیش از حد: Pipeline کند و Flaky می‌شود و تیم خطاها را نادیده می‌گیرد.
  • Retry بی‌حد: خطای واقعی پنهان و هزینه Runner زیاد می‌شود.
  • Migration ناسازگار: Rollback کد دیگر پایگاه داده را نجات نمی‌دهد.
  • Deploy بدون Verify: Job سبز است اما کاربر خطا می‌بیند.
  • نبود مالک Rollback: Incident به جلسه تصمیم‌گیری تبدیل می‌شود.
  • بهینه‌سازی فقط برای سرعت: Deployment Frequency بالا همراه Change Fail Rate بالا نشانه بلوغ نیست.

سوالات متداول CI/CD

تفاوت Continuous Delivery و Continuous Deployment چیست؟

در Delivery نسخه همیشه آماده انتشار است ولی Production می‌تواند تأیید دستی داشته باشد. در Deployment، نسخه‌ای که Policyها را گذرانده خودکار وارد Production می‌شود.

آیا تیم کوچک هم به CI/CD نیاز دارد؟

بله، اما نه با پیچیدگی سازمان بزرگ. Lint، Test، Build یک‌باره، Deploy تکرارپذیر و Rollback روشن می‌تواند از یک Pipeline کوچک شروع شود.

آیا Docker برای CI/CD الزامی است؟

خیر. Artifact می‌تواند Package، فایل Build یا Image باشد. کانتینر قابلیت حمل و ثبات محیط را بهتر می‌کند، اما بدون طراحی درست تست، امنیت و استقرار مشکل را حل نمی‌کند.

Secretهای Production را کجا نگه داریم؟

در Secret Manager یا سازوکار امن و Scopeشده پلتفرم، با کمترین دسترسی و ترجیحاً Credential کوتاه‌عمر. Secret را در Repository، Image یا Log قرار ندهید.

Rollback بهتر است یا Fix Forward؟

به نوع خطا بستگی دارد. Rollback برای نسخه‌ای با Artifact و دیتابیس سازگار سریع است؛ تغییر داده برگشت‌ناپذیر ممکن است Fix Forward بخواهد. هر دو مسیر باید پیش از Incident طراحی و تمرین شوند.

جمع‌بندی: CI/CD یک سیستم کنترل ریسک است

پایپ‌لاین موفق تغییر کوچک را سریع بررسی می‌کند، یک Artifact قابل ردیابی می‌سازد، همان نسخه را بین محیط‌ها ارتقا می‌دهد، دسترسی Production را محدود می‌کند و پس از Deploy با داده واقعی درباره ادامه یا بازگشت تصمیم می‌گیرد. ابزار مهم است، اما قرارداد عملیاتی بین توسعه، امنیت، عملیات و محصول مهم‌تر است.

اگر برای طراحی Pipeline، سخت‌سازی Runner، انتخاب استراتژی Deploy یا اتصال مانیتورینگ و Rollback به فرایند انتشار کمک می‌خواهید، از طریق درخواست مشاوره مایندیو معماری فعلی و گلوگاه‌های Release را ارسال کنید.

مطالب مرتبط

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *