Quay lại

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    comment-3 Created with Sketch Beta. 0 Bình luận

Continuous Integration (CI) | Laravel app | Jenkins/GitHub | linux

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 userssh 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)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday