Tự xây dựng hệ thống CI/CD cùng Ansible, Docker và Drone
This post hasn't been updated for 3 years
1. Giới thiệu
Trong các bạn, có khá là nhiều người đã dùng qua các hệ thống CI/CD như Jenkins, GitLab CI, Buildbot, Drone, Concourse ... Bài viết này của mình sẽ hướng dẫn các bạn tự tạo một hệ thống CI/CD dựa trên Ansible, Docker và Drone. Trên Viblo đã có sẵn các bài viết về Ansible, Docker cũng như Drone, các bạn có thể tham khảo trước nhé: Ansible, Drone, Docker
Ansible
Ansible is a radically simple IT automation platform that makes your applications and systems easier to deploy. Avoid writing scripts or custom code to deploy and update your applications— automate in a language that approaches plain English, using SSH, with no agents to install on remote systems.
Hiểu một cách đơn giản: Ansible là một nền tảng tự động hóa CNTT đơn giản đơn giản giúp triển khai các ứng dụng và hệ thống của bạn dễ dàng hơn. Với Ansible, các bạn có thể tự động hóa
việc cài đặt, cập nhật cùng lúc nhiều hệ thống, server hoặc triển khai 1 ứng dụng nào đó từ xa (remote).
Docker
Simplify and advance the management of Kubernetes for enterprise IT. Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.
Drone
Drone is a Continuous Delivery platform built on Docker, written in Go Drone is a Continuous Delivery system built on container technology. Drone uses a simple YAML configuration file, a superset of docker-compose, to define and execute Pipelines inside Docker containers.
2. Cài đặt
Trước khi bắt đầu các bạn cần:
- Tạo 1
Oauth Applications
trên Github để có đượcClient ID
vàClient Secret
Ansible
,ansible-galaxy
được cài sẵn trên máy tính (local) hoặc mộtdocker image
của ansible- Đảm bảo máy tính của bạn có thể
ssh
vàoserver
- Đọc qua các bài viết về
ansible
,drone
để hiểu được về ansible, ansible-galaxy và ansible-playbook, ...
3. Bắt đầu
Note: Bài viết này là bản Việt hóa và đơn giản hóa của bài viết maqpie's blog + github. Các bạn có thể vào 2 link trên để tham khảo bài viết và code gốc nhé.
Trong bài viết này mình sẽ thực hiện:
- Cài đặt Docker
- Cài đặt và config để Nginx hoạt động cùng Drone
- Cài đặt PostgreSQL để Drone lưu thông tin của từng lần build
- Chạy Drone & Drone CI bên trong Docker containers
- Optional configuration of SSL certificate
Cấu trúc thư mục
Note: Mình lược bỏ các thành phần để setup trên local trong cây thư mục ở dưới nhé, trên github có bản đầy đủ
Các bạn fork + pull hoặc download code ở link github trên về máy nhé. Sau đó chúng ta được 1 thư mục chứa:
.
├── bin
│ ├── deploy-drone.sh <= Thực hiện chạy cài đặt drone lên server
│ ├── install-ansible-dependencies.sh <= Cài đặt các thành phần cần thiết trên local (ansible-galaxy)
│ ├── setup-nginx.sh <= Cài đặt nginx lên server
│ ├── setup-server.sh <= Cài đặt docker, docker-compose và các thành phần cần thiết lên server
├── roles <= Role cơ bản cho nginx
│ └── nginx
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ │ └── nginx.conf.j2
│ └── vars
│ └── main.yml
├── templates
│ └── drone-nginx-config.j2 <= Template cho nginx's config
├── vars
│ ├── credentials-template.yml
│ └── main.yml
├── ansible.cfg <= Config của Ansible
├── deploy.yml <= Playbook của drone
├── hosts <= Config host của Ansible
├── README.md
├── requirements.yml <= Các role cần thiết cần download cho ansible-galaxy
├── setup-nginx.yml <= Playbook của nginx
└── setup-server.yml <= Playbook của setup server
Cấu hình
Sau khi pull code về máy, chúng ta cần:
- Update lại IP của server trong file
hosts
, nếu các bạn không dùng tài khoảnroot
thì cần thay đổi 1 chút
Nếu các bạn sử dụng 2 server khác nhau chodrone ansible_ssh_host=IP_SERVER ansible_user=USER_NAME ansible_sudo_pass=PASSWORD nginx ansible_ssh_host=IP_SERVER ansible_user=USER_NAME ansible_sudo_pass=PASSWORD
drone
vànginx
thìconfig
ip và các thông tin đăng nhập server. - Update lại file
vars/main.yml
, các bạn cần cập nhậtnginx_drone_server_name
(là IP hoặc domain server của bạn) vàdrone_admins
(tham khảo) - Tạo file
vars/credentials.yml
, cập nhật lại các thông tin bên trong file. - Cập nhật
host
của drone trong playbookdeploy.yml
Run
Config như vậy cơ bản đã xong, bây giờ chúng ta bắt đầu cài đặt:
# Cài đặt các thành phần cho ansible-galaxy
ansible-galaxy install -r requirements.yml
# Setup server
./bin/setup-server.sh
# or
ansible-playbook ./setup-server.yml -i ./hosts "$@"
# Setup drone in server
./bin/deploy-drone.sh
# or
ansible-playbook ./deploy.yml -i hosts "$@"
# Setup nginx
./bin/setup-nginx.sh
# or
ansible-playbook ./setup-nginx.yml -i ./hosts "$@"
Vậy là chúng ta đã có một server drone của riêng chúng ta, khá là đơn giản, chỉ config 1 chút và chạy 1 vài lệnh trên local
là xong.
Chúng ta không cần phải ssh
trực tiếp vào server và cài đặt từng thành phần mà chúng ta cần, ansible dựa trên những playbook
mà chúng ta định ra và nó thực hiện những việc chúng ta muốn.
Setup in local
Nếu bạn không có server thì bạn vẫn có thể sử dụng nó trên local.
Trong link github ở trên, bạn có thể tìm thấy các config và file start-local.sh
, các bạn chỉ cần làm theo hướng dẫn là OK.
Ngoài ra, để public server trên local của bạn, bạn cần tới ngrok.
Sau khi cài đặt xong, các bạn cập nhật lại OAuth Application
mà đã tạo ở trên theo link của ngrok
tạo ra là được.
Example
Để test xem server
của chúng ta đã chạy ổn hay chưa, chúng ta có thể test 1 cách đơn giản:
- Fork https://github.com/go-training/drone-laravel-example về
github
của bạn vàclone
nó về máy - Đăng nhập vào server
drone
vừa cài đặt ở trên bằnggithub
- Add kích hoạt repo
drone-laravel-example
ở trên trong danh sáchrepositories
- Sửa 1 vài file trong code của bạn và
push
code - Qua server drone và xem nó hoạt động ntn
Như các bạn thấy, ứng với mỗi task
, drone sẽ chạy một 1 task
riêng biệt và chúng ta có thể dễ dàng thấy task
nào false
hay passed
All Rights Reserved