Continuous Integration (CI) | Laravel app | Jenkins/GitHub | linux Chuyên mục Devops 2023-05-14 1.2k Lượt xem 101 Lượt thích 0 Bình luận
Hello xin chào tất cả các bạn hôm nay mình sẽ hướng dẫn các bạn làm thế nào để để build CI một dự án laravel php liên kết với github sử dụng jenkins nhé !
Như các bạn đã biết với cách thủ công khi không sử dụng jenkins, khi chúng ta code xong 1 chức năng thì cần đẩy lên github sau đó thì phải ssh vào server để thực thi deploy code mới nhất update cho web đúng không nào ? Việc làm này không sai cơ mà nó sẽ làm mất thời gian của chúng ta , tại sao chúng ta không triển khái vấn để này một cách tự động và tối ưu hoá hơn, jenkins giúp chúng ta thực hiện vấn đề này ,
Trước khi bắt đầu các bạn cần chuẩn bị cho mình những thứ sau:
- Một server cho jenkins
- Một server cho webserver
Ok hãy bắt đầu thôi nào !
Bước 1: Triển khai webserver
Với bài hướng dẫn này mình sẽ tạo ra 1 project laravel để thực hiện demo, các bạn nếu chưa biết cách cài đặt laravel trên môi trường linux thì hãy xem bài hướng dẫn này nhé, phải làm đúng và đẩy đủ các bước trong này này nhé:
sau khi cài đặt xong các bạn hãy sang bước tiếp theo nhé !
Bước 2: Create a ssh-key cho webserver
Việc tiếp theo của mình là tạo 1 ssh key để server jenkins sử dụng user (www-user) để deploy code - các bạn cần làm bước 1 để có user này nha.
Note : Nếu webserver của bạn có nhiều dự án trên đó thì không nên cung cấp quyền root nhé , bởi như thế nó sẽ không bảo mật cho các dự án khác nữa, chính vì thế mình nên tạo ra 1 user www-user để chuyên phục vụ cho deploy code của 1 dự án nhất định.
Mình sẽ chia thành 2 setup để user server-jenkins có thể ssh sang user webserver được.
webserver
Login vào tài khoản root - nếu bạn đang là root rồi thì bỏ qua bước này
sudo su -
Sau đó thì switch sang user www-user
su - www-user
Sau đó thì dùng lệnh sau để genarate ra ssh-key cho user này
ssh-keygen -t rsa
Sau khi chạy lệnh này thì 1 list cmd sẽ hiện ra các bạn chỉ việc ấn enter , không nhập gì cả nhé
Enter file in which to save the key (/home/www-user/.ssh/id_rsa):
Created directory '/home/www-user/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/www-user/.ssh/id_rsa.
Your public key has been saved in /home/www-user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:4Lxy0lnLPsC1g5fCj+unPrn1b7KY3XVEEYLCECGmUr4 www-user@ip-172-31-27-42.ap-southeast-1.compute.internal
The key's randomart image is:
+---[RSA 2048]----+
| . o += .. o.|
| o o . o . . .|
| . o . . .|
| . .o .. . |
| E oooSo .|
| .*==. . |
| o =B+. . .|
| ++o+=.... . |
| o**+.+=o |
+----[SHA256]-----+
Sau khi hoàn thành bước này thì các bạn thấy public key của chúng ta đã được lưu ở thư mục /home/www-user/.ssh/
cd /home/www-user/.ssh/
Sau khi vào thư mục trên bạn sẽ thấy 2 file 1 là private key (id_rsa) và public key (id_rsa.pub)
Tiếp theo là các bạn đổi tên public key thành Authorized_keys bằng lệnh sau:
mv id_rsa.pub authozized_keys
Sau đó thì change permission cho file này .
chmod 700 /home/www-user/.ssh
chmod 600 authozized_keys
Vậy là xong cho webserver rồi , tiếp theo mình sẽ sang server jenkins nhé .
Ở server jenkins này chúng ta sẽ phải lấy private key từ bên webserver đẩy về server jenkins và sau đó thì chúng ta remote thử , trước hết các bạn về thư mục gôc trước nhé ,
sudo su -
cd /home
Ở đây các bạn có thể tạo 1 thư mục mà các bạn muốn thực thi, với mình thì mình sẽ đặt tên là ssh-webserver chẳng hạn:
mkdir ssh-webserver
Sau khi xong bước này các bạn cần quay lại webserver và login in vào www-user, sau đó thì cd vào thư mục home/www-user/.ssh/ copy text đã được mã hoá trong private key (id_rsa)
vi id_rsa
sau đó thì copy đoạn mã hoá sau
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAuHBaw8MXob+XPcD6Iqmg30GlgyO5VmSXwcIIbz1VR9No/HKD
4ZCKM4yRL5Pkqxd1ZbRZ/V0xAtpUkLmokhm1xdlZ4Qn+a/G7CNYALLDp5zectjkL
idNZpmnrrgIPTomUQqu80tPSNPvvYcEn26jE1epfGam36fOZ6zkR4pj/XflnT5qD
yExJ+0wv3+wnTvVulNq/38c1Z2f44DUIN4XetWBIzloBsTXwvo8NBdVyhLnfv+C1
Z4Jk3qWspo0JmGZM/uvO8HZK78fEtftg45eZNznflVwzd6zm3d4DsWpd1pT4ezx/
dfZQ3F9DBeExfYGJPDnncutgwZ9V1zNq3tS8uQIDAQABAoIBAG1z36lE4YVPmYVA
PDDN0XYsEvjb/mTSlWyapT6+exmA0FDf9HurtxgYVyCQ96bA6R5OBQligG9c+cpZ
IzxwnXqoHbp6n82XSpNXzAq5glWAnzNUbxB/qDglq4M8HbFR2/YkzI2gvqJK0CiG
5Axq/0SjLYShP09LDRCWcZKzkPhGw5k7ZQyqdXVM3dZ2yPNqeAJ3ULBHcJm63OSb
IMWmROkiOXrSvMp5q3I6b+F3DF4OMP0vizeGD0JQyhwNaOoLV8Q4kjLJJ66xI/O7
iX++I72kweqmhsc9+QzHshegD33j5XdaWPZkBHOKFxCgFSIgAx4FKZeF8RvO+Zpn
ca0XmTECgYEA3rVTzn9CyJf3oFtOCJyvMCRvJr0PmUkgx0SAdD7RmDhaJbeu1zSH
4HRG9CmYwHpfK3vdy8Eovu6Mzr4hyjQxXKr+vF16KDZhR74KnWQ1erYxJSVdHsOl
NoWbKtdjn2+Z9BUUWBb5GSKWocuD//01Lm93CASzATfd2bVb9QgiLnMCgYEA1AKF
RyY7phe5OSmKWbZVOqQ9qLmpkg2ChdbXRV+URLOweHe3kdJW3+XFLICrttM67lNv
1Z6MXdHD87P5Xe/h1N6FeiGxr7f/3Ynp4jPLTuYVL1f0bzY5PRwKgn73IuNxeh9V
Cw/qbRkhvMbjpUhyPAHrFIhDUnDfwRse6uUyUSMCgYEAnN/1jLuv+0SwtVAbg417
CdpgQVVjq4ILiNID+d5WHXd0aKUej5D9NWoyoMK8SrjoWOUDswb5AKVgojDj9F8X
dkMs9NqTtce4dqSzLXLtCOdVbukG0yjVM7ahOmhGUIR4WaqPjg2AoefvW0DUVnmy
AGeb3RYSUYVczIInqE52ZWkCgYB3lkBlZLyKsKELDFJ8zit/G3uoO6nZt4MjSY8+
E27H3e+x1B2YxGO6gZnZw26Yfsej/S58+aTFmvgD9EW55gClmSsDPBRFQO2zogJq
VLrec0wJ23wGaziYLsQC3ek7Jb4xm5DV35FlHqL4H9vytE2zaYWXnFEVJJQiEdE7
wDLErwKBgGCDB/ah6Pu0JnfuncZuwY+DNgB3v1Gidtr8L9xSLi/od4cJXmwjm1Qb
gIsyKYUNs88qelHIutmyJII76gzDaAmrgTxQXx3sfHyE261k5HlIFgr3iotslAQz
/jIgpJJDZodqQpC6rxOhfhyQvk4C8IKPmMaH2Ke7XH4h22tiI/qH
-----END RSA PRIVATE KEY-----
Sau khi copy xong bạn quay lại server jenkin và vào thư mục ssh-webserver tạo 1 mới 1 file với đuôi là .pem,
vi /ssh-webserver/access-key.pem
ví dụ mình tạo bên trên là access-key.pem rồi paste đoạn mã đã copy vào nhé , sau đó chỉnh lại permission 1 chút nữa là Ok
chmod 400 access-key.pem
Ok sau bước này các bạn cần login vào user jenkins để thử ssh tới www-user xem được không nhé (user jenkins ở đâu vậy ??) sau khi cài đặt jenkins trên server thì tự động 1 user jenkins đã được tự động sinh ra rồi nhé nên bạn không cần phải tạo mới nó nữa nhé
Để switch sang được user jenkins các bạn có thể chạy lệnh sau :
su - jenkins
Chạy lệnh này xong thì các bạn cũng không login vào được đâu nó vẫn sẽ ở root user mà thôi bởi mặc định thì jenkins không cho phép user jenkins login, để login được cần phải chỉnh sửa 1 chút :
vi /etc/passwd
Các bạn tìm đến mục login và tìm đến user jenkins chỉnh sửa giống như mình bên dứoi đấy:
login
...
jenkins:x:995:993:Jenkins Automation Server:/var/lib/jenkins:/bin/bash
Các bạn thay false thành bash để có thể login nhé
Bước cuối cùng là các bạn cần phải thêm user jenkins vào nhóm root để user jenkins này có thể đọc được file .pem bên trên nhé
chown -Rf jenkins:root ssh-webserver/
OK login vào jenkins user và ssh sang user www-user bên webserver thôi
su - jenkins
tiếp theo cd vào thư mục chứa pem file
cd /home/ssh-webserver/
Chạy lệnh sau để ssh:
ssh -i access-key.pem www-user@your_public_ip
Kết quả :
-bash-4.2$ ssh -i server-a.pem www-user@3.1.8.49
Last login: Sat May 13 16:17:53 2023
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
[www-user@ip-172-31-27-42 ~]$
Bước 3: Github configuration webhook
Nhiệm vụ của webhook là gì ? Khi mình đẩy code lên github thì cái webhook này nó sẽ thông báo cho jenkins là tôi có code mới rồi đó ông deploy cho tôi đi ..chính vì vậy mình phải tạo 1 webhook trên github nhé !
Đầu tiên bạn phải vào repo trên github mà bạn muốn deploy sau đó thì click vào setting và chọn Webhooks sau đó thì click add webhook
Các bạn cần phải điền 1 số input sau
- Payload URL: Lấy url jenkin của bạn nhé ! your_domain:port/github-webhook/
- ví dụ (http://18.143.166.188:8080/github-webhook/)
- Secret : Các bạn nhập tuỳ thích mục đích của nó để ngừoi khác ko hack đc cái webhook của bạn.
- còn những cài đặt khác bạn giữ nguyên và chỉ cần click add webhook là Ok rồi.
Bước 4: Configuration jenkins
Các bạn vào server jenkin trên browser sau đó thì click vào New Item để deploy cho webserver
Bạn hãy tạo một Item name sau đó thì chọn Freestyle project nhé, sau bước này thì tìm đến mục Source Code Management
Để mà cài được Repository URL thì bạn phải chắc chắn rằng trong server jenkins đã được cài github nhé .
sudo yum install git -y
Sau bước này thì các bạn tạo một ssh-key cho user jenkins
sudo -su jenkins
Tạo ssh-key
ssh-keygen -t rsa
Sau khi chạy lệnh này thì 1 list cmd sẽ hiện ra các bạn chỉ việc ấn enter , không nhập gì cả nhé
Enter file in which to save the key (/home/www-user/.ssh/id_rsa):
Created directory '/home/www-user/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/www-user/.ssh/id_rsa.
Your public key has been saved in /home/www-user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:4Lxy0lnLPsC1g5fCj+unPrn1b7KY3XVEEYLCECGmUr4 www-user@ip-172-31-27-42.ap-southeast-1.compute.internal
The key's randomart image is:
+---[RSA 2048]----+
| . o += .. o.|
| o o . o . . .|
| . o . . .|
| . .o .. . |
| E oooSo .|
| .*==. . |
| o =B+. . .|
| ++o+=.... . |
| o**+.+=o |
+----[SHA256]-----+
Sau khi hoàn thành bước này thì các bạn thấy public key của chúng ta đã được lưu ở thư mục /var/lib/jenkins/.ssh/
Để jenkin có thể truy cập vào github thông qua user jenkins thì chúng ta cần phải thêm public key vào github của mình, để lấy được public key ta dùng cmd sau:
cat /var/lib/jenkins/.ssh/id_rsa.pub
Sau khi đăng nhập vào GitHub, bạn cần truy cập vào repo của bạn muốn deploy sau đó thì chuyển đến Setting Repo -> Deploy keys -> Add deploy key hãy paste public key của bạn vào đó là xong rồi.
Quay lại config Jenkin trong Source Code Management tiếp nào :
- Repository URL: Bạn copy ssh clone từ github vào đây nhé
- Credentials: Add Credentials
- Domain (giữ nguyên)
- Kind chọn SSH username with private key
- Scope (giữ nguyên)
- ID (optional)
- Description (optional)
- Username (nhập tên hợp lý và dễ nhớ )
- Private Key ( copy text trong private key trong /var/lib/jenkins/.ssh/id_rsa rồi paste vào đây nhé ) không được có khoảng trắng trước đầu và cuối nhé .
Sau bước này thì các bạn thêm Branches to build
- Nhánh github bạn dùng để build , tuỳ vào các bạn chỗ này nhé của mình thì vẫn giữ nguyên là master
Tiếp theo là chọn Build Triggers :
- chọn GitHub hook trigger for GITScm polling
Tiếp theo là chọn Build Steps:
- chọn Execute shell và nhập đoạn script dưới đây vào , bạn cần phải chỉnh sao cho phù hợp với của bạn nhé
#!/bin/bash
ssh -T -i /home/webserver/access-key.pem www-user@52.77.239.91 << EOF
cd /var/www/html/blog
git pull
EOF
Sau khi vào được thư mục chứa project của bạn thì bạn có thể cài cắm mọi thứ nhưng mình khuyên không nên cài cắm ở đây nhé bởi mỗi lần jenkins nó build thì lại phải cài lại mọi thứ , mình khuyên nên dùng để pull code thôi nhé !
Bước cuối cùng rồi nè , trước khi thực hiện push code lên thì các bạn nên build thử trước xem nó có chạy được không đã nhé ! Nếu Ok thì mình thử push code vào master sau nha để làm được việc này thì các bạn chỉ cần ấn vào Build Now.
Chú ý : Nếu bạn build bị lỗi như sau :
Failed to connect to repository : Command "git ls-remote -h git@github.com:person/blog.git HEAD" returned status code 128:
stdout:
stderr: Host key verification failed.
....
Hãy login vào jenkins user và run cmd sau :
git ls-remote -h git@github.com:person/blog.git HEAD
Sau khi build thử mà không có lỗi và show ra như thế này là thành công rồi nè .
Kết luận
Đây chỉ 1 sample khá đơn giản thôi , bài sau mình sẽ tiếp tục ra bài để kết hợp với auto test trong CI nữa nhé , Chúc các bạn thành công .
Bình luận (0)