Technology

CircleCI Orbs Agile Scrum Kanban

circleci orbs agile scrum kanban
CircleCI Orbs Agile Scrum Kanban | SiamCafe Blog
2025-11-09· อ. บอม — SiamCafe.net· 8,440 คำ

CircleCI Orbs คืออะไร

CircleCI Orbs เป็น Reusable Configuration Packages สำหรับ CircleCI ช่วยให้ไม่ต้องเขียน Pipeline Configuration ซ้ำซ้อน Orb ประกอบด้วย Commands (ชุดคำสั่ง), Jobs (งานที่ทำ) และ Executors (Environment ที่รัน) สามารถใช้ Orbs จาก Registry หรือสร้าง Custom Orbs เอง

สำหรับทีม Agile (Scrum/Kanban) Orbs ช่วยเพิ่ม Velocity โดยลดเวลาที่ใช้กับ CI/CD Configuration ทีมสามารถ Focus กับการพัฒนา Features และส่งมอบ Value ได้เร็วขึ้น

CircleCI Config สำหรับ Agile Project

# .circleci/config.yml — CI/CD Pipeline สำหรับ Agile Team
version: 2.1

# === Orbs ===
orbs:
  node: circleci/node@5.2.0
  docker: circleci/docker@2.6.0
  slack: circleci/slack@4.13.3
  jira: circleci/jira@2.1.0
  kubernetes: circleci/kubernetes@1.3.1
  codecov: circleci/codecov@4.1.0

# === Parameters ===
parameters:
  run-nightly:
    type: boolean
    default: false

# === Executors ===
executors:
  node-executor:
    docker:
      - image: cimg/node:20.11
    resource_class: medium
    working_directory: ~/project

# === Commands (Reusable) ===
commands:
  install-deps:
    description: "Install Dependencies with Cache"
    steps:
      - checkout
      - node/install-packages:
          pkg-manager: npm
          cache-version: v2

  run-tests:
    description: "Run Tests with Coverage"
    steps:
      - run:
          name: Lint
          command: npm run lint
      - run:
          name: Type Check
          command: npm run type-check
      - run:
          name: Unit Tests
          command: npm run test -- --coverage --ci
      - store_test_results:
          path: test-results
      - store_artifacts:
          path: coverage
      - codecov/upload:
          file: coverage/lcov.info

  notify-slack:
    description: "Notify Slack Channel"
    parameters:
      channel:
        type: string
        default: "dev-notifications"
      event:
        type: string
        default: "always"
    steps:
      - slack/notify:
          channel: << parameters.channel >>
          event: << parameters.event >>
          template: basic_success_1

# === Jobs ===
jobs:
  # PR Check — ทุก Pull Request
  pr-check:
    executor: node-executor
    steps:
      - install-deps
      - run-tests
      - run:
          name: Build Check
          command: npm run build
      - notify-slack:
          channel: "pr-reviews"
          event: "fail"

  # Integration Tests
  integration-test:
    executor: node-executor
    steps:
      - install-deps
      - run:
          name: Integration Tests
          command: npm run test:integration
          no_output_timeout: 10m
      - store_test_results:
          path: test-results/integration

  # Build and Push Docker Image
  build-image:
    executor: docker/docker
    steps:
      - setup_remote_docker:
          version: "20.10.24"
      - checkout
      - docker/build:
          image: myapp/api
          tag: ", latest"
      - docker/push:
          image: myapp/api
          tag: ", latest"

  # Deploy to Staging
  deploy-staging:
    executor: node-executor
    steps:
      - checkout
      - kubernetes/install-kubectl
      - run:
          name: Deploy to Staging
          command: |
            kubectl set image deployment/myapp \
              myapp=myapp/api: \
              -n staging
            kubectl rollout status deployment/myapp -n staging
      - run:
          name: Smoke Tests
          command: npm run test:smoke -- --env=staging
      - notify-slack:
          channel: "deployments"
      - jira/notify:
          environment_type: staging
          job_type: deployment

  # Deploy to Production (with approval)
  deploy-production:
    executor: node-executor
    steps:
      - checkout
      - kubernetes/install-kubectl
      - run:
          name: Deploy to Production
          command: |
            kubectl set image deployment/myapp \
              myapp=myapp/api: \
              -n production
            kubectl rollout status deployment/myapp -n production
      - run:
          name: Production Smoke Tests
          command: npm run test:smoke -- --env=production
      - notify-slack:
          channel: "deployments"
      - jira/notify:
          environment_type: production
          job_type: deployment

  # Nightly Tests
  nightly-tests:
    executor: node-executor
    steps:
      - install-deps
      - run:
          name: Full Test Suite
          command: npm run test:all
          no_output_timeout: 30m
      - run:
          name: Security Audit
          command: npm audit --audit-level=high
      - run:
          name: Dependency Check
          command: npx depcheck
      - notify-slack:
          channel: "dev-notifications"

