Github action - Khởi chạy workflow thủ công bằng dispatch event

Có khi nào bạn không tự tin vào script CI? Pass hết CI có đảm bảo auto release thành công như mong đợi? Đến đoạn này DevOps sẽ nghĩ đến phương án "bán tự động", nghĩa là CI sẽ chạy auto, nhưng CD thì cần được thực hiện thủ công, sau khi xem xét hết các khía cạnh của sản phẩm.

Github action - Khởi chạy workflow thủ công bằng dispatch event

Vấn đề của auto deploy trong Deployment Pipeline

Khi viết script CI-CD, anh em thường đặt các điều kiện CI (Continuous Integration) pass toàn bộ, sau đó sẽ thực hiện CD (Continuous Delivery) bằng cách kích hoạt một (hoặc nhiều) Deployment Pipeline. Với Github Action thì các hành động trong CI, CD gọi là các workflow.

Nhưng có khi nào bạn không tự tin vào script CI? Pass hết CI có đảm bảo auto release thành công như mong đợi?

Đến đoạn này DevOps sẽ nghĩ đến phương án "bán tự động", nghĩa là CI sẽ chạy auto, nhưng CD thì cần được thực hiện thủ công, sau khi xem xét hết các khía cạnh của sản phẩm.

Vậy là workflow_dispatch ra đời, phục vụ anh em DevOps thực hiện các workflow bán tự động trên github action.

Cách triển khai

Bây giờ bạn có thể tạo workflow kích hoạt theo cách thủ công với sự kiện workflow_dispatch.

Giống như các workflow thông thường mà chúng ta đã được giới thiệu trong bài viết Tự động kiểm tra source code, test 1 dự án Laravel với Github Actions, script deploy thủ công sẽ đặt vào folder .github/workflows/ của dự án.


Sau đó, bạn sẽ thấy nút Run workflow trên tab Action, cho phép bạn dễ dàng kích hoạt quá trình chạy.
Bạn có thể chọn branch nào mà workflow sẽ chạy trên đó. Ngoài ra, bạn có thể tùy chọn chỉ định đầu vào, Gitbub sẽ hiển thị dưới dạng các input trong giao diện người dùng.

Code ví dụ: file `.github/workflows/deploy.yaml`

on: 
  workflow_dispatch:
    inputs:
      logLevel:
        description: 'Log level'     
        required: true
        default: 'warning'
      tags:
        description: 'Test scenario tags'  

Workflow deploy.yaml sẽ được kích hoạt thủ công với các inputs đầu vào trên giao diện. Để sử dụng các input, chúng ta có thể sử dụng:

jobs:
  printInputs:
    runs-on: ubuntu-latest
    steps:
    - run: |
        echo "Log level: ${{ github.event.inputs.logLevel }}"
        echo "Tags: ${{ github.event.inputs.tags }}" 

Sau khi push code lên, check ở tab Action, chúng ta sẽ thấy Nút Run workflow được hiển thị:

Kết luận

DevOps là kết hợp của Development và Operations, việc vận hành (Operations) thì có thể sử dụng linh hoạt tuỳ tình hình thực tế mà sử dụng các kỹ thuật khác nhau. Phương pháp ở trên là một giải pháp tình thế, cho phép DevOps có thể xem xét kỹ lưỡng các vấn đề trước khi hành động deploy hệ thống quan trọng.

Ngoài ra, phương pháp này cũng là một cách để giảm chi phí Github action. Thay vì deploy tự động mỗi lần merge vào nhánh dev, chúng ta sẽ merge thoải mái, nhưng không deploy tự động, DevOps sẽ chủ động deploy lên staging bằng cách kích hoạt Deployment Pipeline khi cần thiết.