Docker Compose安裝GitLab、Gitlab-runner,提交代碼自動運行流水線打包Spring Boot的Docker包運行


1、Yaml文件: GITLAB_OMNIBUS_CONFIG 為 Gitlab 的配置參數,對應 /etc/gitlab/gitlab.rb。該文件下的所有鍵值對都可以在這里進行配置,容器啟動時會自動配置進去。當然也可以在 Gitlab 容器啟動后,手動修改 gitlab.rb 文件。

version: '3.9'
services:
  gitlab:
    container_name: gitlab
    image: gitlab/gitlab-ce:14.7.0-ce.0
    hostname: 192.168.3.15
    privileged: true
    environment:
      TZ: Asia/Shanghai
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://192.168.3.15:2280'
        registry_external_url 'http://192.168.3.15:2250' #開啟docker registry鏡像庫功能,docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD登錄失敗時需要在gitlab.rb開啟才生效
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
        nginx['listen_port'] = 2280
        nginx['client_max_body_size'] = '1024m'
        gitlab_rails['time_zone'] = 'Beijing'
        gitlab_rails['lfs_enabled'] = true
        registry_nginx['enable'] = true
        registry_nginx['listen_port'] = 2250
    ports:
      - "2280:2280"
      - "2443:443"
      - "2222:22"
      - "2250:2250"
    volumes:
      - ./config/gitlab:/etc/gitlab
      - ./data/gitlab:/var/opt/gitlab
      - ./log/gitlab/:/var/log/gitlab
      - ./config/registry:/var/opt/gitlab/gitlab-rails/shared/registry
    restart: always
  gitlab-runner:
    container_name: gitlab-runner
    image: gitlab/gitlab-runner:v14.7.0
    privileged: true
    volumes:
      - ./config/gitlab-runner:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - gitlab  
    restart: always

2、重置 GitLab 用戶密碼

docker exec -it gitlab gitlab-rake "gitlab:password:reset[root]"
# 輸入兩次8位數相同密碼回車等待成功提示
Enter password: 
Confirm password: 

Password successfully updated for user with username root.

3、取消證書登錄:添加"insecure-registries"項,重啟Docker: sudo systemctl restart docker

# docker login http://192.168.3.15 -u root -p xxx
$ vi /etc/docker/daemon.json
# 全部容器隨docker服務啟動,添加 "live-restore": true 
# 注:要登錄的機器也要添加服務器的IP和端口,不然無法登錄。

{
  "registry-mirrors": ["https://7dc3jqs1.mirror.aliyuncs.com"],
  "insecure-registries": ["192.168.3.15:8889","192.168.3.15:2250"],
  "live-restore": true 
}

# systemctl daemon-reload
# systemctl restart docker.service

4、設置 本地TortoiseGit保存密碼

# 右鍵_TortoiseGit_設置_編輯全局.get/config_修改helper = store
[credential]
	#helper = manager-core
	helper = store
[user]
	name = stc
	email = stc66@qq.com

5、git連接添加SSH免密登錄

# 1、打開路徑 C:\Program Files\Git\usr\bin\
# 2、在路徑里輸入cmd
# 3、粘貼:ssh-keygen -t rsa -C "stc66@qq.com"
# 4、一直回車,C:\Users\Administrator\.ssh
# 5、打開id_rsa.pub,復制里面的所有ssh內容到gitlab
# 6、右鍵TortoiseGit_設置_選中網絡_SSH客戶端_修改為 C:\Program Files\Git\usr\bin\ssh.exe,

6、查看docker資源占用情況

docker stats

7、設置

# 1、設置中文界面
點右上角頭像_Preferences_Language_選擇中文_保存刷新

# 2、關閉Gravatar頭像系統,訪問國外網站可能導致訪問卡頓
點左上角管理員_設置_通用_帳戶和限制_取消Gravatar勾選

# 3、關閉注冊功能
點左上角管理員_設置_通用_注冊限制_取消已啟用注冊功能勾選

#4、修改artifacts最大大小
點左上角管理員_設置_CI/CD_展開持續集成和部署_修改最大產物大小為1000

#5、右上角編輯個人資料_時間設置_[UTC+8] Beijing

8、注冊docker-runner

docker exec -it gitlab-runner gitlab-runner register
# 執行后按以下命令提示輸入相應的命令
b.Enter your GitLab instance URL:
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
	# 輸入gitlab地址:http://192.168.3.15:2280(下圖3的地址) 或者網址
c.Enter the token you obtained to register the Runner:
Please enter the gitlab-ci token for this runner
	# 輸入token令牌(下圖3的token)