# === Workflows ===
workflows:
  # PR Workflow
  pr-pipeline:
    when:
      not: << pipeline.parameters.run-nightly >>
    jobs:
      - pr-check:
          filters:
            branches:
              ignore: [main, develop]

  # Staging Deployment
  staging-pipeline:
    when:
      not: << pipeline.parameters.run-nightly >>
    jobs:
      - pr-check:
          filters:
            branches:
              only: develop
      - integration-test:
          requires: [pr-check]
      - build-image:
          requires: [integration-test]
          context: docker-registry
      - deploy-staging:
          requires: [build-image]
          context: [k8s-staging, slack-tokens]

  # Production Deployment
  production-pipeline:
    when:
      not: << pipeline.parameters.run-nightly >>
    jobs:
      - pr-check:
          filters:
            branches:
              only: main
      - integration-test:
          requires: [pr-check]
      - build-image:
          requires: [integration-test]
          context: docker-registry
      - hold-for-approval:
          type: approval
          requires: [build-image]
      - deploy-production:
          requires: [hold-for-approval]
          context: [k8s-production, slack-tokens]

  # Nightly Pipeline
  nightly:
    when: << pipeline.parameters.run-nightly >>
    jobs:
      - nightly-tests:
          context: slack-tokens

Custom Orb สำหรับทีม

# === สร้าง Custom Orb ===

# 1. ติดตั้ง CircleCI CLI
# curl -fLSs https://raw.githubusercontent.com/CircleCI-CLI/install/main/install.sh | bash

# 2. สร้าง Namespace
circleci namespace create myorg github myorg-github

# 3. สร้าง Orb
circleci orb create myorg/deploy-helper

# 4. Orb Source — src/orb.yml
# === Custom Deploy Helper Orb ===
# description: Deploy Helper สำหรับทีม Agile

# commands:
#   health-check:
#     description: "ตรวจสอบ Health ของ Application"
#     parameters:
#       url:
#         type: string
#       retries:
#         type: integer
#         default: 10
#       interval:
#         type: integer
#         default: 10
#     steps:
#       - run:
#           name: Health Check
#           command: |
#             for i in $(seq 1 << parameters.retries >>); do
#               STATUS=$(curl -s -o /dev/null -w "%{http_code}" << parameters.url >>)
#               if [ "$STATUS" = "200" ]; then
#                 echo "Health check passed!"
#                 exit 0
#               fi
#               echo "Attempt $i: HTTP $STATUS, retrying..."
#               sleep << parameters.interval >>
#             done
#             echo "Health check failed!"
#             exit 1
#
#   rollback:
#     description: "Rollback Deployment"
#     parameters:
#       deployment:
#         type: string
#       namespace:
#         type: string
#         default: "default"
#     steps:
#       - run:
#           name: Rollback
#           command: |
#             kubectl rollout undo deployment/<< parameters.deployment >> \
#               -n << parameters.namespace >>
#             kubectl rollout status deployment/<< parameters.deployment >> \
#               -n << parameters.namespace >>
#
#   update-jira-sprint:
#     description: "อัพเดท Jira Sprint Status"
#     parameters:
#       status:
#         type: string
#         default: "deployed"
#     steps:
#       - run:
#           name: Update Jira
#           command: |
#             # Extract Jira ticket from branch name
#             TICKET=$(echo $CIRCLE_BRANCH | grep -oP '[A-Z]+-\d+' || echo "")
#             if [ -n "$TICKET" ]; then
#               curl -X POST "$JIRA_URL/rest/api/3/issue/$TICKET/transitions" \
#                 -H "Authorization: Basic $JIRA_TOKEN" \
#                 -H "Content-Type: application/json" \
#                 -d '{"transition": {"id": "31"}}'
#               echo "Updated $TICKET to << parameters.status >>"
#             fi

# 5. Validate
circleci orb validate src/orb.yml

# 6. Publish
circleci orb publish src/orb.yml myorg/deploy-helper@1.0.0

# 7. ใช้ใน config.yml
# orbs:
#   deploy: myorg/deploy-helper@1.0.0
#
# jobs:
#   deploy-app:
#     steps:
#       - deploy/health-check:
#           url: "https://staging.example.com/health"
#       - deploy/update-jira-sprint:
#           status: "deployed"

Sprint Metrics Dashboard

# sprint_metrics.py — ดึง Metrics จาก CircleCI สำหรับ Sprint Review
import requests
import json
from datetime import datetime, timedelta
from collections import defaultdict

