使用CI/CD部署后端项目(gin)

写在前面:使用CI/CD部署gin项目到服务器中

前端可以参考:使用CI/CD部署nextjs项目

使用 GitHub Actions 配置后端 CI/CD(含部署到服务器)

本文档介绍如何在 GitHub 仓库中配置 CI/CD,将 PROJECT_NAME 项目自动构建并部署到你的服务器。文末附有经过注释的 deploy.yml 工作流示例(已去除敏感信息,仅引用 Secrets 名称)。

前置条件

  • 服务器已安装 Docker 与 Docker Compose(插件)。
  • 服务器具备 SSH 访问能力(账号、密码或密钥)。
  • 服务器目标目录可写,例如:/opt/PROJECT_NAME
  • 域名/反向代理(可选):若通过 Nginx 暴露 443/80 端口,需提前配置好。

仓库 Secrets 与变量配置

在 GitHub 仓库中添加以下 Secrets(路径:Repository → Settings → Secrets and variables → Actions → New repository secret):

  • CONFIG_YAML_PROD:生产环境配置文件内容(完整的 configs/config.prod.yaml 文本)。
  • SSH_HOST:服务器 IP 或域名。
  • SSH_PORT:SSH 端口(通常是 22)。
  • SSH_USER:SSH 用户名(如 root)。
  • SSH_PASSWORD:SSH 密码(若使用私钥方式,可改用 key 形式的 action)。
  • REMOTE_PATH:服务器部署目录,例如 /opt/jump3-end-v2

说明:敏感值一律存放在 Secrets 中,不要提交到仓库。

工作流触发策略

示例工作流在 push 到 main 分支时触发。你也可以按需改成手动触发或仅在打 tag 时触发。

环境选择与配置文件

  • 代码中已支持 APP_ENVCONFIG_PATH 两种方式选择配置文件。
  • 本示例将容器环境固定为 APP_ENV=prod,并通过 Secrets 注入生成 configs/config.prod.yaml
  • 如果你需要 Dev/Staging 环境,建议为每个环境建立独立的 Environment 与 Secrets,并复制一份 workflow,或使用 environment: 切换。

工作流主要步骤

  1. 检出代码。
  2. 设置 Buildx 并构建 Docker 镜像(linux/amd64),导出为 your-project-server.tar
  3. CONFIG_YAML_PROD 写入 configs/config.prod.yaml(同时拷贝一份到 configs/config.dev.yaml 以兜底)。
  4. 通过 SCP 上传 your-project-server.tardocker-compose.yml 与配置文件到服务器的 REMOTE_PATH
  5. 通过 SSH 在服务器上执行:
    • docker compose down
    • docker load < jump3-server.tar
    • docker compose up -d
    • 简单健康检查

故障排查建议

  • 上传报错 tar: empty archive:确认 SCP action 的 source 传参为逗号分隔单行,并确保前面步骤确实生成了文件。
  • 权限问题:确保服务器目标目录存在且可写;日志目录 logs 可设为 chmod 777 logs
  • 镜像平台:若服务器为 amd64,构建需加 --platform linux/amd64
  • 端口/防火墙:确认 8080 或反代端口已放行。
  • 环境变量:生产强制 APP_ENV=prod,避免默认 dev。

deploy.yml(带注释,敏感信息由 Secrets 提供)

name: Deployon:push:branches: [ main ]            # 推送到 main 分支时触发jobs:deploy:runs-on: ubuntu-lateststeps:- name: Checkoutuses: actions/checkout@v4- name: Set up Docker Buildxuses: docker/setup-buildx-action@v3- name: Build docker image (linux/amd64)run: |docker build --platform linux/amd64 -t your-project-server:latest .  # 构建镜像(将 your-project 替换为你的项目名)docker save your-project-server:latest > your-project-server.tar     # 导出镜像- name: Prepare config files from secretshell: bashrun: |mkdir -p configs# 将机密里的生产配置写入文件printf "%s" "$CONFIG_YAML" > configs/config.prod.yaml# 同步一份为 dev 以兜底(容器内默认 dev 时也能跑)cp configs/config.prod.yaml configs/config.dev.yamlenv:CONFIG_YAML: ${{ secrets.CONFIG_YAML_PROD }}  # 从 Secrets 注入完整 YAML 文本- name: Upload files to server (image, compose, configs)uses: appleboy/scp-action@v0.1.7with:host: ${{ secrets.SSH_HOST }}                 # 服务器地址(来自 Secrets)username: ${{ secrets.SSH_USER }}             # SSH 用户password: ${{ secrets.SSH_PASSWORD }}         # SSH 密码port: ${{ secrets.SSH_PORT }}                 # SSH 端口source: "your-project-server.tar,docker-compose.yml,configs/config.prod.yaml,configs/config.dev.yaml"  # 逗号分隔target: ${{ secrets.REMOTE_PATH }}            # 服务器目录overwrite: true                               # 覆盖同名文件- name: Deploy on server via SSHuses: appleboy/ssh-action@v1.2.0with:host: ${{ secrets.SSH_HOST }}username: ${{ secrets.SSH_USER }}password: ${{ secrets.SSH_PASSWORD }}port: ${{ secrets.SSH_PORT }}script: |set -euo pipefailcd ${{ secrets.REMOTE_PATH }}mkdir -p configs logschmod 777 logs || true# 先下线旧容器再加载新镜像并启动docker compose down || truedocker load < your-project-server.tardocker compose up -d# 简易健康检查(可按需替换为 curl https://.../health)docker compose pscurl -sf http://127.0.0.1:8080/health || true

