Một khảo sát của Jetbrains (2020 Jetbrains developer survey) chỉ ra rằng: hiện có tới 44% nhà phát triển đang sử dụng các công cụ CI/CD với Docker Containers. Họ dùng Docker Hub để lưu trữ và chia sẻ các docker images
.
Theo cách làm “cổ điển”, các developer sẽ phải lập trình, viết Dockerfile
rồi build Docker image
tại môi trường local dev một cách thủ công rồi mới có thể push docker image đó lên Docker Hub. Mỗi khi có chỉnh sửa gì ở mã nguồn, quy trình trên lại lặp lại, như vậy sẽ rất tốn thời gian và công sức.
GitHub Actions và các công cụ CI/CD ra đời để giúp chúng ta giải quyết được bài toán trên. GitHub Actions giúp bạn tự động hoá được quy trình phát triển phần mềm, nó theo hướng “event-driven”, mình có thể giải thích đơn giản thuật ngữ “event-driven” bằng ví dụ: Mỗi khi có ai đó tạo một Pull Request trên Github repo, hệ thống sẽ tự động chạy các testing scripts có thể là: check PEP8 ở code python hoặc đối với các project CNCF thì kiểm tra xem user đã sign CLA chưa?…
Bài viết này sẽ hướng dẫn chi tiết cách setup một GitHub Action CI/CD pipeline để tự động build mã nguồn mỗi khi bạn push lên Github Repo thành một Docker Image và đẩy lên Docker Hub.
Github Repo
Ở hướng dẫn này, mình sẽ tạo mới một Github Repo tại địa chỉ: https://github.com/truongnh1992/demo-github-actions.
Dockerfile sẽ được sử dụng để build file mã nguồn main.go thành một Docker Image. Image này đóng gói một ứng dụng webserver đơn giản phản hồi lại các HTTP request và trả về dòng text Hello, Github Actions!
.
Github Actions workflow
Đến đây, chúng ta sẽ đi sâu vào chi tiết việc cài đặt một Github Actions workflow.
GitHub Actions sử dụng các YAML
file để định nghĩa các thành phần của một workflow
.
-
Workflow
: Workflow là một quy trình tự động mà bạn tạo trên Github Repository. Một workflow có thể bao gồm một hoặc nhiều jobs được lên lịch và được trigger bởi event. -
Jobs
: Một job là một tập cácsteps
được thực thi trên cùng một runner. Runner ở đây không phải là vận động viên chạy bộ đâu nhé :D => “The runner is the application that runs a job from a GitHub Actions workflow”. Runner sẽ lắng nghe tất cả các jobs đang sẵn có, chạy từng job một và report các process, logs và kết quả chạy cho GitHub. Bạn có thể hiểu đơn giản là đối với GitHub-hosted runners, mỗi job trong một workflow sẽ chạy trong mộtvirtual environment
based on Ubuntu Linux, Microsoft Windows hoặc macOS. -
Steps
: Một step là một task đơn lẻ chạy các commands trong một job. Một step có thể là mộtaction
hoặc một shell command. Mỗi step trong một Job thực thi trong cùng runner, điều này cho phép các action chia sẻ dữ liệu với nhau. -
Actions
: Action là đơn vị nhỏ nhất trong một workflow. Các actions là các lệnh độc lập (standalone commands) được kết hợp thành cácsteps
để tạo nên mộtjob
.
Để tạo mới một Github Action workflow, bạn sẽ phải tạo một directory .github/workflows
trong GitHub repo. Ở ví dụ trong hướng dẫn này, mình sẽ tạo workflow file có tên là build.yml
:
name: CI to Docker Hub
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
Mình đặt tên của workflow là: CI to Docker Hub. Workflow này sẽ chạy khi bạn push code hoặc tạo Pull Request trên branch main
. Tiếp theo sẽ đến công đoạn định nghĩa các jobs. Dưới đây, job build-docker
chạy trên runner ubuntu-latest
.
jobs:
build-docker:
runs-on: ubuntu-latest
Step đầu tiên trong jobs là Checkout
code từ GitHub repository:
steps:
- name: Checkout
uses: actions/checkout@v2
Verify xem step trên đã chạy thành công chưa bằng cách push code lên branch main
. Thông tin chi tiết ở tab Actions trên GitHub repo:
Để có thể push một Docker Image lên Docker Hub, bạn cần có một account và ở bước này, chúng ta sẽ tạo một Personal Access Token để xác thực. Đăng nhập vào Docke Hub và đi đến địa chỉ https://hub.docker.com/settings/security. Click vào New Access Token.
Đặt tên cho Token:
Click vào Create rồi copy Token bên dưới, và mình sẽ sử dụng nó cho phần cài đặt bên Github Repo.
Quay trở lại với Github Repo, đi đến Settings tab và bạn cần tạo hai GitHub Secrets
:
-
DOCKER_HUB_ACCESS_TOKEN: Copy từ Personal Access Token ở bước trên
-
DOCKER_HUB_USERNAME: đây là Docker Hub username của bạn
Sau khi cấu hình việc xác thực giữa GitHub Repo và Docker Hub, chúng ta sẽ thêm vào step Login to Docker Hub:
Tiếp tục verify việc Login vào Docker Hub bằng cách push code lên branch main
:
Bước cuối cùng là build và push Docker Image lên Docker Hub, toàn bộ file workflow:
Verify kết quả tương tự các bước trên, ta thấy Docker Image đã được build và push lên Docker Hub.
Docker Image demo-github-actions
trên Docker Hub.
Tham khảo
- Introduction to GitHub Actions
- https://docs.docker.com/ci-cd/github-actions/