Gitlab CI-CD自动化部署SpringBoot项目的方法步骤

下面是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的执行。

  1. 创建Gitlab Repository

在左边的菜单栏中找到“New Project”按钮,点击之后跳转到新项目的创建页面。在这个页面中,可以选择创建空项目或者从模板进行创建。完成这些步骤之后,就可以在新创建的Repository中开始工作了。

  1. 配置Deployment Token

要配置Deployment Token,需要登录到GitLab的第1级管理面板,然后进入项目->Settings->CI/CD页面,再找到“Deploy Tokens”选项卡。

按照提示进行Token的配置,为仓库创建一个读写权限的Token,并保存好Token字符串。

3. 编译和生成Docker镜像

这个步骤包含了将SpringBoot项目编译成Jar包,然后用Jar包生成Docker镜像的流程。

  1. 在项目根目录下增加.gitlab-ci.yml文件。

  2. .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中拉取出来,部署到我们所选择的服务器、主机或者云平台上。

  1. 在服务器上通过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用于设置应用程序环境变量。

  1. 在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,完成自动化部署设置。

示例:

  1. 修改.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
  1. 部署脚本示例:
#!/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技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • varstatus属性

    varstatus属性是ASP.NET中的一个内置属性,用于获取或设置当前页面的状态。以下是varstatus属性的完整攻略: 获取或设置varstatus属性 varstatus属性是一个内置属性,用于获取或设置当前页面的状态。可以通过在页面指令中设置varstatus属性来使用它。以下是一个示例,演示如何设置varstatus属性: <%@ Pag…

    other 2023年5月7日
    00
  • docker开启mysql的binlog日志解决数据卷问题

    以下是关于如何在Docker中开启MySQL的binlog日志以解决数据卷问题的完整攻略,包含两个示例说明: 1. 配置MySQL容器 首先,创建一个MySQL容器并配置binlog日志的相关参数。可以使用以下命令创建容器: docker run -d –name mysql-container \\ -e MYSQL_ROOT_PASSWORD=your…

    other 2023年10月19日
    00
  • Android开发ListView中下拉刷新上拉加载及带列的横向滚动实现方法

    Android开发ListView中下拉刷新上拉加载及带列的横向滚动实现方法 1. 概述 ListView是Android中非常重要的控件之一,我们很多应用都会使用到它。但默认的ListView并不支持下拉刷新和上拉加载更多的功能,而且也不支持横向滚动。本文将详细介绍如何在Android开发ListView中实现下拉刷新、上拉加载和带列的横向滚动。 2. 下…

    other 2023年6月25日
    00
  • union的去重机制

    当然,我可以为您提供有关“union的去重机制”的完整攻略,以下是详细说明: 什么是union的去重机制? union的去重机制是在使用union的集合类型时,自动去重同的元素,以避免重复操作相同的元素。这个机制可以提操作效率,减少不必要的操作。 union去重机制的实现方式 union的去重机制是通过使用集合类型的特性来实现的。集合类型是一种无序、不重复的…

    other 2023年5月7日
    00
  • chromeextension扩展程序小白入门

    Chrome Extension扩展程序小白入门攻略 Chrome Extension是一种可以增强Chrome浏览器功能的扩展程序,可以用于实现各种功能,如广告拦截、网页截图、翻译等。本文将详介绍Chrome Extension的入门攻略,包括开发环境搭建、基本结构、常用API等内容,并提供两个示例说明。 开发环境搭建 Chrome Extension的开…

    other 2023年5月7日
    00
  • 提升WIFI信号强度(提高网速)的10大方法

    当需要增强WIFI信号强度从而改善网速时,以下是一些可行的方法: 方法一:重新定位路由器 路由器的位置会影响WIFI信号质量。理想的布置应使其尽可能接近您常用设备,不要放在隔板、金属箱子或其他干扰物附近。 方法二:在路由器范围内添加信号扩展器 如果您住在较大的房子中,添加信号扩展器可延伸良好的WIFI覆盖范围。但是,扩展器并不一定能增加WIFI速度,因为它只…

    other 2023年6月26日
    00
  • Jquery 在页面加载后执行的几种方式

    Jquery 在页面加载后执行有多种方式,下面详细说明一下这些方式: 监听$(document).ready() Jquery 提供了一个监听 DOM 加载完成的事件,可以使用$(document).ready()方法来处理这个事件。代码示例如下: $(document).ready(function() { // 在这里写需要执行的代码 }); 这个方法的…

    other 2023年6月25日
    00
  • java并发编程工具类PriorityBlockingQueue优先级队列

    Java并发编程工具类PriorityBlockingQueue优先级队列攻略 1. 什么是PriorityBlockingQueue? PriorityBlockingQueue是Java并发编程中的一个工具类,它是一个实现了优先级队列的无界阻塞队列。它的主要特点是:- 元素可以按照指定的优先级顺序进行排序;- 可以在多线程环境下安全地进行操作,支持并发访…

    other 2023年6月28日
    00
合作推广
合作推广
分享本页
返回顶部