مواد پر جائیں

CI کی لازمی جانچیں

آپ کی لازمی جانچیں کامیاب ہوئیں۔ آپ کے ٹیسٹس چلے ہی نہیں۔

شرط کے باعث نہ چلنے والی آزمائشی جابز کس طرح برانچ کی حفاظتی شرط پوری کر سکتی ہیں، اور ہمیشہ چلنے والی نگران جابز بغیر آزمائش کے مرج کو کیسے روکتی ہیں۔

پڑھنے کا وقت: 4 منٹتحریر

ایک مفید بہتری نے پالیسی میں خلا کھول دیا

اکائی اور E2E جابز صرف run-tests لیبل لگنے کے بعد شروع ہوتی تھیں۔ اس سے پل ریکوئسٹ کی تیاری کے دوران مہنگے آزمائشی مجموعے مؤخر ہوسکتے تھے، مگر ہر مرج پر ان کا چلنا پھر بھی لازم تھا۔ برانچ کی حفاظتی شرط اس ارادے کو نافذ نہیں کرتی تھی۔

جاب کی سطح کی شرط false ہونے پر آزمائشی ورکر نہیں چلتا تھا۔ لازمی جانچ کے لیے GitHub پھر بھی اس skipped جاب کو کامیاب نتیجہ دیتا تھا۔ یوں پل ریکوئسٹ سبز دکھ سکتی تھی حالانکہ آزمائش کا کوئی حکم نہیں چلا تھا۔

ورکر کو مشروط رکھیں

میں نے لیبل برقرار رکھا کیونکہ جائزے کے دوران مفید تھا۔ غلطی مشروط ورکر ہی کو لازمی جانچ بنانا تھی۔ ورکر نہ چلنے پر بھی GitHub اس جانچ کو مطمئن کرسکتا تھا۔

unit-tests:
  if: |
    github.event_name == 'workflow_dispatch' ||
    (github.event.action == 'labeled' && github.event.label.name == 'run-tests') ||
    (github.event.action == 'synchronize' &&
      contains(github.event.pull_request.labels.*.name, 'run-tests'))
  steps:
    - run: pnpm test:unit:coverage

ورکر طے کرتا ہے کہ ابھی چلنا ہے یا نہیں۔ الگ گیٹ طے کرتی ہے کہ پل ریکوئسٹ مرج کے لیے محفوظ ہے یا نہیں۔ دونوں فیصلے ملانے سے جھوٹی سبز حالت بنی۔

ورکر کو پالیسی سے الگ کریں

میں نے ہر ورکر کے بعد ایک چھوٹا گیٹ شامل کیا۔ یہ needs میں ورکر کو شامل کرتا ہے، if: always() کے ساتھ چلتا ہے، اور صرف اس وقت کامیاب ہوتا ہے جب ورکر کا نتیجہ success ہو۔ skipped، cancelled یا failed ٹیسٹ سوٹ اب واضح پیغام کے ساتھ مرج کو روکتا ہے۔

ci-gate:
  name: CI Gate (Unit)
  runs-on: ubuntu-latest
  needs: [unit-tests]
  if: always()
  steps:
    - name: Check test results
      run: |
        result="${{ needs.unit-tests.result }}"
        if [[ "$result" != "success" ]]; then
          echo "::error::Unit tests did not pass (result: $result)"
          exit 1
        fi
        echo "Unit tests passed"
پچھلا نتیجہ      لازمی گیٹ
success          pass
failure          fail
cancelled        fail
skipped          قابلِ عمل لیبل پیغام کے ساتھ fail

مہنگے ورکرز کو مشروط ہی رکھیں

گیٹس حقیقی ٹیسٹ سوٹس کے سامنے ہیں۔ یونٹ کوریج میں 73 Jest فائلیں، لازمی تھریش ہولڈز اور بڑھتی ہوئی کوریج شامل تھی۔ Playwright چار ورکرز، CI میں دو دوبارہ کوششوں اور مشترک تصدیق شدہ حالت کے ساتھ Chromium اور WebKit میں چلا۔

اکائی اور E2E دونوں کو مستقل گیٹ نام ملا۔ ورکر کا اطلاق بعد میں بدلے تب بھی برانچ کی حفاظت انہی ناموں کو لازمی رکھ سکتی ہے۔

ورکر نہیں، گیٹ کو لازمی بنائیں

برانچ کی حفاظتی شرط کو مشروط ورکرز کے بجائے CI Gate (Unit) اور CI Gate (E2E) لازمی کرنے کے لیے بدلا گیا۔ اس سے مرج کا معاہدہ واضح ہوا: متوقع آزمائشی مجموعہ یا کامیابی سے چلے، یا نہ چلنے کی وجہ بتانے والی واضح ناکامی دے۔

  • ریپوزٹری میں واضح وجہ ہو تو مہنگا کام مشروط رکھیں۔
  • مرج پالیسی کے لیے اہم ہر ورکر کے آخری نتیجے کو ہمیشہ یکجا کریں۔
  • برانچ کی حفاظت میں مستقل یکجا کنندہ نام لازمی کریں۔
  • نہ چلنے والی جانچ کو خاموش سبز حالت کے بجائے قابلِ عمل بنائیں۔