0
0
Lập trình
Admin Team
Admin Teamtechmely

Cấu Hình Pipelines Starlark trong Woodpecker CI

Đăng vào 6 giờ trước

• 11 phút đọc

Giới Thiệu

Công cụ Tích hợp Liên tục (CI) là một phần thiết yếu trong quy trình phát triển phần mềm hiện đại, cho phép tự động hóa việc xây dựng và kiểm tra mã nguồn. Woodpecker CI là một trong những công cụ mã nguồn mở nhẹ nhàng hỗ trợ cho CI/CD. Nó không chỉ là một nhánh mở của dự án Drone CI nổi tiếng mà còn có nhiều điểm tương đồng về thiết kế và khả năng tương thích với pipeline của Drone. Mặc dù truyền thống Woodpecker sử dụng YAML để định nghĩa pipeline, nhưng giờ đây, với sự nổi lên của các pipeline có thể lập trình, chúng ta có thể sử dụng Starlark - một ngôn ngữ cấu hình giống Python - để xác định cấu hình CI của mình.

Trong bài viết này, tôi sẽ hướng dẫn bạn cách thiết lập Woodpecker CI với Traefik làm reverse proxy và WCCS (Woodpecker CI Config Service) để chuyển đổi các cấu hình Starlark thành tệp YAML, cho phép chúng ta viết các pipeline trong các tệp .star. Dưới đây là tóm tắt nội dung chúng ta sẽ khám phá:

  • Khởi động máy chủ Woodpecker với Traefik
  • Xác thực với GitHub
  • Kích hoạt một kho lưu trữ
  • Kết nối WCCS với máy chủ Woodpecker

Cuối cùng, bạn sẽ có thể viết các pipeline CI bằng Starlark và tự động chuyển đổi chúng thành YAML trong thời gian chạy.

Cài Đặt Máy Chủ Woodpecker và Agent

Bắt đầu bằng cách thiết lập máy chủ Woodpecker và các dịch vụ agent trong tệp docker-compose.yml như sau:

yaml Copy
services:
  woodpecker-server:
    image: woodpeckerci/woodpecker-server:v3
    environment:
      - WOODPECKER_LOG_LEVEL=debug
      - WOODPECKER_OPEN=false
      - WOODPECKER_HOST=http://<your-ci-server>
      - WOODPECKER_GITHUB=true
      - WOODPECKER_GITHUB_CLIENT=xxxxxxx   # ID client OAuth GitHub
      - WOODPECKER_GITHUB_SECRET=xxxxxxx   # bí mật OAuth GitHub
      - WOODPECKER_AGENT_SECRET=xxxxxxx    # bí mật chia sẻ giữa máy chủ và các agent
      - WOODPECKER_ADMIN=tên-người-dùng-github-của-bạn
      - WOODPECKER_CONFIG_SERVICE_ENDPOINT=http://<your-config-service-server>
    volumes:
      - woodpecker-server-data:/var/lib/woodpecker/
    networks:
      - woodpecker-net

  woodpecker-agent:
    image: woodpeckerci/woodpecker-agent:v3
    restart: always
    depends_on:
      - woodpecker-server
    volumes:
      - woodpecker-agent-config:/etc/woodpecker
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WOODPECKER_LOG_LEVEL=debug
      - WOODPECKER_SERVER=woodpecker-server:9000
      - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}
    networks:
      - woodpecker-net

volumes:
  woodpecker-server-data:
  woodpecker-agent-config:

networks:
  woodpecker-net:
    driver: bridge

Cấu Hình Traefik cho HTTPS

Hiện tại, máy chủ Woodpecker của chúng ta đang chạy trên HTTP, vì vậy để chuyển sang HTTPS, chúng ta cần cấu hình Traefik. Traefik đóng vai trò quan trọng trong kiến trúc này, xử lý tất cả các phức tạp về mạng - từ SSL termination, định tuyến đến cân bằng tải. Thêm dịch vụ Traefik vào tệp docker-compose.yml ngay phía trên dịch vụ woodpecker-server:

