GitHub Actions 自动化运维实战:从入门到落地

GitHub Actions 自动化运维实战:从入门到精通 本文是一篇关于GitHub Actions自动化运维的实战指南。文章首先介绍了GitHub Actions的核心概念(Workflow、Event、Job、Step、Action、Runner),并通过Mermaid流程图展示了从代码Push到CI完成的完整流程。随后详细讲解了四个实战场景:自动化测试与代码质量(多语言测试矩阵、代码质量工具集成)、自动化构建与容器化部署(多平台镜像构建、语义化版本管理)、基础设施即代码(Terraform自动化、Kubernetes部署)以及监控告警与自动化巡检。文章为读者 阅读详情

1. 引言

在传统运维模式下,每次发布都要手动登录服务器、执行命令、盯日志,不仅耗时费力,还容易因人为失误导致线上事故。自动化运维正是为了解决这些痛点而生。

GitHub Actions 作为 GitHub 原生的 CI/CD 平台,不仅能完成代码的持续集成与交付,还能承担定时巡检、监控告警、自动部署等运维任务,让「代码即运维」成为现实。

本文将从零开始,带你搭建一套可落地的自动化运维流水线,覆盖部署、监控、多环境发布与安全加固等核心场景。

2. GitHub Actions 核心概念

在动手之前,先快速了解几个贯穿全文的核心术语,后续章节会反复用到:

术语 说明
Workflow 一个自动化流程,由 .github/workflows 目录下的 YAML 文件定义
Job Workflow 中的任务单元,可并行或串行执行,默认在同一 Runner 上运行
Step Job 内的最小执行步骤,可以是命令或 Action
Action 可复用的封装步骤,如 actions/checkout、appleboy/scp-action
Runner 执行 Workflow 的服务器,分为 GitHub 托管与自托管两种
Event 触发 Workflow 的事件,如 push、pull_request、schedule
Secrets 仓库级加密变量,用于存放密码、Token 等敏感信息
GITHUB_TOKEN GitHub 自动生成的临时访问令牌,用于在 Workflow 内调用 API
  • Workflow、Job、Step 的基本概念
  • 触发方式:push、pull_request、schedule、workflow_dispatch
  • Runner 类型:GitHub 托管 Runner 与自托管 Runner
  • 常用语法速览:on、jobs、steps、uses、with、env

中英文术语对照表

为方便查阅,这里整理一份常用术语的中英文对照,后续章节将直接使用英文术语:

英文术语 中文含义 常见场景
Workflow 工作流 一个完整的自动化流程定义
Job 任务 工作流中的执行单元
Step 步骤 任务内的最小执行动作
Action 动作 可复用的封装步骤
Runner 运行器 执行工作流的服务器
Event 事件 触发工作流的条件
Trigger 触发 事件触发工作流运行
Schedule 定时任务 按 cron 表达式定时触发
Cron 定时表达式 定义任务执行的时间规则
Artifact 构建产物 构建生成的中间文件
Cache 缓存 加速依赖安装的缓存目录
Secret 密钥 加密存储的敏感变量
Environment 环境 如 dev、staging、production
Deployment 部署 将产物发布到目标环境
Rollback 回滚 恢复到上一可用版本
Self-hosted Runner 自托管运行器 部署在自己服务器上的 Runner
Checkout 检出代码 拉取仓库代码到 Runner
Workflow Dispatch 手动触发 在 GitHub 页面手动运行工作流
Concurrency 并发控制 限制同一工作流的并发运行
Matrix 矩阵策略 多版本、多平台并行构建
Outputs 输出变量 步骤间传递数据
Needs 依赖关系 控制 Job 之间的执行顺序
Permissions 权限声明 控制 GITHUB_TOKEN 的访问范围
Marketplace 应用市场 查找第三方 Action 的官方平台
Notification 通知 向外部渠道发送运行结果
Health Check 健康检查 验证服务是否正常响应
Idempotent 幂等 重复执行产生相同结果
  • 通过 SSH 远程执行部署命令
  • 使用第三方 Action 简化部署流程
  • 部署失败自动回滚策略

完整部署 Workflow 示例

下面是一份可直接套用的完整部署 Workflow,覆盖构建、上传、部署与健康检查四个阶段:

name: Auto Deploy

