
基于GitLab的CICD示例(springboot+docker+远程部署)
本文旨在做一个示例。既方便需要的朋友快速使用也为留存后用,其中可能有冗余的代码敬请谅解。
本文旨在做一个示例。既方便需要的朋友快速使用也为留存后用,其中可能有冗余的代码敬请谅解。
环境
debian 12.6.0
docker 27.0.3
gitlab 17.1
gitlab-runner 14.1.0
阿里云个人镜像仓库
CICD服务器A 部署(docker + gitlab +gitlabrunner)
应用服务器B 部署(docker)
一、安装docker
debian12的linux环境下离线安装docker_debian12安装docker-CSDN博客
根据这两篇文章进行操作可以解决debian下docker的安装
二、准备镜像
dockerhub以及国内镜像仓库的问题造成直接docker pull时无法运行;
参照网上的方法 使用Github Action将国外的Docker镜像转存到阿里云私有仓库
三、部署gitlab CICD
1.运行gitlab-ce
镜像地址记得替换
docker run -d \
-p 4430:443 -p 8000:8000 -p 220:22 \
--name gitlab \
-v /opt/gitlab/config:/etc/gitlab \
-v /opt/gitlab/logs:/var/log/gitlab \
-v /opt/gitlab/data:/var/opt/gitlab \
-v /etc/localtime:/etc/localtime \
registry.cn-hangzhou.aliyuncs.com/slayers/gitlab/gitlab-ce:latest
更改配置
# 编辑gitlab.rb文件,修改以下几个配置的值:
vi /opt/gitlab/config/gitlab.rb
# 配置http协议所使用的访问地址,端口为上述docker run中配置的端口800
external_url 'http://172.29.27.116:8000'
# 配置ssh协议所使用的访问地址和端口(端口为上述docker run中配置的端口220)
gitlab_rails['gitlab_ssh_host'] = '172.29.27.116'
gitlab_rails['gitlab_shell_ssh_port'] = 220
#1.重置root密码之前,需先使用root用户登录到gitlab所在服务器(容器内部)。
docker exec -it gitlab bash
#2.启动Ruby on Rails控制台。
gitlab-rails console -e production
#3.查找用户 root 默认id:1
user = User.where(id: 1).first
#4.更改密码。
user.password = '新密码'
user.password_confirmation = '新密码'
user.save
2.运行gitlab-runner
docker run -d --name gitlab-runner \
--restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /root/.m2:/root/.m2 \
registry.cn-hangzhou.aliyuncs.com/slayers/gitlab-runner:v14.1.0
检查日志出现一下错误提示时 表示需要配置runner
3.配置gitlab-runner
按照标号点击进入
获取到需要的命令,前往gitlab-runner中注册,我选的docker作为执行器
注册成功
修改/opt/gitlab-runner/config/config.toml
四、准备测试项目
1.生成springboot测试项目
只有一个简单的请求API
2、上传项目至gitlab仓库中
3.编写Dockerfile
FROM openjdk:22
MAINTAINER slayers
# setting time zone
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
ARG JAR_FILE
COPY ${JAR_FILE} /usr/local/app.jar
EXPOSE 8080
ENV JAVA_OPTS=$JAVA_OPTS
ENTRYPOINT ["sh","-c","java $JAVA_OPTS -jar /usr/local/app.jar"]
五、编写CICD脚本 .gitlab-ci.yml
因使用docker作为执行器,每次都会拉取镜像进行构建因此存在以下问题:
1)maven的仓库地址需要指向阿里云
解决办法自己重新构建一个仓库是阿里云的镜像
Dockerfile
FROM maven:3.9.8-sapmachine-22
COPY settings.xml /usr/share/maven/conf/settings.xml
settings.xml
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository/>
<interactiveMode/>
<usePluginRegistry/>
<offline/>
<pluginGroups/>
<servers/>
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<mirror>
<id>repo1</id>
<mirrorOf>central</mirrorOf>
<name>central repo</name>
<url>http://repo1.maven.org/maven2/</url>
</mirror>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>apache snapshots</mirrorOf>
<name>阿里云阿帕奇仓库</name>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
</mirror>
</mirrors>
<proxies/>
<activeProfiles/>
<profiles>
<profile>
<repositories>
<repository>
<id>aliyunmaven</id>
<name>aliyunmaven</name>
<url>https://maven.aliyun.com/repository/public</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>MavenCentral</id>
<url>http://repo1.maven.org/maven2/</url>
</repository>
<repository>
<id>aliyunmavenApache</id>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
</repository>
</repositories>
</profile>
</profiles>
</settings>
docker build -t maven:3.9.8-sapmachine-22-ali .
2)生成docker镜像后需要上传至私有仓库中,此时需要鉴权
解决办法 预先生成鉴权信息 然后每次执行前生成鉴权文件
鉴权信息
{"auths": {"registry.cn-hangzhou.aliyuncs.com": {"auth": "XXXXXXXXXXXXXXX"}}}
配置gitlab参数 按照标号进入
脚本使用示例
service-docker-build:
stage: build
variables:
DOCKER_IMAGE: docker:27.0.3
DIND_IMAGE: $DOCKER_IMAGE-dind
image: $DOCKER_IMAGE
services:
- name: $DIND_IMAGE
alias: docker
script:
- mkdir -p $HOME/.docker
- echo $DOCKER_AUTH_CONFIG > $HOME/.docker/config.json
- docker build --build-arg JAR_FILE=./target/hello-0.0.1-SNAPSHOT.jar -t hello:${CI_PIPELINE_ID} .
- docker tag hello:${CI_PIPELINE_ID} registry.cn-hangzhou.aliyuncs.com/slayers/hello:${CI_PIPELINE_ID}
- docker push registry.cn-hangzhou.aliyuncs.com/slayers/hello:${CI_PIPELINE_ID}
3)部署远程服务器时需要SSH证书连接
解决办法:生成的私钥放入gitlab 连接时生成使用
生成证书
ssh-keygen -t ed25519 -C "XXXXX@qq.com"
复制证书参照下面文章处理,分了 root与非root的情况
linux配置ssh免密码登录(root用户和非root用户)_ssh 免密 root到非root-CSDN博客
配置gitlab参数
脚本示例
service-ssh-deploy:
stage: deploy
image: testcontainers/sshd
before_script:
- 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- echo "$NOTE_PAD_SSH" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan 192.168.0.103 > ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
script:
- ssh slayers@192.168.0.103 "docker rm -f hello-app"
- ssh slayers@192.168.0.103 "docker run -d -p 8080:8080 --name hello-app registry.cn-hangzhou.aliyuncs.com/slayers/hello:${CI_PIPELINE_ID}"
六、完整脚本
脚本还需优化,但总体能够使用见谅
stages:
- install
- package
- build
- deploy
variables:
MAVEN_OPTS: "-Dmaven.repo.local=/root/.m2"
default:
tags:
- test
.service-job-config:
image: maven:3.9.8-sapmachine-22-ali
before_script:
- cd /builds/slayers/hello
cache:
key: hello-ci-cache
paths:
- $CI_PROJECT_DIR/.m2/
- /builds/slayers/hello/target/*.jar
service-install:
stage: install
extends: [.service-job-config]
script:
- mvn install
cache:
key: hello-ci-cache
paths:
- $CI_PROJECT_DIR/.m2/
- /builds/slayers/hello/target/*.jar
service-package:
stage: package
extends: [.service-job-config]
script:
- mvn clean package -Dmaven.test.skip=true
service-docker-build:
stage: build
extends: [.service-job-config]
variables:
DOCKER_IMAGE: docker:27.0.3
DIND_IMAGE: $DOCKER_IMAGE-dind
image: $DOCKER_IMAGE
services:
- name: $DIND_IMAGE
alias: docker
script:
- mkdir -p $HOME/.docker
- echo $DOCKER_AUTH_CONFIG > $HOME/.docker/config.json
- docker build --build-arg JAR_FILE=./target/hello-0.0.1-SNAPSHOT.jar -t hello:${CI_PIPELINE_ID} .
- docker tag hello:${CI_PIPELINE_ID} registry.cn-hangzhou.aliyuncs.com/slayers/hello:${CI_PIPELINE_ID}
- docker push registry.cn-hangzhou.aliyuncs.com/slayers/hello:${CI_PIPELINE_ID}
service-ssh-deploy:
stage: deploy
image: testcontainers/sshd
before_script:
- 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- echo "$NOTE_PAD_SSH" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan 192.168.0.103 > ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
script:
- ssh slayers@192.168.0.103 "docker rm -f hello-app"
- ssh slayers@192.168.0.103 "docker run -d -p 8080:8080 --name hello-app registry.cn-hangzhou.aliyuncs.com/slayers/hello:${CI_PIPELINE_ID}"
七、自动构建
提交代码之后,gitlab-runner就开始自动构建
八、测试
更多推荐
所有评论(0)