yaml Copy
services:
  traefik:
    image: traefik:v3.1
    container_name: traefik
    command:
      - "--log.level=DEBUG"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.letsencrypt.acme.email=example@example.com"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    networks:
      - woodpecker-net

  woodpecker-server:
    image: woodpeckerci/woodpecker-server:v3
    ...

  woodpecker-agent:
    image: woodpeckerci/woodpecker-agent:v3
    ...

Cấu hình này:

  • Thiết lập Traefik để lắng nghe trên các cổng 80 và 443
  • Cấu hình quản lý chứng chỉ SSL tự động thông qua letsEncrypt
  • Kích hoạt nhà cung cấp Docker để tự động phát hiện các dịch vụ mới
  • Mount các volume cần thiết cho việc lưu trữ chứng chỉ và truy cập Docker socket

Sau khi cấu hình Traefik, cập nhật dịch vụ máy chủ Woodpecker bằng cách thêm các nhãn sau:

yaml Copy
  woodpecker-server:
    ...
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.woodpecker-secure.rule=Host(`your-ci-server`)"
      - "traefik.http.routers.woodpecker-secure.entrypoints=websecure"
      - "traefik.http.routers.woodpecker-secure.tls.certresolver=letsencrypt"
      - "traefik.http.routers.woodpecker-secure.tls=true"
      - "traefik.http.services.woodpecker-secure.loadbalancer.server.port=8000"
      - "traefik.http.routers.woodpecker-http.rule=Host(`your-ci-server`)"
      - "traefik.http.routers.woodpecker-http.entrypoints=web"
      - "traefik.http.routers.woodpecker-http.middlewares=redirect-to-https"
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
    networks:
      - woodpecker-net

Xác Thực với GitHub

Woodpecker không thể hoạt động một mình; nó cần một dịch vụ nơi các kho lưu trữ được lưu trữ. Woodpecker hỗ trợ nhiều dịch vụ khác nhau, trong bài viết này, chúng ta sẽ tập trung vào GitHub.

Để kết nối GitHub với Woodpecker:

  1. Đăng ký một ứng dụng OAuth mới trong cài đặt nhà phát triển GitHub của bạn.
  2. Trong ứng dụng OAuth GitHub của bạn, đặt URL callback xác thực thành https://<your-ci-server>/authorize
  3. Sao chép ID Client và Secret được tạo.
  4. Sử dụng các giá trị này trong biến môi trường WOODPECKER_GITHUB_CLIENTWOODPECKER_GITHUB_SECRET.

Sau đó, bạn có thể đăng nhập vào giao diện người dùng Woodpecker bằng tài khoản GitHub của mình.

Kích Hoạt một Kho Lưu Trữ

Trước khi kích hoạt một kho lưu trữ trên máy chủ Woodpecker CI, hãy chắc chắn rằng bạn có một kho lưu trữ GitHub sẵn sàng. Bạn có thể sử dụng một kho lưu trữ hiện có hoặc tạo một kho lưu trữ mới. Chúng ta sẽ tạo một pull request đến kho lưu trữ để kích hoạt CI sau này.

Từ giao diện người dùng Woodpecker:

  • Nhấp vào Thêm Kho Lưu Trữ.
  • Kích hoạt nó. Trong bài viết này, tôi sử dụng kho lưu trữ đã có tên là Drum-KIT và đã được kích hoạt.

Woodpecker sẽ tự động thêm các webhook cần thiết vào kho lưu trữ.

Kích Hoạt Lần Chạy CI Đầu Tiên

Khi chúng ta đang cố gắng tích hợp dịch vụ chuyển đổi Starlark, Woodpecker CI hỗ trợ các pipeline .yml mặc định. Bây giờ chúng ta có thể kích hoạt lần chạy CI đầu tiên bằng cách sử dụng cấu hình YAML truyền thống như sau. Tạo một nhánh mới và thêm cấu hình sau vào gốc kho lưu trữ GitHub đã kích hoạt với tên tệp là .woodpecker.yml.

