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的流水线能正常跑了,说明是由于日志文件占用空间过多情况引起的。