Toán tin vuotlen.com

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

  1. Active // bỏ chọn thì runner này ko đc online
  2. Protected // stick chọn thì nhánh nào protected mới chạy đc
  3. Run unstagged jobs // ko cần chỉ định chính xác server nào
  4. 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.


🔹 | (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.