天天看點

GitLab CI/CD自動化部署(持續內建)

一、安裝及配置

1、gitlab及runner安裝

1.)gitlab安裝

$ docker run -d --name gitlab -p 1443:443 -p 9800:80 --restart always \
    -v /opt/gitlab/config:/etc/gitlab \
    -v /opt/gitlab/data:/var/opt/gitlab \
    -v /opt/gitlab/logs:/var/log/gitlab \
    --privileged=true \
    gitlab/gitlab-ce:latest      

2.)gitlab-runner安裝

$ docker run -d --name gitlab-runner --restart always \
    -v /srv/gitlab-runner/config:/etc/gitlab-runner \
    -v /var/run/docker.sock:/var/run/docker.sock \
    gitlab/gitlab-runner:latest      

3.)gitlab-runner注冊

進入gitlab-runner容器,進行注冊
$ docker exec -it gitlab-runner gitlab-ci-multi-runner register      
注冊時需要的url、token都在settings > CI/CD或runner中找到,再輸入runner名稱,executor執行器選shell好了

4.)相關應用安裝

進入gitlab-runner容器,下載下傳安裝node、npm等全局依賴
2、gitlab-ci配置詳解
gitlab-runner注冊成功後,當監聽到push等事件,會自動執行.gitlab-ci.yml配置中任務,ci配置通常由stages、job等主要部分組成。
  • Stages
階段/步驟,多個Stage按以下順序執行,若其中任何一個失敗,則後續stage不執行。
stages:
  - build
  - test
  - deploy      
  • 公用
所有stage之前,可以執行一些公共的操作
before_script:  # after_script,在所有job之後
  - npm set registry http://registry.npm.taobao.org      
  • Job
任務可以有多個
job1:
  # 執行階段,若不指定預設test
  stage: build
  
  # 指定執行的runner标簽
  tags:
    - runner-build

  # 觸發分支
  only:
    - master
    - release
    - /^release\/.*$/
    - triggers
    
  # 自定義變量
  variables
    sourceDir: ./src
    
  # 執行腳本
  script:
    - cd ./xxx
    - npm install
    - npm run lint
    - npm run build
    
  # 是否允許失敗,true表示失敗後不影響後面流程
  allow_failure: false        

二、自動化建構

1、設定遠端登入
通過使用者名+公鑰的方式可以讓腳本在無密的情況下登入遠端伺服器

1.)檢視/生成ssh密鑰

進入gitlab-runner容器,檢視/home/gitlab-runner/.ssh目錄下 id_rsa(私鑰)、id_rsa.pub(公鑰)檔案,若沒有可通過下面指令生成:
$ ssh-keygen -t rsa -C 'your [email protected]'      

2.)公鑰追加到伺服器ssh認證檔案

将/home/gitlab-runner/.ssh/id_rsa.pub公鑰通過rz指令上傳到伺服器~/目錄下,也可以直接copy後手動編輯添加
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys      
2、自動化部署
./.gitlab-ci.yml檔案
stages:
  - deploy

job:
  stage: deploy
  tags:
    - runner-deploy
  only:
    - master
    - triggers
  script:
    - chmod +x ./bin/deploy.sh
    - ./bin/deploy.sh encore      
./bin/deploy.sh檔案
#!/bin/bash

# 服務名接收/判斷
serv=$1
if [ ! $serv ] ;then
    echo -e "\e[31;5mError: No service name config in .gitlab-ci.yml\!\e[0m"
    exit 2
fi

npm config set registry http://registry.npm.taobao.org
clear

# 1.編譯web
echo -e "\e[1;36;5m======>Start buiding [$serv] web...\e[0m"
cd ./web
npm i
npm run build

# 2.編譯server
echo -e "\e[1;36;5m======>Start buiding [$serv] server...\e[0m"
cd ../server
npm i --production

# 3.打包遠端傳送
echo -e "\e[1;36;5m======>Start sending [$serv] over ssh...\e[0m"
cd ../
tar -zcf $serv.tar.gz ./bin ./web/dist ./server ./docker-compose.yml ./.gitlab-ci.yml
# 傳送
scp -o StrictHostKeyChecking=no $serv.tar.gz [email protected]:/root/static
git clean -fd
git reset --hard HEAD

# 4.遠端部署
echo -e "\e[1;36;5m======>Start deploy [$serv] service...\e[0m"
# 遠端執行批量腳本
ssh -Tq [email protected] << remotessh
#----------------------------------------------
cd /root/static
if ! test -e $serv; then
   mkdir $serv
fi
tar -mzxf $serv.tar.gz -C $serv
rm $serv.tar.gz
cd $serv
# 建立/啟動服務
docker-compose up -d
exit
#----------------------------------------------
remotessh

echo -e "\e[1;32mService [$serv] deploy success!\e[0m"      

a.)echo -e顯示帶顔色的閃動文字

b.)scp/ssh參數-o StrictHostKeyChecking=no用來忽略第一次連接配接提示生成known_hosts檔案

c.)ssh參數-Tq用來去掉僞終端提示

d.)遠端執行批量腳本需用remotessh或EOF(不輸出echo内容)

e.)變量申明推薦放腳本頭部,若定義在remotessh代碼塊中變量都需要轉義成\\都需要轉義成,也可直接在第一個remotessh或EOF加引号

f.)exit 0:成功退出,1:失敗退出,2:用法不當退出