on:
  push:
    branches: [ main ]
  workflow_dispatch:

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm

      - name: Install Dependencies
        run: npm ci

      - name: Build
        run: npm run build

      - name: Upload via SCP
        uses: appleboy/scp-action@v0.1.7
        with:
          host: ${
   
   {
   
    secrets.SERVER_HOST }}
          username: ${
   
   {
   
    secrets.SERVER_USER }}
          key: ${
   
   {
   
    secrets.SSH_PRIVATE_KEY }}
          source: "dist/*"
          target: "/var/www/myapp"
          strip_components: 1

      - name: Deploy via SSH
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${
   
   {
   
    secrets.SERVER_HOST }}
          username: ${
   
   {
   
    secrets.SERVER_USER }}
          key: ${
   
   {
   
    secrets.SSH_PRIVATE_KEY }}
          script: |
            cd /var/www/myapp
            pm2 restart myapp
            sleep 5
            curl -fsS http://localhost:3000/health || exit 1

关键点说明:

  • cache: npm 自动缓存 node_modules,显著加速后续构建。
  • 部署命令末尾的健康检查失败会以非零码退出,从而标记该步骤失败。
  • 该示例可直接复制到 .github/workflows/deploy.yml 使用。### SSH 远程部署示例

上传产物后,通常还需要通过 SSH 在服务器上执行部署命令。下面是一个完整的 SSH 部署片段:

- name: Deploy via SSH
  uses: appleboy/ssh-action@v1.0.3
  with:
    host: ${
   
   {
   
    secrets.SERVER_HOST }}
    username: ${
   
   {
   
    secrets.SERVER_USER }}
    key: ${
   
   {
   
    secrets.SSH_PRIVATE_KEY }}
    script: |
      cd /var/www/myapp
      pm2 restart myapp
      curl -fsS http://localhost:3000/health || exit 1

关键点说明:

  • appleboy/ssh-action 通过 SSH 在远程服务器上执行 script 中的命令。
  • 部署完成后立即执行健康检查,失败则退出并触发告警。
  • 若需回滚,可在 script 中切换到上一版本目录并重启服务。### SCP 部署示例

下面是一个使用 SCP 将构建产物上传到云服务器的 Workflow 片段:

name: SCP Deploy

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Build
        run: |
          npm ci
          npm run build

      - name: Upload via SCP
        uses: appleboy/scp-action@v0.1.7
        with:
          host: ${
   
   {
   
    secrets.SERVER_HOST }}
          username: ${
   
   {
   
    secrets.SERVER_USER }}
          key: ${
   
   {
   
    secrets.SSH_PRIVATE_KEY }}
          source: "dist/*"
          target: "/var/www/myapp"
          strip_components: 1

关键点说明:

  • appleboy/scp-action 封装了 SCP 上传逻辑,只需配置主机、用户名与私钥即可。

  • 私钥、主机地址等敏感信息一律存放在仓库 Secrets 中,避免明文泄露。

  • strip_components: 1 用于去掉 dist/ 前缀,只保留构建产物本身。## 5. 定时任务与监控告警

  • 使用 schedule 实现定时巡检

  • 健康检查脚本编写与集成

  • 失败通知:邮件、钉钉、企业微信、Slack

  • 结合 GitHub Issues 自动创建告警单

3. 环境准备与基础配置

在编写第一个 Workflow 之前,需要先完成仓库、密钥与本地调试环境的准备。下面从零开始搭建。

创建仓库与目录结构

在 GitHub 上新建一个仓库(如 myapp),然后在仓库根目录创建 Actions 所需的目录结构:

mkdir -p .github/workflows

一个典型的仓库结构如下:

myapp/
├── .github/
│   └── workflows/
│       └── deploy.yml        # 部署工作流
├── src/                      # 源代码
├── dist/                     # 构建产物(由 CI 生成)
├── package.json
└── package-lock.json

配置仓库 Secrets 与 Variables

在仓库页面进入 Settings → Secrets and variables → Actions,分别配置:

  • Secrets(加密变量):存放 SERVER_HOST、SERVER_USER、SSH_PRIVATE_KEY 等敏感信息。
  • Variables(普通变量):存放 NODE_VERSION、APP_NAME 等非敏感配置。
# 生成 SSH 密钥对(本地执行)
ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/deploy_key

# 将公钥添加到服务器的 authorized_keys
cat ~/.ssh/deploy_key.pub | ssh user@server "cat >> ~/.ssh/authorized_keys"

# 将私钥内容复制到 GitHub Secrets(SSH_PRIVATE_KEY)
cat ~/.ssh/deploy_key

编写第一个 Hello World Workflow

创建 .github/workflows/hello.yml,实现一个最简单的触发流程:

name: Hello World

on:
  push:
    branches: [ main ]
  workflow_dispatch:

jobs:
  say-hello:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Print Message
        run: echo "Hello, GitHub Actions!"

      - name: Show Repository Info
        run: |
          echo "仓库: ${
   
   { github.repository }}"
          echo "分支: ${
   
   { github.ref_name }}"
          echo "提交: ${
   
   { github.sha }}"

关键点说明:

  • on.push.branches 指定触发分支,workflow_dispatch 允许手动触发。
  • ${ { github.* }} 是 GitHub 提供的上下文变量,可在运行时获取仓库、分支、提交等信息。
  • 推送代码到 main 分支后,可在仓库 Actions 页面看到运行结果。

本地调试技巧:act 工具

act 可以在本地模拟 Gi

彻底卸载Ubuntu双系统,并完美回收100G空间给D盘 本文记录了安全卸载Ubuntu双系统并回收磁盘空间的全过程。作者首先通过Windows命令行彻底清除Ubuntu启动项,避免GRUB引导报错;随后在磁盘管理中删除Linux分区,将100G未分配空间合并至相邻的D盘。针对C盘空间不足问题,作者采用Dism++清理系统文件,并将用户文档、聊天记录等迁移至扩容后的D盘。最终实现了引导纯净、空间合理分配的目标,特别强调分区扩展必须遵循"相邻原则",建议通过间接迁移而非直接扩容来优化系统盘空间管理。 阅读详情

相关推荐

Flink 作业报错——TaskManager连接不上

Flink 作业报错——TaskManager连接不上

lm223的博客 1901

ch32v103xx 烧写

烧写方式 串口uart, usb,swd(wch link)但不建议按此使用,参官方说明。

qq_39239990的博客 637

数据仓库的复用性:设计和构建一个高复用性的数仓

数据仓库的复用性是指在数据仓库的设计和使用过程中,能够实现数据、模型、流程、工具等多个层面的重复利用,减少重复开发,提高开发效率,降低维护成本,并增强灵活性和可扩展性。

z1941563559的博客 1307

数学建模入门——数据预处理(全)

介绍了数据预处理的入门知识

n04j04h06的博客 4347

基于浏览器插件的拼多多买家订单导出方法

基于浏览器插件的拼多多买家订单导出方法

2501_93542170的博客 1731

【向量数据库】Milvus向量数据库 ① 从入门到实战

Milvus是专为海量高维向量设计的开源数据库,支持AI搜索、图像识别、推荐系统等场景。相比传统关系型数据库(如PostgreSQL),它更高效处理语义检索、非结构化数据存储,可毫秒级响应亿级向量查询。单机场景下,推荐配置8GB内存/32GB硬盘,支持FAISS/HNSW等索引算法,支持GPU加速。本文涵盖优快云专属部署教程(CentOS脚本/配置调优),提供避坑指南与扩展资源,并对比分析与传统数据库差异。适合算法工程师、AI开发人员快速上手,附官方下载与性能测试技巧,手把手教你搭建高效向量检索系统!

xiezhiyi007的专栏 1589

嵌入式开发实战:LWIP中PPP协议配置全流程(含CHAP认证避坑指南)

本文是一份嵌入式开发实战指南,详细解析了如何在STM32平台上配置LWIP协议栈中的PPP协议,实现从串口到IP网络的完整连接。内容涵盖工程搭建、源码整合、关键配置、串口驱动绑定、状态管理以及CHAP认证等核心流程,并重点提供了CHAP认证失败的排查与避坑指南,帮助开发者高效打通嵌入式设备的网络连接。

plant的博客 464

(持续更新中!)详解【计算机类&面试真题】军队文职考试 ——第二期(真题+解析)| 网络协议的三个核心要素;交互式系统中的非剥夺策略;中断和陷入的区别;可变分区管理中的硬件机制;数据库系统的优点

本篇博客将讨论军队文职面试(计算机类)的几个关键问题。我们将介绍网络协议的核心要素(帮助你理解网络通信的基本原理)、交互式系统中的非剥夺策略(解释为何这是一个优秀的策略以及其对用户体验、系统稳定性和可预测性的影响)、中断和陷入的区别(从引起原因、处理机制、权限级别和应用等方面进行阐述)、可变分区管理的硬件机制以及数据库系统与文件系统的优点比较。通过阅读本文,您将深入了解这些话题,为面试准备和实际应用提供有价值的知识。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1707

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: 27届计算机硕士学士学位论文选题指南
下一篇: 从0到1建立个人RAG:完整实战指南
system_error_x
博客等级 码龄3年 17粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值