class CircleCIMetrics:
    """ดึง CI/CD Metrics สำหรับ Sprint Review"""

    def __init__(self, token, project_slug):
        self.token = token
        self.base_url = "https://circleci.com/api/v2"
        self.project = project_slug
        self.headers = {"Circle-Token": token}

    def get_pipelines(self, days=14):
        """ดึง Pipelines ย้อนหลัง"""
        resp = requests.get(
            f"{self.base_url}/project/{self.project}/pipeline",
            headers=self.headers,
            params={"branch": "main"},
        )
        pipelines = resp.json().get("items", [])

        cutoff = datetime.now() - timedelta(days=days)
        return [p for p in pipelines
                if datetime.fromisoformat(p["created_at"].replace("Z", ""))
                > cutoff]

    def get_workflow_metrics(self, pipeline_id):
        """ดึง Workflow Metrics"""
        resp = requests.get(
            f"{self.base_url}/pipeline/{pipeline_id}/workflow",
            headers=self.headers,
        )
        return resp.json().get("items", [])

    def sprint_report(self, sprint_days=14):
        """สร้าง Sprint CI/CD Report"""
        pipelines = self.get_pipelines(sprint_days)

        stats = {
            "total_pipelines": len(pipelines),
            "success": 0, "failed": 0,
            "total_duration_min": 0,
            "deploys": 0,
        }

        for p in pipelines:
            workflows = self.get_workflow_metrics(p["id"])
            for w in workflows:
                if w["status"] == "success":
                    stats["success"] += 1
                elif w["status"] == "failed":
                    stats["failed"] += 1

                if "deploy" in w.get("name", "").lower():
                    stats["deploys"] += 1

        total = stats["success"] + stats["failed"]
        stats["success_rate"] = (stats["success"] / total * 100
                                  if total > 0 else 0)

        print(f"\n{'='*50}")
        print(f"Sprint CI/CD Report ({sprint_days} days)")
        print(f"{'='*50}")
        print(f"  Total Pipelines: {stats['total_pipelines']}")
        print(f"  Success Rate:    {stats['success_rate']:.1f}%")
        print(f"  Deployments:     {stats['deploys']}")
        print(f"  Failed Builds:   {stats['failed']}")

        return stats

# metrics = CircleCIMetrics("TOKEN", "gh/myorg/myrepo")
# metrics.sprint_report(14)

Best Practices

CircleCI Orbs คืออะไร

Reusable Packages สำหรับ CircleCI Configuration มี Commands Jobs Executors สร้างไว้ล่วงหน้า ลดการเขียน Config ซ้ำ เช่น Orb สำหรับ AWS Docker Slack Kubernetes ติดตั้งง่ายบรรทัดเดียว

CircleCI Orbs ช่วยทีม Agile อย่างไร

ลดเวลา Setup CI/CD Pipeline ทีม Focus พัฒนา Feature Slack Orb แจ้ง Build Status Jira Orb อัพเดท Ticket อัตโนมัติเมื่อ Deploy สำเร็จ Sprint Velocity เพิ่มขึ้น

วิธีสร้าง Custom Orb ทำอย่างไร

ใช้ CircleCI CLI สร้างด้วย circleci orb create เขียน Orb Source ใน YAML กำหนด Commands Jobs Executors Publish ด้วย circleci orb publish ใช้ Semantic Versioning ทดสอบด้วย circleci orb validate

CircleCI Config สำหรับ Agile Project ควรมีอะไรบ้าง

Lint Test ทุก PR, Build Deploy Staging จาก develop, Deploy Production จาก main พร้อม Approval, Slack Notification, Auto-update Jira Tickets, Scheduled Nightly Tests

สรุป

CircleCI Orbs ช่วยทีม Agile สร้าง CI/CD Pipeline ที่มีประสิทธิภาพ ใช้ Official Orbs สำหรับ Docker, Kubernetes, Slack, Jira ลดเวลา Configuration สร้าง Custom Orbs สำหรับ Workflow เฉพาะทีม ใช้ Approval Gates สำหรับ Production ติดตาม Sprint Metrics จาก CI/CD Data ใช้ใน Retrospective ปรับปรุง Process อย่างต่อเนื่อง

📖 บทความที่เกี่ยวข้อง

Mintlify Docs Agile Scrum Kanbanอ่านบทความ → CircleCI Orbs Team Productivityอ่านบทความ → CircleCI Orbs Performance Tuning เพิ่มความเร็วอ่านบทความ → Ceph Storage Cluster Agile Scrum Kanbanอ่านบทความ → CircleCI Orbs CDN Configurationอ่านบทความ →

📚 ดูบทความทั้งหมด →