yaml Copy
steps:
  - name: hello
    image: alpine
    commands:
      - echo "Hello from CI"
      - echo "--------------------"
      - echo "This is my first CI BUILD"
      - echo "--------------------"
    when:
      event: pull_request
      branch: master  # cấu hình nó là nhánh cơ sở của kho của bạn (trong trường hợp của tôi, đó là `master`)

Bây giờ bạn đã có tệp .woodpecker.yaml sẵn sàng, bạn có thể commit và push nó đến kho lưu trữ GitHub đã kích hoạt và sau đó, mở một Pull Request từ nhánh của bạn đến master/main tùy theo kho của bạn. Nhánh mặc định của GitHub được đặt là main. Khi PR được tạo, Woodpecker sẽ tự động lấy cấu hình pipeline và bắt đầu lần chạy CI đầu tiên của bạn. Bạn có thể vào giao diện người dùng Woodpecker để xem nhật ký build theo thời gian thực.

Bây giờ chúng ta đã thiết lập máy chủ Woodpecker và kích hoạt các pipeline bằng cấu hình .yaml truyền thống, hãy tích hợp WCCS để mở khóa tính linh hoạt và xác định các pipeline của chúng ta trong Starlark.

Cài Đặt WCCS - Dịch Vụ Cấu Hình Woodpecker CI (Dịch Vụ Chuyển Đổi Starlark)

Dịch vụ Chuyển Đổi Cấu Hình Woodpecker (WCCS) là một dịch vụ web nhẹ được tạo ra và duy trì bởi Opencloud-eu. Nó cho phép Woodpecker CI chuyển đổi các định nghĩa pipeline được viết bằng Starlark thành YAML tiêu chuẩn ngay lập tức bằng cách nhận một yêu cầu POST đã ký từ Woodpecker. Bạn có thể dễ dàng triển khai WCCS bằng cách sử dụng hình ảnh Docker chính thức của họ có sẵn trên Docker Hub: opencloudeu/wccs.

Cập nhật tệp docker-compose.yml của bạn để bao gồm dịch vụ WCCS:

yaml Copy
...

  wccs:
    image: opencloudeu/wccs:latest
    container_name: wccs
    command: server
    environment:
      - WCCS_LOG_LEVEL=debug
      - WCCS_SERVER_PUBLIC_KEY=/keys/public.pem # đường dẫn đến khóa công khai (được tạo trong phần bên dưới)
    volumes:
      - /opt/woodpecker/keys:/keys
      - /etc/ssl/certs:/etc/ssl/certs:ro
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.wccs.rule=Host(`your-wccs-server`)"
      - "traefik.http.routers.wccs.entrypoints=websecure"
      - "traefik.http.routers.wccs.tls.certresolver=letsencrypt"
      - "traefik.http.services.wccs.loadbalancer.server.port=8080"
    networks:
      - woodpecker-net

...

volumes:
  woodpecker-server-data:
  woodpecker-agent-config:

networks:
  woodpecker-net:
    driver: bridge

Tạo Khóa Công Khai

Trước khi chạy bất kỳ pipeline nào, máy chủ Woodpecker gửi một yêu cầu POST đến dịch vụ cấu hình bên ngoài (trong trường hợp của chúng ta là WCCS) với tất cả thông tin tệp cấu hình hiện tại và thông tin build của kho hiện tại. Dịch vụ bên ngoài này nhận thông tin và gửi lại cấu hình pipeline. Trong trường hợp của chúng ta, đây là cách mà một tệp Starlark được chuyển đổi thành các cấu hình YAML.

Trước khi WCCS có thể chấp nhận và xử lý các yêu cầu đó, nó cần xác minh rằng các yêu cầu đó là đáng tin cậy và đến từ máy chủ Woodpecker.

