简介

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

浏览器上查看:

部署完成!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