bunhere.com
Published on

[Basic] Tự động hóa việc triển khai với Github Actions

Mình đặt kịch bản là mình đang có 1 repo chính, sau đó mình fork cái repo chính đó ra thành 1 repo mới và mình muốn tự động cập nhật repo của mình nếu thằng repo chính được cập nhật. Để tìm hiểu cách giải quyết vấn đề trên bắt đầu với nội dung bên dưới nào!

What's Github Action?

GitHub Actions là một nền tảng CI/CD tích hợp sẵn trên GitHub, cho phép tự động hóa toàn bộ quy trình phát triển phần mềm.

Mặc dù nó không quá mới mẻ với nhiều người, nhưng trong bài viết hôm này mình chia sẻ cách triển khai cơ bản với Github Actions cho những ai chưa biết nó là gì!

Các thành phần chính của GitHub Actions

  • Workflow: Workflow là một chuỗi các tiến trình tự động mà bạn có thể thiết lập trong repository của mình. Workflows được tạo từ một hoặc nhiều job và có thể được lên lịch hoặc kích hoạt bằng các sự kiện như push, pull request, release, hoặc các sự kiện tùy chỉnh khác.

  • Jobs: Mỗi workflow chứa ít nhất một job. Job là một tập hợp các bước thực hiện một công việc cụ thể, ví dụ như kiểm tra mã nguồn, xây dựng ứng dụng, hoặc triển khai lên môi trường production.

  • Steps: Mỗi job bao gồm một hoặc nhiều bước (steps). Mỗi bước thực hiện một tác vụ cụ thể, chẳng hạn như cài đặt môi trường, tải mã nguồn, chạy các lệnh, hoặc gửi thông báo.

  • Actions: Là các tập lệnh hoặc phần mềm được chia sẻ, có thể tái sử dụng trong các bước của job. GitHub cung cấp nhiều actions có sẵn, và bạn cũng có thể tạo các actions của riêng mình hoặc sử dụng actions từ cộng đồng.

  • Runners: Là các máy ảo hoặc môi trường mà các jobs được thực thi. GitHub cung cấp runners được lưu trữ miễn phí, nhưng bạn cũng có thể sử dụng các runners tự lưu trữ (self-hosted runners) để có nhiều quyền kiểm soát hơn đối với môi trường thực thi.

  • Artifacts: Là các tệp được tạo ra bởi các workflows và có thể được lưu trữ hoặc chia sẻ giữa các jobs.

  • Secrets: Là các thông tin nhạy cảm (như API keys, tokens) được mã hóa và lưu trữ an toàn. Secrets có thể được sử dụng trong các workflows mà không làm lộ thông tin nhạy cảm này.

graph TD subgraph GitHub Actions A[Events] -->|Kích hoạt| B[Workflows] B -->|Gồm các| C[Jobs] C -->|Gồm các| D[Steps] D -->|Sử dụng| E[Actions] F[Runners] -->|Thực thi| C G[Artifacts] -->|Tạo bởi| C H[Secrets] -->|Sử dụng trong| B end

subgraph workflow.yaml B end

Main GitHub Actions

Demo

Quay lại kịch bản mình dề cập trước đó.

Mình đang có 1 repo chính, sau đó mình fork cái repo chính đó ra thành 1 repo mới và mình muốn tự động cập nhật repo của mình nếu thằng repo chính được cập nhật.

  1. Tạo folder .github/workflows sau đó tạo file update-fork.yml
  2. Cấu hình file update-fork.yml
  • Tạo lịch chạy workflow

Cài đặt schedule để gọi tự động thực thi workflow

on:
  schedule:
    - cron: '0 0 * * *' # Runs daily at midnight

workflow_dispatch cho phép chạy thủ công workflow từ GitHub Actions UI.

  • Merge các cập nhật từ repo gốc vào repo fork's master branch

B1. Dùng actions/checkout@v2 để checkout sang repo hiện tại

B2. Cài đặt thông tin git mặc định cho workflow này.

B3. Thêm upstream repo > nạp các cập nhật > merge vào master.

B4. Push các thay đổi vào lại fork's master branch của bạn với GitHub token

  • Final file:
  • Repository Secrets: Ensure that the GITHUB_TOKEN is properly set up in your repository. This token is usually available by default, but you can verify it under Settings > Secrets and variables > Actions.
name: Update Fork

on:
  schedule:
    - cron: '0 0 * * *' # Runs daily at midnight
  workflow_dispatch: # Allows manual trigger from GitHub Actions UI

jobs:
  update-fork:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout the repository
        uses: actions/checkout@v2
        with:
          repository: wtmhcmc/sudocode.git
          token: ${{ secrets.GH_TOKEN }}
          ref: master
          fetch-depth: 0 # Fetch all history for all branches and tags

      - name: Set up Git
        run: |
          git config --global user.name 'github-actions[bot]'
          git config --global user.email 'github-actions[bot]@users.noreply.github.com'

      - name: Add upstream repository
        run: |
          git remote add upstream https://github.com/Women-Techmakers-HCMC/sudocode.git
          git fetch upstream
          git checkout master
          git merge upstream/master

      - name: Push changes
        env:
          GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
        run: |
          git push origin master

This GitHub Actions workflow file is used to automatically update a forked repository from its upstream repository. Here’s a breakdown of each section and its components:

Name

name: Update Fork: The name of the workflow, which will appear in the GitHub Actions UI.

Triggers

on: Specifies the events that trigger the workflow. schedule: Runs the workflow based on a cron schedule. cron: '0 0 * * *': Runs the workflow daily at midnight UTC. workflow_dispatch: Allows the workflow to be manually triggered from the GitHub Actions UI.

Jobs

jobs: Defines the jobs that run as part of the workflow. update-fork: The name of the job. runs-on: ubuntu-latest: Specifies the environment to run the job in (an Ubuntu virtual machine).

Steps

steps: Lists the individual steps that make up the job.

  • Checkout the repository
- name: Checkout the repository
  uses: actions/checkout@v2
  with:
    repository: wtmhcmc/sudocode.git
    token: ${{ secrets.GH_TOKEN }}
    ref: master
    fetch-depth: 0

uses: actions/checkout@v2: Uses the checkout action to clone the specified repository. repository: wtmhcmc/sudocode.git: Specifies the repository to clone. token: ${{ secrets.GH_TOKEN }}: Uses a secret token for authentication. ref: master: Checks out the master branch. fetch-depth: 0: Fetches all history for all branches and tags.

  • Set up Git
- name: Set up Git
  run: |
    git config --global user.name 'github-actions[bot]'
    git config --global user.email 'github-actions[bot]@users.noreply.github.com'

Configures Git with a user name and email for committing changes.

  • Add upstream repository
- name: Add upstream repository
  run: |
    git remote add upstream https://github.com/Women-Techmakers-HCMC/sudocode.git
    git fetch upstream
    git checkout master
    git merge upstream/master

Adds the upstream repository as a remote named upstream. Fetches the latest changes from the upstream repository. Checks out the master branch. Merges the changes from the upstream/master branch into the local master branch.

  • Push changes
- name: Push changes
  env:
    GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
  run: |
    git push origin master
Pushes the updated master branch to the forked repository on GitHub.

This workflow automates the process of keeping a forked repository up to date with its upstream repository by:

Checking out the forked repository. Setting up Git with the necessary configurations. Fetching and merging changes from the upstream repository. Pushing the updated changes back to the forked repository.

Logs - kiểm tra chi tiết triển khai workflow

Kiểm tra nhật ký chi tiết của quá trình chạy workflow để xác định bất kỳ lỗi hoặc sự cố có thể gặp, bằng các truy cập tab Actions trong repo của bạn và kiểm tra chi tiết từng workflow tương ứng.

  • Github Action tab:

Github Action

  • Workflow log details:

Github Action

  • Error logs:

Github Action

End.

Với những định nghĩa ngắn gọn và một ví dụ nhỏ ở trên, hy vọng giúp bạn cơ bản biết được Github Action là gì.

Bạn có thể tìm hiểu sâu hơn về Github Action tại đây