12/08/2018, 16:30

Tự xây dựng hệ thống CI/CD cùng Ansible, Docker và Drone

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 ...

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 treeb Github để có được Client ID và Client Secret
  • Ansible, ansible-galaxy được cài sẵn trên máy tính (local) hoặc một docker image của ansible
  • Đảm bảo máy tính của bạn có thể ssh vào server
  • Đọ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:

  1. Cài đặt Docker
  2. Cài đặt và config để Nginx hoạt động cùng Drone
  3. Cài đặt PostgreSQL để Drone lưu thông tin của từng lần build
  4. Chạy Drone & Drone CI bên trong Docker containers
  5. 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ản root thì cần thay đổi 1 chút
    drone 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
    
    Nếu các bạn sử dụng 2 server khác nhau cho 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ật nginx_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 playbook deploy.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:

  1. Fork https://github.com/go-training/drone-laravel-example về github của bạn và clone nó về máy
  2. Đăng nhập vào server drone vừa cài đặt ở trên bằng github
  3. Add kích hoạt repo drone-laravel-example ở trên trong danh sách repositories
  4. Sửa 1 vài file trong code của bạn và push code
  5. Qua server drone và xem nó hoạt động ntn

Drone example 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

0