十分钟完成Springboot 生产环境搭建、代码仓库安装、自动打包部署

2022-4-20 大约 11 分钟

# 十分钟完成Springboot 生产环境搭建、代码仓库安装、自动打包部署

本文登录 Linux 采用证书登录方式部署应用。如果你是Linux初学者,不熟悉 密钥的使用,可以选择密码登录方式,参考本篇文章的密码登录版本 (opens new window)

本教程以 Springboot 官方的 HelloWorld 项目为例,教你掌握Springboot项目生产环境搭建、持续集成环境搭建。

通过此教程,你将获得:

  • Gitlab 代码托管环境

  • Gitlab CI/CD 环境

  • Springboot 生产环境

  • Springboot 项目自动打包部署环境

GitLab 自动打包部署流程如下图,开发者提交代码到GitLab后,会触发编译、构建,然后部署到服务器上。

image-20220426150029370

整个过程采用 CSDN 开发云 (opens new window) 搭建,如果你仅仅想学习体验Springboot 生产环境搭建、代码仓库安装、自动打包部署,可以选择按小时计费,体验完毕后释放相关资源,花费只有几元钱

# 前期准备

SSH密钥对是一种安全便捷的登录认证方式,密钥用于登录 Linux 主机和 GitLab 自动打包部署。

创建密钥在自己的电脑上进行,可根据自己电脑的操作系统类型选择创建密钥的方式

# 创建密钥

# Windows 创建密钥

PuTTY 是一个 SSH 和 telnet 客户端,可使用它登录 Linux 主机。 PuTTY 是开源软件,提供源代码,由一群志愿者开发和支持。

PuTTYGen 用来创建密钥对。

浏览到下面开发者页面 (opens new window),下载 PuTTY 的安装程序

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
1

下载的文件,按照安装向导完成安装。

也可以从以下链接中下载 PuTTY 的64 位绿色版。绿色版下载后可直接运行,免去安装过程。

PuTTY (opens new window)

PuTTYGen (opens new window)

运行 puttygen.exe ,在 PuTTY 密钥生成器窗口中,单击 【Generate】。在灰色框中移动光标以填充绿色条。

Generating an SSH key pair in Putty.

点击【Save public key】按钮 保存公钥

点击【Save private key】按钮 保存公钥

# Linux/MacOS 创建密钥

使用ssh-keygen 生成 SSH 密钥,密钥用来登录 Linux 主机。

ssh-keygen
1

image-20220421134040207

一路回车就可以完成 创建SSH 密钥,可以看到 ~/.ssh目录下生成了 id_rsaid_rsa.pub 两个文件

image-20220421134123430

# 密钥使用场景

  • 创建主机时,创建密钥密钥内容填写id_rsa.pub 文件的内容
  • GitLab CI/CD SSH_PRIVATE_KEY 变量使用 id_rsa文件的内容

Linux/MacOS 使用cat命令查看密钥文件内容,windows 下使用type命令或写字板查看密钥文件内容

image-20220421134233886

# 准备两台主机

# 购买gitlab 主机

gitlab 主机用于托管项目代码,打包部署项目

访问云主机创建页面 (opens new window),在【镜像市场】选择【Gitlab】

image-20220420173659292

【主机规格】选择4GB/2CPU的以上配置。配置越高,支持的并发用户越多,打包构建的速度越快。gitlab 官方推荐配置是 4GB/4CPU。

注意:2GB 的主机可能安装完就卡死,访问页面一直是 502,根本无法使用。

image-20220421095339435

【登录凭证】选择您的SSH 密钥。若没有密钥,可以点击创建密钥,创建密钥时密钥内容粘贴 id_rsa.pub 文件的 内容。

image-20220420173908366

【弹性公网】选择固定带宽。带宽选择越大,打包构建的速度越快。

image-20220420174454347

如果你仅仅想体验部署过程,可以选择【按小时计费】,整个花费只有几元钱

image-20220422094739576

配置完成后,点击页面底部的【立即购买】

完成购买后,在主机列表可以看到主机的 IP 地址。这个 IP是 gitlab 主机的 ip 地址,下面的配置中会用到。