Mỗi yêu cầu được gửi bởi Woodpecker được ký bằng một http-signature bằng khóa riêng (ed25519) được tạo ra khi máy chủ Woodpecker khởi động lần đầu tiên. Bạn có thể lấy khóa công khai để xác minh chữ ký http từ:

Copy
https://<your-ci-server>/api/signature/public-key

Lưu khóa công khai đó vào keys/public.pem trong cùng một thư mục với tệp docker-compose. Tệp public.pem sau đó được mount vào container WCCS như đã hiển thị trong đoạn mã trên và được sử dụng trong biến môi trường WCCS_SERVER_PUBLIC_KEY.

Kết Nối WCCS với Woodpecker

Để cho phép Woodpecker lấy cấu hình pipeline từ WCCS, chúng ta đã thêm dòng sau vào biến môi trường của máy chủ:

Copy
WOODPECKER_CONFIG_SERVICE_ENDPOINT=http://wccs:8080/ciconfig

Woodpecker giờ đây gửi một payload JSON đã ký đến WCCS mỗi khi một build được kích hoạt. WCCS xác minh chữ ký bằng cách sử dụng khóa công khai và phản hồi với một pipeline YAML dựa trên tệp .woodpecker.star của bạn.

Sau khi kết nối WCCS với máy chủ Woodpecker, còn một điều nữa bạn cần làm là thiết lập đường dẫn cấu hình pipeline, bởi vì mặc định Woodpecker sẽ lấy .woodpecker.yaml làm cấu hình pipeline của nó.

  • Từ cài đặt của máy chủ Woodpecker, hãy vào Repositories và nhấp vào biểu tượng cài đặt của kho đã được kích hoạt như hình dưới đây:
  • Sau đó, thêm .woodpecker.star làm đường dẫn cấu hình pipeline và lưu lại:

Thêm Một Pipeline Starlark Đơn Giản

Dưới đây là một ví dụ cấu hình pipeline Starlark đơn giản mà bạn có thể thêm vào dự án của mình. Tạo một nhánh mới bằng cách checkout từ nhánh master/main của bạn. Thêm cấu hình sau vào tệp .woodpecker.star trong gốc kho của bạn:

python Copy
def main(ctx):
    return [{
        "name": "hello",
        "steps": [
            {
                "name": "greeting",
                "image": "alpine",
                "commands": [
                    "echo Hello from CI",
                ],
                "when": {
                    "event": ["push", "pull_request"],
                    "branch": ["master"],
                },
            }
        ]
    }]

Kích Hoạt CI với Pipeline Starlark

Bây giờ bạn đã có tệp .woodpecker.star sẵn sàng, hãy commit và push nó đến kho lưu trữ GitHub của bạn, sau đó mở một Pull Request mới từ nhánh của bạn đến master/main. Khi PR được tạo, Woodpecker sẽ tự động gửi yêu cầu build đến WCCS, lấy cấu hình pipeline và bắt đầu lần chạy CI đầu tiên của bạn. Bạn có thể vào giao diện người dùng Woodpecker để xem nhật ký build theo thời gian thực.

Kết Luận

Cài đặt này cung cấp một pipeline CI/CD mạnh mẽ, an toàn và linh hoạt bằng cách sử dụng Woodpecker CI, được nâng cao với WCCS cho việc quản lý cấu hình và được bảo vệ bởi Traefik. Sự tích hợp của các thành phần này tạo ra một hệ thống mạnh mẽ có thể xử lý các cấu hình pipeline phức tạp trong khi vẫn duy trì tính bảo mật và dễ sử dụng.

Giờ đây, chúng ta có thể viết các pipeline bằng Starlark và để WCCS xử lý việc chuyển đổi ngay lập tức. Cách tiếp cận này mang lại tính linh hoạt, cấu trúc và sức mạnh của các cấu hình dựa trên logic cho các pipeline CI của chúng ta.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào