Skip to main content

CI/CD với Verdaccio

Thiết lập hệ thống CI/CD cho Verdaccio. Tự động publish package khi có commit mới.

Chuẩn bị

Verdaccio Server

Jenkins

Jenkins Plugins

  • Blue Ocean
  • NodeJS (Cài đặt tự động NodeJS lên Agent)
  • Credentials
  • Credentials Binding
  • GitHub (Cần cho Webhook)
  • Discord (Thông báo khi pipeline chạy xong)

Package Repo (Repo trên Git, Github, Gitlab… folder package chứa Jenkinsfile và package.json)

Jenkins Credentials (Cài đặt Credentials)

  • Credential cho Verdaccio (chứa username, password đăng nhập Verdaccio)
  • Credential cho Github (chứa username và PAT xác thực Github)
  • Credential cho Github Secret (chứa Webhook Secret của Github)
  • Credential cho Discord Webhook URL (chứa Webhook URL của Discord)

Tạo và cấu hình Jenkins Jobs

Tạo item mới với type là Pipeline.

Cấu hình Jobs

  • General (tuỳ chọn)
    • Description: mô tả
    • Github project: link đến github repo (không quan trọng)
  • Trigger
    • Chọn GitHub hook trigger for GITScm polling để trigger từ GitHub.
    • Poll SCM để kiểm tra bào build định kỳ.
    • Để trống nếu muốn chạy thủ công.
  • Pipeline
    • Definition:
      • Pipeline script from SCM để sử dụng jenkinsfile trong repo (recommend)
      • Pipeline script để viết trược tiếp jenkinsfile
    • SCM chọn Git
    • Repositories
      • Repository URL: URL của GitHub repo (Ex: https://github.com/ThanhDang143/Backup.UniTask.git)
      • Credentials: chọn GitHub Credentials đã tạo.
      • Branches to build: nhánh GitHub cần theo dõi
    • Script Path: Đường dẫn đến Jenkinsfile trong repo (mặc định là Jenkinsfile. Ex: src/UniTask/Assets/Plugins/UniTask/Jenkinsfile)

Chạy và kiểm tra

Tại đây ta đã có thể chạy build thủ công.

Truy cập Blue Ocean. Để theo dõi tiến trình.

Kiểm tra kết quả và debug.

Nếu thành công thì có thể chuyển sang bước tiếp theo.

Cấu hình Trigger tự động

Tiếp đến là cấu hình để Jenkins tự động chạy job khi có commit mới trên GitHub.

  • Đảm bảo Jenkins Job đã chọn GitHub hook trigger for GITScm polling khi tạo job.
  • Cấu hình webhook trên GitHub Repo
    • Truy cập GitHub Repo > Settings > Webhook > Add webhook
    • Payload URL:
      • Mặc định là URL Jenkins theo sau là /github-webhook/ (Ex: https://jenkins.thanhdv.com/github-webhook/)
      • URL Jenkins phải truy cập được từ internet.
    • Content type: chọn application/json
    • Secret là Credential cho Discord Webhook URL đã chuẩn bị
    • Which events? chọn Just the push event.
    • Đảm bảo đã tick chọn Active > Add Webhook

Sau khi add webhook github sẽ ping tới server. Kiểm tra tab Recent Deliveries để biết trạng thái ping

  • Nếu không thành công kiểm tra lại các lỗi cơ bản như sai Payload URL, sai Secret, chưa thêm secret vào Shared secrets
  • Nếu thành công có thể push một commit mới để test.

Gửi thông báo qua Discord

Tạo Discord Webhoook, trên Discord truy cập Server Settings > Integrations > Create Webhook.

Copy Webhook URL đã tạo. Truy cập Jenkins Server tạo Credential cho Discord Webhook URL.

Trong bước tiếp theo ta cần cập nhật trong Jenkinsfile (Đã có đầy đủ trong Jenkinsfile demo)

  • Tạo một biến môi trường DISCORD_WEBHOOK = "CREDENTIAL_ID_DISCORD_WEBHOOK_URL" để đảm bảo tính bảo mật không sử dụng trực tiếp Discord Webhook URL trong Jenkinsfile.
  • Chỉnh sửa bên các khối sự kiện success{ }, failure { }, aborted { } bên trong khối post với nội dung demo như hình dưới. Chỉnh sửa lại nội dung cho phù hợp.
script {    
  withCredentials([string(credentialsId: "${env.DISCORD_WEBHOOK}", variable: 'DISCORD_WEBHOOK_URL_SECRET')]) {
    discordSend(
      webhookURL: DISCORD_WEBHOOK_URL_SECRET,
      title: "ℹ️ Aborted: ${env.JOB_NAME}",
      description: "Build #${env.BUILD_NUMBER} for job `${env.JOB_NAME}` was aborted.",
      result: "ABORTED",
      link: env.BUILD_URL,
      footer: "Jenkins Build Notification"
    )
  }
}

Phụ lục

Cài đặt Credentials

Thêm Domain (Tuỳ chọn)

Jenkins Manager > Credentials > System > Add domain. Tại đây điền Name và Desc cho domain mới.

Nếu không tạo domain mới có thể sử dụng domain Global.

Thêm Credentials

Jenkins Manager > Credentials > System > Domain > Add Credentials

  • Kind
    • Username with password với Credential cho Verdaccio hoặc Credential cho Github…
    • Secret text với Credential cho Discord Webhook URL…
  • Scope: global
  • Username
  • Password: password hoặc PAT…
  • Secret: chuỗi text
  • ID: cần để sử dụng trong Jenkinsfile hoặc những nơi cần thiết…
  • Description: mô tả.

Chú ý:

  • Với Credential cho GitHub Secret sau khi tạo cần thêm vào Shared secrets
  • Jenkins Manager > System > GitHub > Advanced > Shared Secrets > Add Shared Secret tại đây điền ID của Credential.
  • Nếu không thấy GitHub kiểm tra lại GitHub Plugin

Lỗi thường gặp khi chạy Jenkins Job

Lỗi FileNotFoundException: Sai đường dẫn. Kiểm tra lại các path trong Jenkinsfile (PROJECT_PATH…)

Lỗi Cannot run program "sh": sh là lệnh của Linux. Nếu máy Agent là Window thay sh bằng bat.

Lỗi RejectedAccessException (new java.net.URI): Bị chặn bởi Script Security sandbox. Phê duyệt tại Jenkins Manager > In-process Script Approval