image-20220420174803254

# 购买Web 主机

Web 主机用于运行 Springboot 项目

访问云主机创建页面 (opens new window),在【镜像市场】选择【Springboot】,主机规格可选最低规格,其他配置同 gitlab 主机。

image-20220420173525974

# 配置 hosts 文件

配置本机的 hosts,文本中的ip 地址用你的主机 ip 替换。

此步骤可以跳过,以下步骤中直接使用主机的 ip 地址。

116.196.115.19 gitlab
116.198.43.123 web
1
2

# 配置 gitlab

# 修改密码

在浏览器地址栏输入 http://gitlab ,访问 上一步购买的gitlab 主机。若访问 gitlab 页面上出现502错误,说明 gitlab 服务正在初始化服务,请稍后再试。

image-20220420150739878

输入用户名 root ,密码 H9ZjJo8jmb1p+2FAEJiA1Mv/ODHyj7JmGpe7joeGiJU=,点击 【Sign in】

成功登录系统后,为了系统安全。请访问 http://gitlab/-/profile/password/edit 修改密码。

# HelloWorld 项目代码托管

本次演示的 Springboot HelloWorld 项目,来自 spring 官网教程,是最简单的 Springboot Web 项目,适合初学者入门 Springboot。查看教程地址点击这里 (opens new window)

代码仓库托管在 github (opens new window) 上,由于有些时候访问 github 速度比较慢,我们将项目 clone 到了 gitcode (opens new window)

代码仓库的地址是

https://gitcode.net/hjue/gs-spring-boot.git
1

# 新建项目gs-spring-boot

点击页面顶部的➕,选择 【新建项目/仓库】

image-20220420152216735

选择【导入项目】

image-20220420152315015

选择 【从 URL 导入仓库】

image-20220420152401985

Git 仓库URL 中输入 https://gitcode.net/hjue/gs-spring-boot.git ,拖动到页面底部,点击【新建项目】

image-20220420152650704

等待不足 1 分钟的时间,即可看到项目主页。

# 项目代码打包部署

# 配置部署变量

接下来我们进行项目的配置

image-20220420152937793

点击左侧边栏菜单的【设置】-> 【CI/CD】

image-20220420153137426

点击【变量】->【添加变量】

image-20220420153251700

键输入 SSH_PRIVATE_KEY ,值 粘贴访问服务器的私钥,点击【添加变量】。私钥是文件 id_rsa 的内容。

image-20220420153416290

按照上面的步骤添加APP_HOST变量。键输入APP_HOST,值输入你 Web 服务器的 IP 地址

image-20220420153846704

完成变量添加后,页面显示如下

image-20220420153945016

# 添加部署脚本

点击左上角项目名称跳转到项目首页

image-20220420154147626

# 创建web部署服务配置

点击➕,选择【新建文件】

image-20220420154351797

文件名 .gitlab-ci/hello-world.service ,内容粘贴以下内容。注意检查文件名末尾不要有空格。

[Unit]
Description=hello-world
After=syslog.target

[Service]
User=root
ExecStart=/usr/local/apps/hello-world/run.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
1
2
3
4
5
6
7
8
9
10
11
12

image-20220420154732824

滚动到页面底部,点击【Commit changes】。可以看到文件创建成功。

image-20220420154922649

# 创建运行 springboot 项目脚本

重新回到项目首页,再次添加文件.gitlab-ci/run.sh

文件内容如下:

#!/bin/bash
cd /usr/local/apps/hello-world
java -jar hello-world.jar
1
2
3

image-20220420155211810

# 添加持续集成配置

添加文件 .gitlab-ci.yml,文件内容如下:

stages:
  - build
  - deploy
  
maven-build:
  image: maven:3-jdk-8
  stage: build
  script: 
    - cd complete
    - mvn clean package -B -Dmaven.test.skip=true
  artifacts:
    paths:
      - complete/target/*.jar

production:
  image: maven:3-jdk-8
  stage: deploy
  before_script:
    - 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )'
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" >> ~/.ssh/config'  
  script:
    # 在 web 服务器上创建应用目录
    - ssh root@$APP_HOST "[[ -d /usr/local/apps/hello-world ]] || { mkdir -p /usr/local/apps/hello-world; }"
    # 将应用部署启动脚本到 web 服务器上
    - cat .gitlab-ci/run.sh | ssh root@$APP_HOST "cat > /usr/local/apps/hello-world/run.sh; chmod +x /usr/local/apps/hello-world/run.sh"
    # 复制 jar 文件到服务器
    - scp complete/target/spring-boot-complete-0.0.1-SNAPSHOT.jar root@$APP_HOST:/usr/local/apps/hello-world/hello-world.jar
    # 部署应用为系统服务
    - cat .gitlab-ci/hello-world.service | ssh root@$APP_HOST "cat > ./hello-world.service "
    - ssh root@$APP_HOST "[[ -f /etc/systemd/system/hello-world.service ]] || { mv ./hello-world.service /etc/systemd/system/hello-world.service && systemctl daemon-reload && systemctl enable hello-world.service; }"
    - ssh root@$APP_HOST "[[ -f ./hello-world.service ]] && { rm ./hello-world.service; }"
    # 重启应用服务
    - ssh root@$APP_HOST "systemctl restart hello-world"
    # 查看服务状态
    - ssh root@$APP_HOST "systemctl status hello-world"
  only:
  - main

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

文件创建成功后,回到项目首页。可以看到项目正在构建。

第一次构建比较慢,大概需要 20 分钟左右,构建的速度和你 gitlab 主机的配置及带宽相关。

点击这个【流水线状态按钮】查看项目构建的进度和构建的日志。

image-20220420160248100

在流水线页面,点击【运行中】按钮,查看流水线的工作情况

image-20220420162809047

点击 构建的作业,可查看构建的日志。从图中可以看到 maven-build 已经成功运行完成。production 任务正在运行中。

image-20220420163101751

最后,在流水线页面,可看到项目部署成功。此次构建用时 8 分钟。

image-20220420170758651

# 查看部署结果

项目构建成功后,打开浏览器,访问 http://web,页面显示如下内容,表示项目部署成功

image-20220421164832019

至此,完成了代码仓库建立、Springboot 运行环境搭建、项目打包部署的这个过程。

你可以通过 Gitlab 的 WebIDE 修改代码,提交后项目会自动打包部署。

# 修改代码体验自动部署

编辑项目代码文件HelloController.java (opens new window),修改 index方法返回的字符串

image-20220421164645192

我将字符串"Greetings from Spring Boot and GitLab!"改为 "Greetings from Spring Boot and GitLab!",提交修改后,gitlab 会自动开发打包并重新部署应用。

流水线运行完毕后,访问 web 服务器,可以看到首页内容已经变为"Greetings from Spring Boot and GitLab!"

image-20220421165420229

同样,在本地修改代码,push到 gitlab 代码仓库,也会触发 gitlab 流水线。

至此,我们已经完成了 SpringBoot 生产环境搭建、代码仓库安装、自动打包部署。

若你的项目是前端后分离的项目,可以参考【若依管理系统(前后端分离版)部署】 (opens new window)

CSDN 开发云,致力于帮助开发者让开发、代码发布、部署更简单。

# FAQ

# 作业运行错误 Could not resolve host

fatal: unable to access 'http://2c722bd81d95/root/gs-spring-boot.git/': Could not resolve host: 2c722bd81d95
ERROR: Job failed: exit code 1
1
2

image-20220421152451050

原因是未设置 gitlab 的 external_url 参数,可参考 修改GitLab的服务地址 (opens new window) 进行设置

# 密钥配置错误

image-20220420160844264

出现上面错误,表示 CI/CD 变量 SSH_PRIVATE_KEY 设置错误。请参考文档重新设置私钥

git clone https://github.com/spring-guides/gs-spring-boot.git

cd gs-spring-boot/complete/

mvn clean package -Dmaven.test.skip=true
1
2
3
4
5

# 如何手动进行项目构建

点击左侧菜单【CI/CD】-> 【流水线】,进入流水线页面后,点击页面右侧的【运行流水线】按钮,进入运行流水线页面,点击【运行流水线】

image-20220420161200778