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 و تنظیمات | خطای سریع و ارزان |
| Test | Unit و Integration و کنترل قرارداد | گزارش آزمون و Coverage معنادار |
| Build | ساخت یکباره Artifact | فایل یا Image نسخهدار با Digest |
| Security | اسکن کد، وابستگی، Secret و Artifact | Policy قبول/رد و گزارش قابل پیگیری |
| Staging | استقرار نسخه واقعی در محیط نزدیک به Production | Smoke/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 time | Job تا گرفتن Runner چقدر منتظر میماند؟ | ظرفیت، اولویت و Autoscaling Runner |
| Time to first feedback | اولین خطای مفید چه زمانی دیده میشود؟ | Fail fast و جداکردن Critical path |
| Flake rate | چند شکست بدون تغییر کد در Retry سبز میشود؟ | Registry خطا، مالک و Quarantine محدود |
| Cache hit/correctness | Cache چقدر سرعت میدهد و چند خطای نامعتبر میسازد؟ | کلید 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 confusion | Package همنام از Registry عمومی دریافت میشود | Namespace، Lockfile، Registry policy و Verification |
| Runner | باقیماندن Token، Workspace یا دسترسی شبکه | Runner موقت، Image سختسازیشده و پاکسازی پس از Job |
| OIDC | Trust policy بیش از حد باز است | Audience و Subject محدود به Owner، Repository، Ref و Environment مجاز |
| Artifact/Cache | جایگزینی خروجی یا Cache poisoning | Digest، 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 استفاده کنید:
- Expand: ساختار جدید را بهشکل سازگار با نسخه قدیمی اضافه کنید.
- Migrate: داده را مرحلهای Backfill کنید و صحت را بسنجید.
- Switch: خواندن/نوشتن را با Feature Flag یا نسخه سازگار منتقل کنید.
- Contract: پس از اطمینان و پایان بازه Rollback، ساختار قدیمی را حذف کنید.
Migration باید Idempotent یا دستکم وضعیت اجرا و امکان ادامه امن داشته باشد. پیش از Production روی دادهای با حجم و شکل نزدیک به واقعیت آزمایش کنید. Backup لازم است، اما Restore آزمودهشده مهمتر از وجود فایل Backup است.
Compatibility Window را صریح تعریف کنید
در Rolling یا Canary، نسخه N و N-۱ مدتی همزمان با یک Schema کار میکنند. قرارداد سازگاری باید بگوید هر نسخه چه فیلدی را میخواند و مینویسد و نقطه بدون بازگشت کجاست.
| مرحله | وضعیت Schema و کد | Gate خروج |
|---|---|---|
| Expand | ساختار جدید اختیاری است و نسخه قدیم همچنان کار میکند | Migration کوتاه، قفل کنترلشده و Schema تأییدشده |
| Mixed versions | N و N-۱ روی Schema مشترک اجرا میشوند | Contract test و سنجش خواندن/نوشتن هر دو نسخه |
| Switch | Backfill کامل و مسیر خواندن/نوشتن جدید فعال میشود | 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 Registry | Runner در سناریوی اختلال Package را دریافت میکند؟ | Mirror مجاز، Lockfile و Verification تمامیت |
| Artifact Registry | Push، Pull و Restore در Region مقصد چه وضعی دارد؟ | Retention، Replication و آزمون بازیابی |
| OIDC/Cloud API | Endpoint و Claimها از Runner قابل دسترس و معتبرند؟ | Trust policy محدود و مسیر اضطراری حسابرسیشده |
| Runner | Managed 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 را ارسال کنید.
مطالب مرتبط
- پیادهسازی DevSecOps در چرخه توسعه
- تست نرمافزار برای وباپلیکیشن
- مفاهیم DevOps، کانتینر و Orchestration
- Kubernetes و کانتینرسازی در هاستینگ
- مانیتورینگ و جلوگیری از قطع سایت
- پشتیبانگیری و Disaster Recovery