与 docker-compose.yml 的配合

当前 docker-compose.yml 中推荐包含以下内容,固定生产环境并授权日志目录(将镜像名、容器名替换为 PROJECT_NAME):

services:api:image: your-project-server:latestcontainer_name: your-project-apiports:- "8080:8080"environment:- GIN_MODE=release- APP_ENV=prod               # 固定使用生产配置volumes:- ./configs:/app/configs:ro  # 将服务器上的配置目录挂载到容器- ./logs:/app/logsuser: "0:0"restart: unless-stoppedhealthcheck:test: ["CMD", "curl", "-f", "http://localhost:8080/health"]interval: 30stimeout: 10sretries: 3start_period: 40s

小结

  • 将敏感配置放入 GitHub Secrets,流水线运行时再渲染成文件。
  • 通过 SCP/SSH 将镜像与配置投递到服务器,并用 Docker Compose 管理生命周期。
  • 若有多环境,复制工作流并切换 Secrets 或使用 GitHub Environments 管理。
  • 如要查看调试信息,到github对应项目下的Actions中即可查看、排错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921482.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Coze添加知识库解析的Embedding和PaddleOCR模型配置

1. Embedding模型配置 使用ollama模型&#xff0c;导入qwen3的embedding-8B模型&#xff0c;导入流程参考&#xff1a; Ollama离线部署模型 qwen3-Embedding模型文件可从魔塔社区下载&#xff1a; Qwen3-Embedding-8B 1.2 Coze配置 在coze_studio/docker目录下输入: vim .en…

02-Media-6-rtsp_server.py 使用RTSP服务器流式传输H264和H265编码视频和音频的示例程序

rtsp_server.py 是使用k230的板载摄像头和WIFI联网功能,使用RTSP服务器流式传输视频和音频的程序示例。程序核心是创建了一个RtspServer类,该类用于初始化、启动、停止RTSP服务器,并进行视频和音频的流传输。 一、首先,程序导入必要的模块,包括视频编码、传感器、媒体处理…

13-Java-面向对象-封装和this关键字

文章目录封装this关键字封装 告诉我们&#xff0c;如何正确设计对象的属性和方法。原则&#xff1a;对象代表什么&#xff0c;就得封装对应的数据&#xff0c;并提供数据对应的行为 package common;/*** Author: 大海* Date: 2025-09-06*/public class GirlFriend {/*private…

三高项目-缓存设计

三高项目-缓存设计 分流、并发 导流&#xff1a;将原本复杂操作的请求&#xff0c;引导到简单的操作上。以后再来查&#xff0c;不需要经过复杂的计算。 成本&#xff1a;空间&#xff0c;收益&#xff1a;节省了时间。 不要以为仅仅是 redis&#xff0c;map等。 对应。kv…

happen-before原则

什么是 happen-before 原则&#xff1f; happen-before 是一个逻辑关系&#xff0c;用于描述两个操作之间的 “先后顺序”—— 如果操作 A happen-before 操作 B&#xff0c;那么 A 的执行结果必须对 B 可见&#xff0c;且 A 的执行顺序在逻辑上先于 B。也就是保证指令有序性和…

4.1 机器学习 - 评估指标

模型评估是判断 “模型是否有效” 的核心环节&#xff0c;需结合任务类型&#xff08;分类 / 回归&#xff09;、数据分布&#xff08;如类别不平衡&#xff09;和商业目标选择指标。本节聚焦分类任务的核心评估指标&#xff0c;从定义、计算逻辑到适用场景逐一拆解&#xff0c…

雅菲奥朗SRE知识墙分享(七):『可观测性的定义与实践』

在分布式系统日益复杂的当下&#xff0c;故障不再是“是否发生”&#xff0c;而是“何时爆发”。SRE可观测性正是应对不确定性的“显微镜”与“导航仪”&#xff1a;通过指标、日志、追踪三大数据血脉&#xff0c;实时外化系统黑盒&#xff0c;让每一次抖动、每一行报错、每一次…

C++ 详细讲解vector类

目录 1. 什么是vector? 2. vector的使用 1. 构造函数---初始化 1. 默认构造函数(无参构造&#xff09; 2. 填充构造函数(指定数量和初始值&#xff09; 3. 范围构造函数(通过迭代器拷贝其他容器元素&#xff09; 4. 拷贝构造函数(直接拷贝另一个vector&#xff09; 注…

Windows Server2012 R2 安装.NET Framework 3.5

Windows Server2012 R2 安装.NET Framework 3.5 虚拟机系统是Windowsserver 2012R2&#xff0c;在安装SQlserver2012时候警告未安装.NET Framework 3.5。于是找了个.NET Framework 3.5的安装包&#xff0c;但是由于系统原因无法正常安装。按照提示从控制面板-程序-启动或关闭Wi…

IDEA中Transaction翻译插件无法使用,重新配置Transaction插件方法

原因 由于Transaction默认的翻译引擎为谷歌翻译&#xff0c;由于一些原因&#xff0c;这个翻译无法使用&#xff0c;因此导致插件无法使用。 解决办法 更换Transaction插件翻译引擎即可。 方法步骤 1.进入Idea的设置里&#xff0c;找到Tool下的Transaction选项2.更改翻译引擎&a…

外置flash提示音打包脚本

批处理脚本说明文档 - 音频资源打包与分发 一、脚本功能概述 本批处理脚本&#xff08;.bat 文件&#xff09;用于将指定目录下的多个音频文件&#xff08;.wtg 和 .mp3 格式&#xff09;打包为音频资源配置文件&#xff08;tone.cfg&#xff09;&#xff0c;进一步将配置文件与…

Go语言设计模式(三)抽象工厂模式

抽象工厂模式与工厂模式类似,被认为是工厂方法模式的另一层抽象.抽象工厂模式围绕创建其他工厂的超级工厂工作.1.角色:1.1抽象产品:构成产品系列的一组不同但相关的产品的声明接口.1.2具体产品:实现抽象产品接口的类,主要用于定义产品对象,由相应的具体工厂创建.1.3抽象工厂:创…

大狗王 DG1+ 13.6G矿机详细参数解析与性能评测

近年来&#xff0c;随着加密货币挖矿行业的不断发展&#xff0c;越来越多的矿机厂商推出了高性能、低功耗的矿机设备。大狗王&#xff08;DG1&#xff09;13.6G矿机便是其中一款备受关注的设备&#xff0c;特别是在LTC&#xff08;莱特币&#xff09;、Doge&#xff08;狗狗币&…

Python 算术运算练习题

计算数字特征值题目描述 编写一个程序&#xff0c;接收用户输入的两个整数 a 和 b&#xff08;a > b > 0&#xff09;&#xff0c;计算并输出以下结果&#xff1a;a 与 b 的和的平方a 除以 b 的商和余数a 与 b 的平均数&#xff08;保留 2 位小数&#xff09;示例请输入整…

OS项目构建效能改进策划方案

一、现状分析与问题定位构建稳定性问题&#xff1a; 表现&#xff1a;非代码变更引发的构建失败&#xff08;如环境依赖、工具链版本、第三方库更新、资源竞争等&#xff09;“幽灵构建”时有发生。影响&#xff1a;严重破坏开发流程的顺畅性&#xff0c;耗费大量开发/测试人员…

Ai8051 2.4寸320*240 ILI9341 I8080接口驱动

/*---------------------------------------------------------------------*/ /* --- Web: www.STCAI.com ---------------------------------------------*/ /* 液晶屏驱动程序参考wiki技术网站提供的开源源码&#xff0c;仅供学习使用 */ /*----------------------…

最大似然估计:损失函数的底层数学原理

引言当你第一次看到线性回归时&#xff0c;你是否注意到了作为参数优化关键的损失函数&#xff08;均方损失&#xff09;&#xff0c;你是否能够理解它的本质和由来。其实&#xff0c;在我第一次接触时&#xff0c;我是感到有些惊讶的&#xff0c;然后试着去强行理解它&#xf…

使用 n8n 结合通义千问大模型构建业务数据库分析智能体

一、项目概述 本项目致力于构建一个结合 n8n 工作流引擎 与 通义千问大模型 的智能体&#xff0c;旨在对庞大的业务数据库进行自动化分析、语义建模及自然语言问答。通过不同工作流的迭代构建&#xff0c;实现了表结构解析、业务含义提取、关系可视化、问答服务等能力&#xff…

css margin外边距重叠/塌陷问题

一、定义 相邻块级元素或父子元素的垂直外边距会合并&#xff08;折叠&#xff09;为单个边距&#xff0c;其大小为单个边距的最大值&#xff08;或如果他们相等&#xff0c;则仅为其中的一个&#xff09;&#xff0c;这种行为称为边距折叠 <div style"margin-bottom: …

可重复读 是否“100%”地解决幻读?

这是一个非常深刻的问题&#xff0c;答案是&#xff1a;几乎解决了&#xff0c;但在一个非常特殊且罕见的边界场景下&#xff0c;理论上仍然可能出现幻读。 因此&#xff0c;严格来说&#xff0c;它并非被“彻底”或“100%”地解决。下面我们来详细分解这个结论&#xff1a;1. …