Gitlab CI/CD
Phần 1: Continuous Deploment (Chạy tự động)
Google: how to install gitlab runner in ubuntu:
sudo apt update && sudo apt upgrade
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt install gitlab-runner
gitlab-runner –v
kiểm tra user:
vi /etc/passwd
sẽ có gitlab-runner và thư mục làm việc là gitlab-runner
Vào gitlab chrome
Vào setting/ci/cd->Runner->expand
Về server:
Gitlab-runner register
Enter gitlab URL: Copy url gitlab, base url
Enter token:
Enter description: copy tên cái server đó luôn
Enter tag for the runner: copy tên cái server đó luôn
Enter optional: enter bỏ qua
Enter executor: quan tâm 3 cái shell, docker, kubernates....
Gõ vào shell
Mở file: vi /etc/gitlab-runner/config.toml
Sửa concurrent = 4 // chạy đồng thời 4 dự án
Chạy lên:
nohup gitlab-runner run –working-directory /home/gitlab-runner/ --config /etc/gitlab-runner/config.toml –service gitlab-runner --user gitlab-runner 2>&1 &
Ls // sẽ nohup.out
ps –ef|grep gitlab-runner
Về google gitlab f5 // bấm vào edit
- Active // bỏ chọn thì runner này ko đc online
- Protected // stick chọn thì nhánh nào protected mới chạy đc
- Run unstagged jobs // ko cần chỉ định chính xác server nào
- Lock to current projects // chọn thì các dự án khác ko chạy đc runner
Bỏ chọn lock to current projects
Viết pipepline đầu tiên:
Settings/repo ->Protected nhánh develop/Allow to push, để là maintainer
Ở branch develop tạo file:
.gitlab-ci.yml
Nội dung:
stages:
- build
- deploy
- checklog
build: // tên job, thường đặt trùng với stage luôn
stage: build
script:
- whoami
- pwd
- ls
Sau đó commit:
config(pipeline): add build stage
Sẽ thấy dòng This Gitlab ... valid // hợp lệ
Nhấn vào ci/cd // sẽ thấy stuck // pipeline bị tắt do ko có runner nào online
Settings/ ci/cd: Run unstagged jobs / stick chọn vào
Vào ci/cd pipelines cancel, sửa file .gitlab-ci.yml
Sửa stuck:
stages:
- build
- deploy
- checklog
build:
stage: build
script:
- whoami
- pwd
- ls
tags:
- lab-server
commit: config(pipline): add runner
Quay lại ci/cd pipelines
Sẽ ko còn stuck/ nhấn vào/ build
Ls đường dẫn từ gitlab sẽ thấy các file kéo về từ gitlab server
Giả sử tạo 1 file trong thư mục làm việc đó sample.txt, sửa 1 file readme trong gitlab, nó sẽ tự kéo code mới về server, nhưng ko có file sample.txt
Build dự án:
stages:
- build
- deploy
- checklog
build:
stage: build
script:
- mvn install –DskipTests=true // build dự án java
tags:
- lab-server
Commit: Config(pipeline): update build stage
Server check sẽ có folder target
Deploy function:
stages:
- build
- deploy
- checklog
build:
stage: build
script:
- mvn install –DskipTests=true // build dự án java
tags:
- lab-server
deploy:
stage: deploy
script:
- java –jar target/shoe.....jar
Về server:
mkdir /datas
// đã có user shoeshop nên ko cần tạo nữa
mkdir /datas/shoeshop
Cho phép gitlab runner dùng sudo ko cần nhập password:
visudo
ở dưới root
gitlab-runner ALL=(ALL) NOPASSWD: /bin/cp*
gitlab-runner ALL=(ALL) NOPASSWD: /bin/chown*
gitlab-runner ALL=(ALL) NOPASSWD: /bin/su shoeshop*
kiểm tra shoe có đang chạy ko:
ps –ef|grep shoe
kill -9 id
Chạy với runner lab-server:
stages:
- build
- deploy
- checklog
build:
stage: build
script:
- mvn install –DskipTests=true // build dự án java
tags:
- lab-server
deploy:
stage: deploy
script:
- java –jar target/shoe.....jar
tags:
- lab-server
Commit: config(pipeline): add deploy stage
Xong vào ci/cd sẽ báo lỗi, vì code xóa, đã mất folder target
stages:
- build
- deploy
- checklog
build:
stage: build
variables:
- GIT_STRATEGY: clone
script:
- mvn install –DskipTests=true // build dự án java
tags:
- lab-server
deploy:
stage: deploy
variables:
- GIT_STRATEGY: none
script:
- java –jar target/shoe.....jar
tags:
- lab-server
Commit: config(pipeline): change strategy runner
// build thì clone về chạy script, deploy thì ko clone, giữ nguyên thư mục làm việc ở build và có target
// cách chuẩn là dùng artifacts:
Viết script sudo:
stages:
- build
- deploy
- checklog
build:
stage: build
variables:
- GIT_STRATEGY: clone
script:
- mvn install –DskipTests=true // build dự án java
tags:
- lab-server
deploy:
stage: deploy
variables:
- GIT_STRATEGY: none
script:
- sudo cp target/shoe-.... .jar /datas/shoeshop
- sudo chown -R shoeshop. /datas/shoeshop
- sudo su shoeshop –c “cd /datas/shoeshop/; nohup java –jar target/shoe.....jar 2>&1 &”
tags:
- lab-server
Commit: config(pipeline): add script deploy stage
sudo → chạy với quyền root.
su shoeshop → switch user thành user shoeshop.
-c "..." → option -c (command): chạy lệnh trong dấu "..." với tư cách user shoeshop.
cd /datas/shoeshop/; → chuyển thư mục hiện tại sang /datas/shoeshop/.
nohup → chạy lệnh không bị dừng ngay cả khi logout terminal.
java -jar target/shoe.....jar → chạy ứng dụng Spring Boot/Java.
2>&1 → redirect stderr (2) sang stdout (1), tức là gộp log lỗi và log thường chung một luồng.
& → chạy ở background.
👉 Nghĩa: chạy ứng dụng .jar trong background với user shoeshop, không bị kill khi logout, log lỗi và log thường gộp chung.
Fail vì đã có 1 port 8080 được dùng.
Ps –ef | grep shoe
//
ps -ef
Là lệnh dùng để liệt kê tất cả các tiến trình (process) đang chạy trên hệ thống.
- ps = process status
- -e = hiển thị tất cả các process (mọi user)
- -f = hiển thị đầy đủ thông tin (full-format), gồm:
- UID PID PPID C STIME TTY TIME CMD
- UID: user chạy tiến trình
- PID: process ID
- PPID: ID của process cha
- CMD: lệnh gốc được chạy (vd: java -jar app.jar)
🔹 | (pipe)
Dấu | dùng để chuyển kết quả đầu ra (output) của lệnh bên trái sang đầu vào (input) của lệnh bên phải.
🔹 grep shoe
Tìm trong danh sách process những dòng có chứa chữ "shoe".
grep là lệnh tìm kiếm chuỗi (string) trong văn bản.
🔹 Tổng hợp lại
Lệnh này sẽ:
📜 Hiển thị tất cả tiến trình trên hệ thống mà có chữ “shoe” trong dòng lệnh chạy của nó.
Ps –ef | grep shoe-Shoping...jar | grep –v grep
Ps –ef | grep shoe-Shoping...jar | grep –v grep | awk ‘{print $2}’ // lấy giá trị cột 2
Kill 9 ${ Ps –ef | grep shoe-Shoping...jar | grep –v grep | awk ‘{print $2}’}
//
Tạo variable để không cần lặp lại:
variables:
projectname: shoe-ShopingCart
version: 0.0.1-SHAPSHOT
projectuser: shoeshop
projectpath: /datas/shoeshop/
stages:
- build
- deploy
- checklog
build:
stage: build
variables:
- GIT_STRATEGY: clone
script:
- mvn install –DskipTests=true // build dự án java
tags:
- lab-server
deploy:
stage: deploy
variables:
- GIT_STRATEGY: none
script:
- sudo cp target/$projectname-$version.jar $projectpath
- sudo chown –R $projectuser. $projectpath
- sudo su $projectuser –c “kill 9 ${ Ps –ef | grep shoe-Shoping...jar | grep –v grep | awk ‘{print $2}’}”
- sudo su $projectuser –c “cd $projectpath; nohup java –jar target//$projectname-$version.jar > nohup.out 2>&1 &”
tags:
- lab-server
Commit: config(pipeline): update config
Như vậy mỗi lần update bất kỳ cái gì ví dụ sửa README nó cũng sẽ delete và chạy lại, chưa tối ưu.
Gắn thêm tags only:
variables:
projectname: shoe-ShopingCart
version: 0.0.1-SHAPSHOT
projectuser: shoeshop
projectpath: /datas/shoeshop/
stages:
- build
- deploy
- checklog
build:
stage: build
variables:
- GIT_STRATEGY: clone
script:
- mvn install –DskipTests=true // build dự án java
tags:
- lab-server
only:
- tags
deploy:
stage: deploy
variables:
- GIT_STRATEGY: none
script:
- sudo cp target/$projectname-$version.jar $projectpath
- sudo chown –R $projectuser. $projectpath
- sudo su $projectuser –c “kill 9 ${ Ps –ef | grep shoe-Shoping...jar | grep –v grep | awk ‘{print $2}’}”
- sudo su $projectuser –c “cd $projectpath; nohup java –jar target//$projectname-$version.jar > nohup.out 2>&1 &”
tags:
- lab-server
only:
- tags
Commit: config(pipeline): update config
Vào Repository/tags tạo tags dev_0.0.1
Khi tạo tags thì pipeline mới chạy
Tạo Showlog:
variables:
projectname: shoe-ShopingCart
version: 0.0.1-SHAPSHOT
projectuser: shoeshop
projectpath: /datas/shoeshop/
stages:
- build
- deploy
- showlog
build:
stage: build
variables:
- GIT_STRATEGY: clone
script:
- mvn install –DskipTests=true // build dự án java
tags:
- lab-server
only:
- tags
deploy:
stage: deploy
variables:
- GIT_STRATEGY: none
script:
- sudo cp target/$projectname-$version.jar $projectpath
- sudo chown –R $projectuser. $projectpath
- sudo su $projectuser –c “kill 9 ${ Ps –ef | grep shoe-Shoping...jar | grep –v grep | awk ‘{print $2}’}”
- sudo su $projectuser –c “cd $projectpath; nohup java –jar target//$projectname-$version.jar > nohup.out 2>&1 &”
tags:
- lab-server
only:
- tags
showlog:
stage: showlog
variables:
- GIT_STRATEGY: none
script:
- sudo su $projectuser –c “cd $projectpath; tail –n 10000 nohup.out”
tags:
- lab-server
only:
- tags
Commit: config(pipeline): fix jobname showlog
Vào Repository/tags tạo tags dev_0.0.2
Phần 2: Continuous Delivery (deploy thủ công)
Google gõ: gitlab cicd syntax, dùng when
variables:
projectname: shoe-ShopingCart
version: 0.0.1-SHAPSHOT
projectuser: shoeshop
projectpath: /datas/shoeshop/
stages:
- build
- deploy
- showlog
build:
stage: build
variables:
- GIT_STRATEGY: clone
script:
- mvn install –DskipTests=true // build dự án java
tags:
- lab-server
only:
- tags
deploy:
stage: deploy
variables:
- GIT_STRATEGY: none
when: manual
script:
- sudo cp target/$projectname-$version.jar $projectpath
- sudo chown –R $projectuser. $projectpath
- sudo su $projectuser –c “kill 9 ${ Ps –ef | grep shoe-Shoping...jar | grep –v grep | awk ‘{print $2}’}”
- sudo su $projectuser –c “cd $projectpath; nohup java –jar target//$projectname-$version.jar > nohup.out 2>&1 &”
tags:
- lab-server
only:
- tags
showlog:
stage: showlog
variables:
- GIT_STRATEGY: none
when: manual
script:
- sudo su $projectuser –c “cd $projectpath; tail –n 10000 nohup.out”
tags:
- lab-server
only:
- tags
Commit: config(pipeline): change the project deployment from Cdeployment to Cdelivery
Tạo tags để chạy: repository/tag: tạo tags dev_0.0.3
Vào ci/cd ->pipelines
Build tự chạy
Deploy thì nhấn mới chạy
Showlog thì nhấn mới chạy
Phân quyền người chạy:
Google gõ: gitlab ci variables list
Ctrl+f: search: gitlab_u
variables:
projectname: shoe-ShopingCart
version: 0.0.1-SHAPSHOT
projectuser: shoeshop
projectpath: /datas/shoeshop/
stages:
- build
- deploy
- showlog
build:
stage: build
variables:
- GIT_STRATEGY: clone
script:
- mvn install –DskipTests=true // build dự án java
tags:
- lab-server
only:
- tags
deploy:
stage: deploy
variables:
- GIT_STRATEGY: none
when: manual
script:
>
if [“$GITLAB_USER_LOGIN” == ‘manhnv’]; then
sudo cp target/$projectname-$version.jar $projectpath
sudo chown –R $projectuser. $projectpath
sudo su $projectuser –c “kill 9 ${ Ps –ef | grep shoe-Shoping...jar | grep –v grep | awk ‘{print $2}’}”
sudo su $projectuser –c “cd $projectpath; nohup java –jar target//$projectname-$version.jar > nohup.out 2>&1 &”
else
echo “Permission denied”
exit 1
fi
tags:
- lab-server
only:
- tags
showlog:
stage: showlog
variables:
- GIT_STRATEGY: none
when: manual
script:
- sudo su $projectuser –c “cd $projectpath; tail –n 10000 nohup.out”
tags:
- lab-server
only:
- tags
Commit: config(pipeline): change permission
Tạo user mới dev1, thêm dev1 vào dự án.
Dev1 chạy deploy thì báo permission, còn showlog thì chạy bình thường.