使用Gitlab CI/CD功能在本地部署 Spring Boot 項目


前提條件:
1.Docker安裝Gitlab,地址:https://www.cnblogs.com/sanduzxcvbnm/p/13814730.html
2.Docker安裝Gitlab-runner,地址:https://www.cnblogs.com/sanduzxcvbnm/p/13815594.html

在Gitlab上創建項目

1.新建項目

2.選擇springboot模板創建

3.創建項目

創建好項目后查看克隆的地址
我這邊是根據前提條件來創建的,所以使用的克隆地址中會有端口號

4.添加本機ssh秘鑰到項目設置中

5.本機克隆該項目到本機
使用git地址克隆

使用http地址克隆

項目修改

1.修改項目中自帶的Dockerfile文件,具體內容如下

# 原先的內容
FROM maven:3-jdk-8-alpine
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN mvn package
ENV PORT 5000
EXPOSE $PORT
CMD [ "sh", "-c", "mvn -Dserver.port=${PORT} spring-boot:run" ]

# 修改后的內容
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY  /target/demo-0.0.1-SNAPSHOT.jar app.jar # 正常情況下target前面沒有/,但是在這里需要有,不能省略,否則會報錯。
ENV PORT 5000
EXPOSE $PORT
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dserver.port=${PORT}","-jar","/app.jar"]

按正常情況下target前面沒有/的報錯信息

target前面加上/后可以正確執行

2.創建.gitlab-ci.yml文件,具體內容如下

image: docker:latest  #1
variables:  #2
  DOCKER_DRIVER: overlay2
  # DOCKER_HOST: tcp://192.168.0.253:2375  # docker host,本地可不寫,
  TAG: root/hello-spring:v0.1  # 生成的鏡像名稱
cache:  #3
  paths:
    - .m2/repository
services:  #4
  - docker:dind
stages:  #5
  - package
  - deploy
maven-package:  #6
  image: maven:3.5-jdk-8-alpine
  tags:
    - maven # 使用的gitlab-runner需要有這個標簽
  stage: package
  script:
    - mvn clean package -Dmaven.test.skip=true
  artifacts:
    paths:
      - target/*.jar
build-master:  #7
  tags:
    - docker # 使用的gitlab-runner需要有這個標簽
  stage: deploy
  script:
    - docker build -t $TAG . # 根據Dockerfile文件構建鏡像
    - docker rm -f test || true # 刪除測試容器
    - docker run -d --name test -p 5000:5000 $TAG # 運行容器,$TAG是開頭設置的變量,表示的是鏡像
  only:
    - master

說明:

  • 1:需要用到的鏡像
  • 2:必須配置的一些環境變量。如果本地可不配置 DOCKER_HOST。作用是生成的docker鏡像是在本機上還是在其他主機上
  • 3:配置緩存,配置后,maven 下載的依賴可以被緩存起來,下次不需要重復去下載了。
  • 4:配置需要用到的額外的服務。docker:dind,這個貌似是用於在 docker 中運行 docker 的一種東西,在項目的構建中需要。
  • 5:stages,這是 Gitlab CI 中的概念,Stages 表示構建階段,就是一些按序執行的流程,具體執行是依賴於 Jobs 的。在CI/CD流水線中可以看到
  • 6:定義的 Jobs 之一,用於構建 jar 包。內部又引入 maven 鏡像來處理,負責執行 package 這一流程。script 為具體執行的腳本。
  • 7:定義的 Jobs 之一,用於構建 Docker 鏡像。負責執行 deploy 這一流程。具體執行 build 和 run。only 節點表示只監控 master 分支。


所有的配置工作都已經完成了,接下來 Git 執行 commit&push,自動構建就開始了。
整個項目的目錄結構如下:

開始構建

在本機上修改上述倆文件后提交到Gitlab上,此時自動構建就開始了。
我這邊已經操作過了,直接看結果

第一階段的第一個jobs,可以查看到編譯生成好的jar文件

其中生成的這個jar文件可以下載下來,下載下來一個artifacts.zip文件,解壓縮后有個target文件夾,這個文件夾下也就是編譯生成的項目jar文件

這個功能在.gitlab-ci.yml配置文件中的體現

第二階段的第一個jobs

這個功能在.gitlab-ci.yml配置文件中的體現

再次提交內容,又會開始自動構建,生成的docker鏡像會發生變化,運行的容器也發生變化.
根據這個情況,可以在提交代碼的時候修改編譯生成的docker鏡像版本

# 第一次構建
~ # docker image ls
REPOSITORY                              TAG                  IMAGE ID            CREATED             SIZE
root/hello-spring                       v0.1                 35937b860369        8 minutes ago       121MB

~ # docker ps                                                                                                                  
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                 PORTS                                                               NAMES
b8ab41b5bbc7        root/hello-spring:v0.1        "java -Djava.securit…"   6 minutes ago       Up 6 minutes           0.0.0.0:5000->5000/tcp 

# 第二次構建
~ # docker image ls
REPOSITORY                              TAG                  IMAGE ID            CREATED              SIZE
root/hello-spring                       v0.1                 661f48a8d64c        About a minute ago   121MB

~ # docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED              STATUS                 PORTS                                                               NAMES
ab619c680e77        root/hello-spring:v0.1        "java -Djava.securit…"   About a minute ago   Up About a minute      0.0.0.0:5000->5000/tcp 

繼續延伸:
1.每次提交代碼之前都得手動修改docker鏡像版本,有沒有其他更簡便的辦法
2.最后階段的最后jobs可以把生成的docker鏡像推動到鏡像倉庫,比如Harbor,Nexus等
3.跟k8s進行配置關聯
4.多階段,多jobs構建


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM