GitHub Actions 自动化部署 SpringBoot 应用到云服务器
简介
CI/CD 是现代软件工程的核心实践,它通过高度自动化,实现快速、可靠且频繁的软件交付。它不是一个单一的工具,而是一套包含理念、流程和工具的完整体系。
简单来说,CI/CD 是一条连接 “代码提交” 到 “用户使用” 的自动化高速公路,目标是让软件发布变得像流水线一样顺畅、高效。
https://github.com/actions:这里面存放的是官方写好的一些action
https://github.com/marketplace?type=actions:这里面可以搜索到社区里其他人开发的action
uses: sayyid5416/pyinstaller@v1:引用别人的action就是这样,写一个uses的标签,后面写上作者的名字/action的名字@版本号
云服务器里设置
GitHub Actions 的 runner 运行在 GitHub 的云端数据中心(公网),无法连接到你的虚拟机内网,解决办法是买云服务器
做cicd实战,把java项目于打成jar包,然后自动推送到服务器上完成部署虚拟机,需要设置密钥,这是整个自动化部署流程安全可靠的核心前提。 使用SSH密钥对(而非密码)进行认证,是服务器远程自动化管理的标准安全实践。
简单来说,你需要为GitHub Actions提供一把“私钥”,并为你的服务器配置对应的“公钥”。这样,Actions就能像一名被你授权的管理员一样,安全地登录服务器并执行部署命令。
服务器设置成密钥登录
ssh-keygen -m PEM -t rsa -b 4096
命令参数详解
| 参数 | 全称/含义 | 作用解释 |
|---|---|---|
ssh-keygen |
SSH Key Generator | SSH密钥对生成工具的核心命令。 |
-m PEM |
Format: PEM | 指定密钥的存储格式为 PEM。这是一种传统且兼容性极广的格式(文件头为 -----BEGIN RSA PRIVATE KEY-----),被许多旧版工具和系统广泛支持。 |
-t rsa |
Type: RSA | 指定密钥的算法类型为 RSA。这是目前最主流、支持最广泛的非对称加密算法。 |
-b 4096 |
Bits: 4096 | 指定密钥的长度为 4096位。位數越大,密钥越安全(但生成和使用时略慢)。4096位是当前推荐的高安全标准,2048位是目前的最低安全标准。 |

/root/.ssh/id_rsa:私钥 /root/.ssh/id_rsa.pub:公钥
私钥:是你的唯一身份凭证,等同于最高权限的密码。必须严格保密,只保存在发起连接的一方(对于您,就是 GitHub Actions)。
公钥:是可以公开的“锁芯”,放在被连接的一方(您的虚拟机服务器)的 authorized_keys 文件里。
正确流程是:GitHub Actions 拿着私钥来“开锁”,服务器用公钥验证。如果匹配,就允许访问。
后续操作:执行此命令后,您仍然需要:
-
在服务器上:将生成的公钥(默认在
~/.ssh/id_rsa.pub)内容添加到~/.ssh/authorized_keys文件中。 -
在GitHub上:将生成的私钥(默认在
~/.ssh/id_rsa)的全部内容,保存为仓库的Secret(如SERVER_SSH_PRIVATE_KEY)。
# 1. 将公钥内容追加到 authorized_keys 文件末尾 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
把部署目录创建出来:

在虚拟机上安装java:
搜索可用的 JDK 版本:
dnf search openjdk
在 Rocky Linux 9.6 上安装 JDK 17(完整的开发环境):
yum -y install java-17-openjdk-devel
建议安装这个:java-17-openjdk-devel,包含 完整的JDK开发套件。既有 java 命令,也有 javac 编译器和其他工具。

服务器这端就准备完成了
在idea写.yml文件
将GitHub Actions工作流文件(.yml或.yaml)放在 .github/workflows/ 目录下,是 GitHub官方平台的硬性规定和约定。这不是一个可选的配置,而是平台识别并运行自动化的唯一指定位置。
pom.xml文件里:
skip那一条删了。
<skip>true</skip> 这个配置导致:
- Maven 构建时跳过了
spring-boot-maven-plugin的执行 - 生成的是普通的 JAR 文件,不是可执行的 Spring Boot JAR
- 缺少
Main-Class属性,导致no main manifest attribute错误
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.haha.ActionPractiseApplication</mainClass>
<!-- 删除或修改下面这行 -->
<skip>false</skip> <!-- 改为 false 或直接删除这行 -->
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>

maven.xml(工作流文件)(加注释版):
---
# 工作流的名称,在 GitHub Actions 页面显示
name: java CI with maven
# 定义触发此工作流的事件
on:
# 当发生推送 (push) 事件时触发
push:
# 仅当推送到 'master' 分支时触发
branches:
- master
# 当发生拉取请求 (pull_request) 事件时触发
pull_request:
# 仅当目标是 'main' 分支时触发
branches:
- main
# 工作流包含一个或多个作业 (jobs)
jobs:
# 定义一个名为 "build" 的作业
build:
# 作业的显示名称
name: action-practice04
# 指定作业运行在 GitHub 托管的 Ubuntu 最新版环境
runs-on: ubuntu-latest
# 作业按顺序执行的步骤 (steps)
steps:
# 步骤1:检出代码到工作流运行器
- name: Checkout code
# 使用官方 checkout Action 的 v5 版本
uses: actions/checkout@v5
# 步骤2:设置 Java 开发环境
- name: Set up JDK17
uses: actions/setup-java@v5
with: # 传递给 Action 的参数
distribution: 'temurin' # JDK 发行版,Temurin 是推荐的免费发行版
java-version: '17' # 指定安装的 Java 主版本
cache: maven # 启用 Maven 依赖缓存,加速后续构建
# 步骤3:使用 Maven 进行项目构建和打包
- name: Build with Maven
# 直接运行 shell 命令
run: mvn -B clean package --file pom.xml
# 命令详解:
# -B (--batch-mode): 批处理模式,减少日志输出
# clean: 清理 target 目录
# package: 编译并打包项目
# --file pom.xml: 指定使用的 POM 文件 (可省略)
# 步骤4:将构建产物部署到远程服务器
- name: Deploy to Server
# 使用社区开发的 SSH 部署 Action
uses: easingthemes/ssh-deploy@main
with:
# 用于 SSH 认证的私钥,应从 GitHub 仓库的 Secrets 中读取
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
# 要上传的本地文件路径(构建产物)
SOURCE: "target/action-practise-0.0.1-SNAPSHOT.jar"
# 远程服务器的公网 IP 地址
REMOTE_HOST: 8.155.164.6
# SSH 登录用户名
REMOTE_USER: root
# 远程服务器上的目标路径和文件名
TARGET: /root/springboot/github-actions.jar
# 文件传输成功后,在远程服务器上执行的命令
SCRIPT_AFTER: |
cd /root/springboot # 切换到部署目录
# 停止正在运行的旧服务进程,`|| true` 确保即使进程不存在命令也不会失败
pkill -f 'java -jar /root/springboot/github-actions.jar' || true
# 以后台方式启动新服务,并将日志输出到 app.log 文件
nohup java -jar /root/springboot/github-actions.jar > app.log 2>&1 &
在github仓库里配置SSH_PRIVATE_KEY
在远程连接工具里查看私钥并复杂进github的仓库机密


提交到master分支并触发自动执行
点commit and push

返回github,查看master分支的action


回远程连接工具查看:

成功,进程也运行起来了
我一开始在idea里写了一个HelloController

浏览器上查看:

部署完成!
更多推荐



所有评论(0)