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的流水線能正常跑了,說明是由於日志文件占用空間過多情況引起的。