下面是Gitlab CI-CD自动化部署SpringBoot项目的方法步骤的完整攻略:
1. 搭建基础环境
在开始之前,需要确定一个服务器或者主机用于进行代码的自动化构建和部署。服务器需要安装以下软件:
- Gitlab:用于托管代码和CI-CD流程
- JDK:用于编译和运行SpringBoot项目
- Maven:用于管理和构建项目依赖
- Docker:用于打包和运行项目镜像
- Docker-Compose:用于快速启动和停止多个Docker容器
2. 配置Gitlab Repository
在Gitlab中,需要至少有一个Repository来作为代码的托管和管理。并且需要配置Deployment Token来授权CI-CD Jobs的执行。
- 创建Gitlab Repository
在左边的菜单栏中找到“New Project”按钮,点击之后跳转到新项目的创建页面。在这个页面中,可以选择创建空项目或者从模板进行创建。完成这些步骤之后,就可以在新创建的Repository中开始工作了。
- 配置Deployment Token
要配置Deployment Token,需要登录到GitLab的第1级管理面板,然后进入项目->Settings->CI/CD页面,再找到“Deploy Tokens”选项卡。
按照提示进行Token的配置,为仓库创建一个读写权限的Token,并保存好Token字符串。
3. 编译和生成Docker镜像
这个步骤包含了将SpringBoot项目编译成Jar包,然后用Jar包生成Docker镜像的流程。
-
在项目根目录下增加
.gitlab-ci.yml
文件。 -
在
.gitlab-ci.yml
文件中增加下面的代码片段:
# 编译和构建docker镜像的任务定义
build_and_push:
image: docker:stable
stage: build
services:
- docker:dind
variables:
DOCKER_DRIVER: overlay2
DOCKER_REGISTRY: "$CI_REGISTRY" # 这里的CI_REGISTRY是在Gitlab中预定义的变量,可以使用
DOCKER_NAMESPACE: "my-namespace" # 自定义的命名空间
IMAGE_NAME: "my-image" # 镜像名称
IMAGE_VERSION: "$CI_COMMIT_SHA" # 镜像版本使用当前构建的commit sha值
before_script:
# 安装Docker Compose
- apk --update add docker-compose
# 登录到Gitlab Docker Registry
- echo "$CI_JOB_TOKEN" | docker login -u "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"
script:
- mvn package -Dmaven.test.skip=true # 编译项目,生成jar包
- docker-compose build # 构建docker镜像
- docker push $DOCKER_REGISTRY/$DOCKER_NAMESPACE/$IMAGE_NAME:$IMAGE_VERSION # 推送镜像到Gitlab Registry
only:
- master # 仅在master分支提交代码时执行
上述代码实现的是将代码从Gitlab仓库中自动拉取,然后使用Maven进行构建,然后使用Docker-Compose打包生成Docker镜像,最后将Docker镜像推送到Gitlab的Registry中。
这段代码中,build_and_push
是任务的名称,image
用于指定当前任务中执行的Docker镜像,stage
用于指定任务所属的阶段,services
用于声明需要的服务,variables
定义在作业调度过程中使用的环境变量,before_script
定义了在执行任务之前的脚本,script
定义了任务要执行的命令,only
定义了仅在哪些分支执行任务。
4. 自动化部署
在上一步中,我们已经将SpringBoot项目的Jar包打包成了Docker镜像并存储到了Gitlab Registry中。在这一步中,我们就需要将这个镜像从Registry中拉取出来,部署到我们所选择的服务器、主机或者云平台上。
- 在服务器上通过SSH和Docker-Compose来部署项目镜像。
部署和启动Docker镜像最常用的方法就是使用Docker-Compose。通常情况下,可以在服务器上创建一个docker-compose.yml文件,并在其中声明所需的多个Docker应用程序。
下面是一个docker-compose.yml文件的示例:
version: '3.8'
services:
my-app:
image: registry.gitlab.com/my-namespace/my-image:${CI_COMMIT_SHA}
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
上述代码片段中,version
用于指定Compose文件的格式版本,services
用于定义所需的N个应用程序,my-app
是一个应用程序的名称,image
用于指定要执行的docker映像,ports
用于将容器端口映射到主机端口,environment
用于设置应用程序环境变量。
- 在Gitlab CI-CD中增加部署任务
配置CI-CD Jobs,定义自动化部署任务,这个任务需要:
- 编写部署脚本
- 在编写的部署脚本中拉取镜像并执行相关命令
# 自动化部署任务定义
deploy:
image: docker:stable
stage: deploy
services:
- docker:dind
variables:
DOCKER_DRIVER: overlay2
SSH_PRIVATE_KEY: "$SSH_PRIVATE_KEY" # 用于服务器SSH登录需求的私钥
DOCKER_REGISTRY: "$CI_REGISTRY" # Gitlab Registry URL
DOCKER_NAMESPACE: "my-namespace"
IMAGE_NAME: "my-image"
IMAGE_VERSION: "$CI_COMMIT_SHA"
DOCKER_COMPOSE: /usr/local/bin/docker-compose # 指定docker-compose的路径
before_script:
- apk add --no-cache openssh-client
# 解密SSH私钥,并存储到文件中
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan www.example.com >> ~/.ssh/known_hosts # 替换为部署网站的域名或IP地址
script:
- ssh -t -i "$SSH_PRIVATE_KEY" user@www.example.com "docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN"
- ssh -t -i "$SSH_PRIVATE_KEY" user@www.example.com "docker-compose pull my-service" # 拉取最新的docker镜像
- ssh -t -i "$SSH_PRIVATE_KEY" user@www.example.com "docker-compose up -d my-service" # 启动新版本的应用程序
only:
- master # 仅在master分支提交代码时执行
在上述代码片段中,deploy
是任务名称,其他部分与之前的任务定义相类似。before_script
中进行了一些准备工作,包括将SSH私钥解密、将Gitlab Registry添加到ssh known_hosts中,以及在执行脚本时,需要运行所需的其他软件包。
script
定义了任务所需的脚本。在该脚本中,使用SSH登录到通过参数提供的服务器,进行必要的操作,例如使用Docker-Compose从Gitlab的Registry中拉取镜像并启动新版本的应用程序。
在.gitlab-ci.yml
文件的底部,增加这个部署任务:
stages:
- build
- deploy
build_and_push:
# ...
deploy:
# ...
最后,提交.gitlab-ci.yml
文件到Gitlab Repository,完成自动化部署设置。
示例:
- 修改
.gitlab-ci.yml
文件,增加Push事件触发的编译任务:
image: maven:3.6.3-openjdk-8 # 定义使用的Docker镜像
stages:
- build
variables:
MAVEN_OPTS: "-Dmaven.repo.local=./.m2/repository" # 修改Maven本地仓库地址,避免新建或修改依赖被忽略
compile:
stage: build # 定义阶段
script:
- mvn clean install -DskipTests=true # 安装项目
only:
- /^release*/ # 定义触发push事件的规则,这里只处理以release开头的分支
- master
- 部署脚本示例:
#!/bin/bash
set -x
DOCKER_TAG=`git describe --tags`
STACK_NAME=web-stack
docker build -t my-namespace/web-api:$DOCKER_TAG .
# 删除旧的镜像
docker rmi $(docker images -q web-api* | uniq) || true
# 切换至主机部署目录
cd /opt
# 拉取最新的docker-compose.yml文件
git fetch origin && git reset --hard origin/master
# 部署docker服务
docker-compose --project-name=$STACK_NAME up -d web-api
在上述脚本中,首先是使用Docker编译镜像,然后删除旧版本的镜像;接着在部署脚本中,需要切换到主机上的指定目录,在该目录内使用git命令拉取最新的docker-compose.yml文件,并使用docker-compose部署新的容器,这样就完成了整个CI-CD自动化流程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Gitlab CI-CD自动化部署SpringBoot项目的方法步骤 - Python技术站