پرش به محتوای اصلی

کالبدشکافی خط لوله

یک خط لوله‌ی خوب کسل‌کننده است. هیچ مرحله‌ای نباید شما را غافلگیر کند و هیچ مرحله‌ای نباید بیش از آنچه از نامش برمی‌آید انجام دهد.

چهار مرحله

خط لوله‌ی پیش‌فرض ما چهار مرحله دارد: verify، build، stage و promote. سه مرحله‌ی نخست روی هر Merge Request اجرا می‌شوند؛ مرحله‌ی چهارم فقط روی شاخه‌ی اصلی.

stages: [verify, build, stage, promote]
 
verify:
  stage: verify
  script:
    - npm ci
    - npm run lint
    - npm test -- --coverage
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
 
build:
  stage: build
  script:
    - docker build -t $IMAGE:$CI_COMMIT_SHA .
    - trivy image --exit-code 1 --severity HIGH,CRITICAL $IMAGE:$CI_COMMIT_SHA
    - cosign sign --yes $IMAGE:$CI_COMMIT_SHA

توجه کنید که trivy با --exit-code 1 اجرا می‌شود. اسکنی که نتیجه‌اش خط لوله را متوقف نمی‌کند، فقط یک گزارش تزئینی است.

چرا Digest و نه Tag

پس از ساخت، ایمیج با Digest ارجاع داده می‌شود، نه با Tag. Tag قابل جابه‌جایی است؛ Digest نیست. این تفاوت، تفاوت میان «می‌دانم چه چیزی در حال اجراست» و «حدس می‌زنم» است.

زمان‌بندی واقعی

اعداد زیر میانگین سی روز گذشته روی سرویس‌های تحت مدیریت ماست:

مرحلهمیانهصدک ۹۵
verify۲ دقیقه۴ دقیقه
build۳ دقیقه۷ دقیقه
stage۱ دقیقه۲ دقیقه
promote۴ دقیقه۹ دقیقه

اگر مرحله‌ی verify بیش از پنج دقیقه طول بکشد، توسعه‌دهندگان منتظر نمی‌مانند — کار دیگری را شروع می‌کنند و زمینه را از دست می‌دهند. سرعت خط لوله یک ویژگی محصول است، نه یک شاخص عملیاتی.

انتشار تدریجی

مرحله‌ی promote ترافیک را در چهار گام جابه‌جا می‌کند: پنج، بیست‌وپنج، پنجاه و صد درصد. میان هر گام، بودجه‌ی خطا بررسی می‌شود و در صورت نقض، بازگشت خودکار انجام می‌گیرد.

mizban rollout status payments --watch
mizban rollout undo payments --to-revision 41