使用Gitlab的CI對SpringBoot Maven項目測試、部署流程

環(huán)境準(zhǔn)備

  1. 操作系統(tǒng):CentOS 7.x
  2. Docker版本:1.13.x
  3. gitlab-runner鏡像:docker.io/gitlab/gitlab-runner:latest
  4. maven鏡像:docker.io/maven:3.3-jdk-8
  5. SpringBoot版本2.1.4

申請Gitlab官網(wǎng)賬號

  1. 官網(wǎng)地址
  2. 注冊賬號、創(chuàng)建Git倉庫就不說了

CI集成過程

準(zhǔn)備gitlab-runner

docker pull gitlab/gitlab-runner:latest
docker run -d --name gitlab-runner --restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/build_cache:/cache \
gitlab/gitlab-runner:latest

注意 -v /var/run/docker.sock:/var/run/docker.sock 不能少,因為我executor用的是docker

接下來要注冊gitlab-runner

  • 進(jìn)入image
docker exec -it gitlab-runner /bin/bash
  • 執(zhí)行注冊
gitlab-runner register -n \
  --url https://gitlab.com/ \
  --registration-token pAgjBUc7y9fKCi_AzxyE \
  --executor docker \
  --output-limit 81920 \
  --description "Gitlab Runner" \
  --docker-image "maven:3.3-jdk-8" \
  --docker-volumes /var/run/docker.sock:/var/run/docker.sock

這里有幾個參數(shù)要解釋一下,
--url:gitlab ci的服務(wù)器地址;
--registration-token:gitlab你的項目的citoken;
--executor:制定runner的執(zhí)行方式,有很多種,shell、docker等等,我用的docker;
--output-limit:構(gòu)建過程的輸出的日志大小限制;
--description:runner描述;
--docker-image:指定構(gòu)建的鏡像環(huán)境;
--docker-volumes:runner就是通過這個路徑使用宿主機(jī)docker構(gòu)建

url,registration-token是從哪來的呢?
先到gitlab -> 你的項目 -> Settings -> CI/CD -> 展開Runners,你就會看到如下圖


gitlab-runners.jpg

注冊完runner后,再來這個CI/CD的Runners頁面,你會發(fā)現(xiàn)它已經(jīng)關(guān)聯(lián)上了,如圖


gitlab-runner-activatedd.jpg

注意還要給runner設(shè)置一個tag,點擊名稱 GfXt9GLr 后面的修改按鈕,進(jìn)去后設(shè)置tags字段,保存,我這里設(shè)置為xgsh

編寫 .gitlab-ci.yml 文件

注意,這里就用到了設(shè)置的tag字段;
在gitlab項目根目錄下,新建文件.gitlab-ci.yml,內(nèi)容如下

image: maven:3.3-jdk-8
stages:
  - test
  - deploy
test_job:
  stage: test
  script:
    - pwd
    - mvn clean
    - mvn compile
    - mvn test
  tags:
    - xgsh
deploy_job:
  stage: deploy
  script:
    - curl http://xxxxx/hooks/xgsh
  only:
    - master

我的做法是,分兩個stages,當(dāng)push代碼到master分支后,先執(zhí)行test,如果test通過,然后執(zhí)行deploy

編寫 Dockerfile 文件

在gitlab項目根目錄下,新建文件Dockerfile,內(nèi)容如下

FROM maven:3.3-jdk-8

MAINTAINER yangzhixiao1989@foxmail.com

USER root

COPY . /root/xgsh-api
RUN rm -rf /root/xgsh-api/.git
RUN rm -rf /root/xgsh-api/Dockerfile

WORKDIR /root/xgsh-api

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

VOLUME ["/root/.m2"]
RUN mvn clean package -Dmaven.test.skip=true

EXPOSE 8080

CMD ["java", "-jar", "/root/xgsh-api/target/xgsh-api-1.0-SNAPSHOT.jar"]

這樣,當(dāng)有新的push到master分支,立刻就觸發(fā)ci,在項目的CI/CD菜單,可以看到pipelines如下圖


gitlab-runner-status.jpg

上面的是test成功、deploy也成功
下面的是test失敗、deploy跳過

Deploy到測試服務(wù)器

上面的deploy腳本寫的是

deploy_job:
  stage: deploy
  script:
    - curl http://xxxxx/hooks/xgsh

就是說,當(dāng)push到master分支的代碼通過測試后,就會觸發(fā)deploy階段,執(zhí)行腳本curl http://xxxxx/hooks/xgsh,這個地址是一個webhook,配置如下
webhook配置文件hooks.yaml

- id: xgsh
  execute-command: /root/webhook/pull-and-redeploy.sh
  command-working-directory: /root/xgsh
  response-message: Start to redeploy!
  response-headers:
  - name: Access-Control-Allow-Origin
    value: '*'

腳本pull-and-redeploy.sh

#!/bin/bash

kill -9 `cat app.pid`
rm -rf app.pid
git reset --hard head
git pull
mvn clean package -Dmaven.test.skip=true
java -jar ./target/xgsh-api-1.0-SNAPSHOT.jar > web.log 2>&1 & echo "$!" > app.pid
echo 'redeploy done.'

這樣以后只要push代碼,就自動測試,然后運(yùn)行最新的代碼,很方便測試

總結(jié)

  • 配置gitlab-runner的docker容器,進(jìn)入容器注冊runner
  • 配置gitlab自己項目runner的tag
  • 編寫.gitlab-ci.yml、Dockerfile
  • 流程:push代碼到master分支,觸發(fā)pipelines的test_job,測試通過后,執(zhí)行deploy_job,通過webhook觸發(fā)服務(wù)器端執(zhí)行腳本pull-and-redeploy.sh,然后git pull更新代碼,java -jar運(yùn)行SpringBoot應(yīng)用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容