使用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
英文地址,請注明出處:http://en.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. …