Git ci/cd
Ai từng code, nhất là ứng dụng web thì phải biết là code của mình cần được triển khai lên server, dù là server test hay server production.
Nếu làm thủ công thì thường dễ chán và mất thì giờ. Đôi khi cũng có vài sai sót như thiếu file, xóa nhầm file, thiếu thư mục, v.v...
Với dự án có sử dụng framework như django, thì công việc cũng tương đối đơn giản như sau:
- cập nhật code mới(git pull)
- install thư viện mới niếu có(pip install -r requirements.txt)
- Dịch chuyển(cập nhật) cơ sở dữ liệu(python manage.py migrate)
- Cập nhật file tỉnh(python manage.py collectstatic --noiput)
- Khởi động lại dịch vụ web như là gunicorn(systemctl restart webgunicorn)
- Khởi động lại dịch vụ worker(nếu có)
Với từng đó bướt, thì làm thủ công đương nhiên sẽ nhàm và dễ quên. Có thể gôm chúng vào 1 file bash như scripts/update.sh và gọi 1 lần như sau:
#!/bin/bash
cd /opt/robonaia/
echo "starting running update..."
git reset --hard origin/main
git checkout main
git pull origin main
echo "rebuild docker"
cd /opt/robonaia/app/
sudo /usr/local/bin/docker-compose build web
echo "restart docker-compose"
sudo /usr/local/bin/docker-compose down && sudo /usr/local/bin/docker-compose up -d
echo "all done."
Được như dậy cũng tiện rồi. Nhưng mỗi lần chạy được script này phài ssh vào server và đôi khi không có sẵn công cụ tại chỗ như không có máy tính hay môi trường mạng không được an ninh. Với lại pull requests thông thường dev hay push vào lúc cuối phiên làm việc và thường những lúc ấy có thể mình đã ra khỏi văn phòng.
Với ci/cd như của gitlab, thì với 1 file đơn giản thêm vào trong project và tạo thêm key trong account trên gitlab, thi code được merge để deploy thì minh chỉ cần bấm nút merge trên giao diện web, và code sẽ được triển khai tự động
before_script:
- apt-get update -qq
- apt-get install -qq git
# Setup SSH deploy keys. Is it safe?
- 'which ssh-agent || ( apt-get install -qq openssh-client )'
- mkdir -p ~/.ssh
- chmod 600 ~/.ssh
- echo -e "$SSH_PRIVATE_KEY" > ~/.ssh/ec2.pem
- chmod 600 ~/.ssh/ec2.pem
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
deploy_production:
stage: deploy
environment:
name: production
url: 54.156.98.164
script:
- ssh -i ~/.ssh/ec2.pem ec2-user@54.156.98.164 "/usr/bin/bash /opt/robonaia/scripts/run_update.sh && exit"
only:
- main
Và như thế, nó tiết kiệm cho mình khối thời gian để làm task kế tiếp hay làm việc khác. Sau đó 5, 10 phút, chỉ cần check lại xem nó có deploy xong chưa và kiểm tra thêm trên server một vài chỗ mới.
Đây chỉ mới đề cập tới khía cạnh triển khai tự động thôi. Trong thực tế thì nó có thể được tận dụng để làm thêm một số tác vụ khác cần thiết cho công việc quản lí dự án được tốt hơn như:
- Kiểm tra chất lượng code
- Chạy một số test cases cơ bản
- Chạy một số test cases về bảo mật, etc...