d.Enter a description for the Runner, you can change this later in GitLab's UI:
Please enter the gitlab-ci description for this runner
[hostame] my-runner #輸入Runner的描述,可以稍后在GitLab的UI中更改(hello,spring boot!)
e.Enter the tags associated with the Runner, you can change this later in GitLab's UI:
Please enter the gitlab-ci tags for this runner (comma separated):
	tag # 可以不寫,輸入與Runner關聯的標簽,您可以稍后在GitLab的UI中更改(maven,docker)
f.Enter the Runner executor:
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
	docker #輸入Runner執行程序
Please enter the default Docker image (e.g. ruby:2.6):
docker:latest # 或者docker:stable 一定要指定,才能正常使用docker命令

9、配置config.toml

# 由於剛剛我們只是根據流程配置了一些基本的信息,還有額外的參數要配置就需要修改對應的配置文件了。
# 可以直接修改映射到本地的 /home/cache/gitlab/runner-config 目錄下的 config.toml。每配置一個 runner 就會在配置文件中生成一個 [[runners]]。
#1:默認為 false,需改為 true。false 時,在 CI 構建的時候 會進行 health check,很耗時而且還是失敗,設為 true 就自動跳過了,其中原因暫未深究。
#2:如果本地有 maven 環境的話,可以掛在到本地,這樣在處理依賴時可以直接使用本地的環境,並且可以用阿里雲鏡像源。

[[runners]]
  name = "hello,spring boot!"
  url = "http://172.17.193.109:7780/"
  token = "u8_Y5rLQazUmBZar9eys"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.docker]
    tls_verify = false
    image = "docker:latest"
    privileged = true  #1
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache", "/home/cg/.m2:/root/.m2"]  #2
    shm_size = 0
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]

10、提交本地代碼到Gitlab倉庫

#1、Gitlab倉建項目(不要勾選“使用自述文件初始化倉庫”)

#2、IDEA項目里根目錄添加文件.gitignore
# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

# 自定義不需要上傳到Gitee的忽略項
.git/
.svn/
.idea/
*.iml
.project
target/
log/

#3、IDEA VCS里創建本地倉庫
#4、IDEA項目右鍵 -> git -> 添加
#5、IDEA項目右鍵 -> git -> 提交目錄 -> 提交並推送
#6、遠程名稱:master Url地址:http://192.168.3.15:2280/stc/szbxl.git

11.1、Spring Boot根目錄下Dockerfile(單模塊)


FROM openjdk:8-jre-alpine
VOLUME /tmp
###復制文件到容器app-springboot
COPY ./target/demo-0.0.1-SNAPSHOT.jar app.jar
ENV PORT 5000
EXPOSE $PORT
#ENTRYPOINT ["java","-jar","hello.jar"]
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dserver.port=${PORT}","-jar","/app.jar"]

12.1、Spring Boot根目錄下.gitlab-ci.yml配置(單模塊)

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

