[CI/CD] Hướng dẫn triển khai với Apache, Jenkins

Trong bài viết này, chúng ta sẽ xây dựng một hệ thống CI/CD đơn giản sử dụng Jenkins, GitHub, Ansible và Apache Web Server. Mục tiêu là tự động triển khai một website HTML tĩnh lên Web Server mỗi khi có thay đổi mã nguồn được đẩy lên GitHub.

Để thực hiện bài lab này, bạn cần chuẩn bị 3 máy chủ:

  • Jenkins Server – dùng để cài đặt và cấu hình Jenkins: >> Hướng dẫn cài đặt Jenkins
  • Web Server – nơi triển khai và hiển thị website HTML.
  • Ansible Server

Quy trình tự động hoá CI/CD:

  1. Developer đẩy mã nguồn lên GitHub.
  2. Jenkins tự động lấy mã nguồn từ GitHub về.
  3. Jenkins gửi mã nguồn đến Ansible Server thông qua SSH.
  4. Ansible tiếp tục triển khai mã nguồn lên Web Server sử dụng Playbook.

Hệ thống CI/CD đơn giản sử dụng Jenkins, GitHub, Ansible và Apache Web Server

1. Cài đặt Apache Web Server

Bước 1: Cài đặt Apache

Mở terminal trên server và chạy lệnh:

sudo apt-get update
sudo apt-get install apache2 -y

Bước 2: Kiểm tra và bật dịch vụ Apache

sudo systemctl start apache2
sudo systemctl enable apache2
sudo systemctl status apache2

Kiểm tra và bật dịch vụ Apache

Nếu firewalld đang bật và chặn port 80 (port mặc định của web), thì bạn có thể tắt firewall bằng:

sudo ufw status
sudo ufw disable

Bước 3: Kiểm tra hoạt động

