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