image: docker:latest  #1
variables:  #2
  DOCKER_DRIVER: overlay2
  DOCKER_HOST: tcp://172.17.193.109:2375  # docker host,本地可不寫
  DOCKER_TLS_CERTDIR: ''
  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
  stage: package
  script:
    - mvn clean package -Dmaven.test.skip=true
  artifacts:
    paths:
      - target/*.jar
build-master:  #7
  tags:
    - docker
  stage: deploy
  script:
    - docker build -t $TAG .
    - docker rm -f test || true
    - docker run -d --name test -p 5000:5000 $TAG
  only:
    - master

11.2 Spring Boot根目錄下Dockerfile(多模塊)

# 基礎鏡像
# 不能使用openjdk:8-jre-alpine,原因如下:
# 1、會導致easy-captcha驗證碼生成失敗。
# 2、 Docker啟動會報錯:ERROR: failed to launch: exec.d: failed to execute exec.d file at path '/layers/paketo-buildpacks_bellsoft-liberica/helper/exec.d/memory-calculator': exit status 1
FROM openjdk:17

# 鏡像作者
LABEL author="Scode<stc66@qq.com>"

# 指定容器內的時區
RUN echo "Asia/Shanghai" > /etc/timezone

# 環境變量
ENV MYPATH /apps/

# 創建項目存放路徑
RUN mkdir -p ${MYPATH}

# 指定工作目錄
WORKDIR ${MYPATH}

# 盡量采用指定路徑掛載,不然會生成很多臨時掛載垃圾文件
# 匿名掛載目錄(宿主機位置:/var/lib/docker/volumes/xxxxxxxxxxxxxxxx)
# 查看掛載目錄:docker inspect szbxl-user-service
# 查看所有掛載卷:docker volume ls
#VOLUME ${MYPATH}

# Tomcat 默認使用/tmp作為工作目錄。這個命令的效果是:在宿主機的/var/lib/docker目錄下創建一個臨時文件並把它鏈接到容器中的/tmp目錄
#VOLUME /tmp
#VOLUME /log

# 添加jar包到指定路徑
COPY tumake-service/tumake-user-service/target/*.jar app.jar

# 暴露端口
EXPOSE 802

# 啟動容器執行命令
#ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
#ENTRYPOINT ["sh", "-c", "java --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED -Djava.security.egd=file:/dev/./urandom -jar app.jar"]
ENTRYPOINT exec java --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED -Djava.security.egd=file:/dev/./urandom -jar app.jar

12.2.1 Spring Boot根目錄下.gitlab-ci.yml配置(多模塊)

#stages:
#  - triggers
#  - triggers1
#trigger_a:
#  stage: triggers
#  trigger:
#    include: szbxl-service/szbxl-user-service/.gitlab-ci.yml
#  rules:
#    - changes:
#        - szbxl-service/szbxl-user-service/*
#trigger_b:
#  stage: triggers1
#  trigger:
#    include: szbxl-getway/.gitlab-ci.yml
#  rules:
#    - changes:
#        - szbxl-getway/*

variables: #2
  DOCKER_DRIVER: overlay2
  DOCKER_HOST: tcp://192.168.3.15:2375  # docker host,本地可不寫
  DOCKER_TLS_CERTDIR: ''
#  PROFILE_ACTIVE: dev #激活屬性,dev/prod,從Gitlab的變量設置,這樣定時部署可以動態指定

# 多模塊.gitlab-ci.yml
stages:
  - monitor-package
  - monitor-dev-deploy
  - monitor-prod-deploy
  - gateway-package
  - gateway-dev-deploy
  - gateway-prod-deploy
  - userService-package
  - userService-dev-deploy
  - userService-prod-deploy
include:
  - local: szbxl-monitor/.gitlab-ci.yml
  - local: szbxl-getway/.gitlab-ci.yml
  - local: szbxl-service/szbxl-user-service/.gitlab-ci.yml

12.2.2 Spring Boot 各模塊下新建對應的.gitlab-ci.yml

image: docker:20.10.12  #2 指定使用Docker鏡像2
variables: #1
  USERSERVICE_TAG: ':1.0'  # 鏡像版本號
  USERSERVICE_NAME: szbxl-user-service #鏡像名稱
  USERSERVICE_RPORT: 802 #鏡像端口
  USERSERVICE_DIRECTORY: szbxl-service/szbxl-user-service #模塊目錄
cache: #3
  paths:
    - .m2/repository
services: #4 指定使用Docker鏡像服務
  - docker:20.10.11-dind
stages: #5 定義流水線所有的階段,多個.gitlab-ci.yml不能重名
  - userService-package
  - userService-dev-deploy
  - userService-prod-deploy
maven-package:userService: #6 多個.gitlab-ci.yml不能重名
  #image: maven:3.5-jdk-8-alpine
  image: maven:3.8-openjdk-17
  tags: #作用使用的Runner運行器的標簽列表
    - maven
  stage: userService-package #定義作業所處流水線的階段
  script:
    - mvn clean package -P $PROFILE_ACTIVE -Dmaven.test.skip=true
  artifacts:
    paths:
      - $USERSERVICE_DIRECTORY/target/*.jar
  only:
    changes:
      - szbxl-service/szbxl-user-service/.gitlab-ci.yml
build-dev:userService: #7 多個.gitlab-ci.yml不能重名
  tags:
    - docker
  stage: userService-dev-deploy
  script:
    - docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD
    - docker rm -f $USERSERVICE_NAME || true
    - docker rmi -f $CI_REGISTRY_IMAGE/$USERSERVICE_NAME-$PROFILE_ACTIVE$USERSERVICE_TAG || true
    - docker build -f $USERSERVICE_DIRECTORY/Dockerfile -t $CI_REGISTRY_IMAGE/$USERSERVICE_NAME-$PROFILE_ACTIVE$USERSERVICE_TAG .
    - docker push $CI_REGISTRY_IMAGE/$USERSERVICE_NAME-$PROFILE_ACTIVE$USERSERVICE_TAG
    - docker run -d --name $USERSERVICE_NAME -v $USERSERVICE_NAME:/apps --privileged=true -p $USERSERVICE_RPORT:$USERSERVICE_RPORT $CI_REGISTRY_IMAGE/$USERSERVICE_NAME-$PROFILE_ACTIVE$USERSERVICE_TAG
    - docker image prune -f
  only: #限制作業在什么時候創建,定義了哪些分支或標簽(branches and tags)的作業會運行
    refs: #分支
      - dev
    changes: # 下面的文件中任一文件發生改變
      - szbxl-service/szbxl-user-service/.gitlab-ci.yml
build-prod:userService:
  tags:
    - docker
  stage: userService-prod-deploy
  before_script:
    - docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD
    - docker rmi -f $CI_REGISTRY_IMAGE/$USERSERVICE_NAME-$PROFILE_ACTIVE$USERSERVICE_TAG || true
    - docker build -f $USERSERVICE_DIRECTORY/Dockerfile -t $CI_REGISTRY_IMAGE/$USERSERVICE_NAME-$PROFILE_ACTIVE$USERSERVICE_TAG .
    - docker push $CI_REGISTRY_IMAGE/$USERSERVICE_NAME-$PROFILE_ACTIVE$USERSERVICE_TAG
    - docker image prune -f
    - 'which  ssh-agent || ( yum update -y  && yum install openssh-client git -y )'
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - ssh-keyscan 192.168.3.32 >> ~/.ssh/known_hosts
    - chmod 644 ~/.ssh/known_hosts
  script:
    - ssh -tq 192.168.3.32 << EOF
    - docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD
    - docker rm -f $USERSERVICE_NAME || true
    - docker rmi -f $CI_REGISTRY_IMAGE/$USERSERVICE_NAME-$PROFILE_ACTIVE$USERSERVICE_TAG || true
    - docker run -d --name $USERSERVICE_NAME -v $USERSERVICE_NAME:/apps --privileged=true -p $USERSERVICE_RPORT:$USERSERVICE_RPORT $CI_REGISTRY_IMAGE/$USERSERVICE_NAME-$PROFILE_ACTIVE$USERSERVICE_TAG
    - docker image prune -f
    - exit
    - EOF
  only:
    variables: [ $PROFILE_ACTIVE == "prod" ]
    refs:
      - master

13、Docker遠程部署到生產服務器添加SSH Keys免密登錄

#1、生成密鑰,一路回車
ssh-keygen -t rsa -b 2048 -C "stc66@qq.com"

#2、 以下二選一,復制公鑰文件到要部署的生產服務器
ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.3.32
scp -p ~/.ssh/id_rsa.pub root@192.168.3.32:/root/.ssh/authorized_keys

#3、Gitlab_選中項目_設置_CI/CD_變量,注:取消勾選"保護變量",否則dev等其它分支無法使用
添加鍵:SSH_PRIVATE_KEY,值為id_rsa私鑰內容
添加部署環境變量:PROFILE_ACTIVE 值為:dev

#4、Gitlab_選中項目_設置_倉庫_部署令牌
輸入名稱、選擇范圍創建部署令牌(gitlab ci自動調用此用戶)

#5 Gitlab定時部署:Gitlab_選中項目_CI/CD_計划
添加變量:PROFILE_ACTIVE 值:prod
時區:選Beijing,選分支:master,描述:根據情況填寫
自定義crom: 10 3 18 1 *   具體用法:https://crontab.guru/#5_4_15_*_*

13、Gitlab Register使用

# 登錄 gitlab registry
docker login 192.168.3.15:2250

# 構建鏡像
docker build -t 192.168.3.15:2250/study/myweb:v1.0 .

# 推送鏡像
docker push 192.168.3.15:2250/study/myweb:v1.0

# 下載鏡像
docker pull 192.168.3.15:2250/study/myweb:v1.0

# 運行
docker run -d -p 5000:5000 192.168.3.15:2250/study/myweb:v1.0

14、Gitlab新建分支之后IDEA切換分支

1)項目右鍵選擇Git,從遠程Gitlab上拉取最新的分支

2)IDEA右下角上選擇:根據遠程分支新建本地分支:選擇遠程分支,直接簽出到本地或從所選分支新建本地分支;切換分支:本地分支和無程分支排在第一個的為當前分支,選中“簽出”為要切換的分支

2)更改推送分支

15、流水線啟動失敗報錯如下解決方案:

直接運用docker stop gitlab后docker start gitlab報如下錯誤

Error response from daemon: Cannot restart container gitlab: mkdir /var/lib/docker/overlay2/843ec66ca138525bce2d3fe23e26d3d184c81684236ea7b391863231a5856e75/merged: no space left on device

解決辦法:

docker system prune:命令可以用於清理磁盤,刪除關閉的容器、無用的數據卷和網絡,以及dangling鏡像(即無tag的鏡像)

再次docker-compose up -d 后再跑gitlab的流水線能正常跑了,說明是由於日志文件占用空間過多情況引起的。

 


免責聲明!

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



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