Mở trình duyệt, nhập IP của server (ví dụ: http://192.168.1.227). Nếu thấy trang mặc định của Apache hoặc không báo lỗi là bạn đã xong phần này.

Trang mặc định của Apache

2. Cài đặt Ansible Server

sudo apt update

sudo apt install software-properties-common

sudo add-apt-repository –yes –update ppa:ansible/ansible

sudo apt install ansible

3. Thiết lập kết nối từ Jenkins đến Ansible

Hiện tại, chúng ta chưa có kết nối giữa Jenkins và máy chủ Ansible, nên cần thiết lập trước.

Bước 1: Cài plugin Publish Over SSH

  • Vào Jenkins → Manage JenkinsPlugin Manager
  • Tìm và cài plugin Publish Over SSH

Bước 2: Cấu hình SSH Server

  • Jenkins → Manage JenkinsConfigure System
  • Tìm mục Publish over SSH
  • Nhấn Add và cấu hình như sau:
    Trường Giá trị
    Name / ID ansible-server
    Hostname IP máy Ansible
    Username azureadmin (không dùng root)
    Remote Directory /tmp
    Password Mật khẩu của user
  • Nhấn Test Configuration → nếu thành công → Save

CI/CD GitHub đến các máy chủ thông qua Jenkins và Ansible

CI/CD GitHub đến các máy chủ thông qua Jenkins và Ansible

CI/CD GitHub đến các máy chủ thông qua Jenkins và Ansible

4. Tạo Git Repository và đẩy code lên GitHub

Bước 1: Tạo thư mục dự án

mkdir VNTravel
cd VNTravel

Bước 2: Khởi tạo Git repo

git init

Bước 3: Sử dụng mã nguồn

Source code: https://github.com/ttnguyenblog/vntravel

Bước 4: Commit  code

git add .
git commit -m "My first commit"

Bước 5: Tạo repo trên GitHub

  • Truy cập GitHub, chọn New repository
  • Đặt tên là VNTravel
  • Chọn Public và nhấn Create repository

Sau đó bạn sẽ được cung cấp dòng lệnh để liên kết repo:

git remote add origin https://github.com/ttnguyenblog/vntravel.git
git push origin master

5. Cấu hình Ansible gửi file sang Web Server

Bước 1: Tạo inventory file

Đầu tiên, tạo file server.yaml chứa thông tin IP của webserver:

sudo vi server.yaml

Nội dung:

[webserver]
10.1.0.9

Đổi tên file này thành myinventory để sử dụng làm inventory cho Ansible:

mv server.yaml myinventory

Bước 2: Thiết lập SSH không mật khẩu

Tại máy Ansible, tạo SSH key và gửi key public sang máy webserver để thiết lập kết nối không cần mật khẩu:

ssh-keygen                # Nhấn Enter liên tục để tạo key mặc định
ssh-copy-id 10.1.0.9      # Gửi key sang webserver

Kiểm tra kết nối từ Ansible tới webserver:

ansible -i myinventory webserver -m ping -o

Bước 3: Tạo file sendfile.yaml

- hosts: webserver
  become: yes
  gather_facts: false

  tasks:
    - name: Send files from Ansible to webserver
      copy:
        src: /tmp/             # Đường dẫn nguồn trên máy Ansible
        dest: /var/www/html/   # Đích đến trên máy webserver
        remote_src: no

Kiểm tra vị trí thực thi ansible-playbook, dùng lệnh:

which ansible-playbook

Output:

/usr/bin/ansible-playbook -i /home/azureadmin/myinventory /home/azureadmin/sendfile.yaml

6. Cấu hình Jenkins tự động triển khai

Bước 1: Truy cập Jenkins

Mở trình duyệt và truy cập vào địa chỉ IP của Jenkins theo port 8080:

http://<Jenkins_IP>:8080

Ví dụ:

http://192.168.1.227:8080

Đăng nhập bằng tài khoản bạn đã tạo lúc cài Jenkins (ví dụ: admin / admin@123).

Bước 2: Tạo Freestyle Project

  1. Quay lại Jenkins Dashboard.
  2. Chọn “New Item”
  3. Nhập tên: fetch-html-from-github
  4. Chọn Freestyle Project, rồi nhấn OK

Tự động lấy code từ GitHub bằng Jenkins

Tự động lấy code từ GitHub bằng Jenkins

Bước 3: Thêm GitHub Repo vào Jenkins

  • Trong tab cấu hình, tìm mục Source Code Management
  • Chọn Git
  • Dán URL repo GitHub bạn đã tạo ở bài trước (ví dụ):
https://github.com/ttnguyenblog/vntravel.git

Vì repo là Public, bạn không cần điền Username/Password.

Tự động lấy code từ GitHub bằng Jenkins

Bước 4: Thiết lập chuyển mã nguồn qua SSH:

  1. Trong phần Build, thêm một bước là Send files or execute commands over SSH
  2. Chọn server là ansible-server đã cấu hình ở bước trước
  3. Source file: **

Sau đó, nhấn Save để lưu cấu hình.

CI/CD GitHub đến các máy chủ thông qua Jenkins và Ansible

Bước 5: Lưu Job và Build

  • Nhấn Save
  • Sau đó nhấn Build Now

Nếu thấy chấm xanh lá → thành công!

  • Chấm đỏ là lỗi.

Tự động lấy code từ GitHub bằng Jenkins

Bước 6: Kiểm tra kết quả

  • Nhấn vào Build History → Console Output
  • Nếu dòng cuối là Finished: SUCCESS, bạn đã fetch code thành công từ GitHub về Jenkins!

Tự động lấy code từ GitHub bằng Jenkins

Với quy trình trên, bạn đã xây dựng thành công một hệ thống tự động hóa CI/CD cơ bản sử dụng Jenkins, GitHub, Ansible và Apache. Mỗi khi có cập nhật mới trên GitHub, Jenkins sẽ tự động lấy mã nguồn, gửi đến Ansible, và Ansible sẽ triển khai website HTML lên Web Server.

Xem thêm:

[CI/CD] Hướng dẫn triển khai với Apache, Docker, Jenkins, Ansible

[CI/CD] Triển khai ứng dụng Java với Jenkins, Tomcat, Maven

[CI/CD] Triển khai với Jenkins Pipeline, Agent, Docker

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em