文章目录导航6节
GitHub Actions 自动化 CI/CD 快速入门与实战
现代软件开发中,持续集成与持续部署(CI/CD)是保证代码质量与自动化交付的基石。
GitHub Actions 是 GitHub 官方提供的全功能自动化平台。无需自行搭建 Jenkins 等复杂系统,只需在仓库中编写简单的 YAML 配置文件,即可在每次代码推送(Push)、发起 PR 或打版本标签(Tag)时,自动执行代码检查、单元测试、Docker 镜像打包以及 Release 软件分发。
本教程将拆解 GitHub Actions 的核心概念,并通过两个典型的高频实战工作流带你快速上手。
一、GitHub Actions 核心概念
一个完整的 GitHub Actions 体系由以下五大核心要素组成:
[Event (触发事件)]
└─ 例如:push 到 main 分支、有人发起 PR、发布了 Release
│
▼
[Workflow (工作流)]
└─ 定义在 .github/workflows/*.yml 中的自动化任务清单
│
▼
[Job (作业任务)]
└─ 包含在工作流中的一组步骤,默认多个 Job 并行执行
│
▼
[Step (具体步骤)]
└─ Job 内按顺序执行的原子指令(执行 Shell 脚本或调用第三方 Action)
│
▼
[Runner (运行容器/虚拟机)]
└─ GitHub 提供的托管环境(如 ubuntu-latest, windows-latest, macos-latest)
所有配置文件均统一存放在仓库根目录的 .github/workflows/ 文件夹下。
二、实战案例 1:前端/Node.js 项目自动化测试与构建
该工作流会在任何提交被推送到 main 分支或产生 PR 时,自动安装依赖、执行代码规范检查(Lint)和编译构建。
在仓库根目录下创建文件 .github/workflows/ci.yml:
name: Continuous Integration
# 触发条件:推送到 main 分支,或针对 main 分支的 PR
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
# 运行在最新的 Ubuntu 虚拟机环境
runs-on: ubuntu-latest
# 矩阵测试:同时在 Node.js 18.x 和 20.x 下运行
strategy:
matrix:
node-version: [18.x, 20.x]
steps:
# 1. 检出仓库代码到虚拟机中
- name: Checkout repository
uses: actions/checkout@v4
# 2. 设置 Node.js 运行时环境并配置缓存加速
- name: Set up Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
# 3. 安装依赖(使用 npm ci 确保与 package-lock.json 严格一致)
- name: Install dependencies
run: npm ci
# 4. 执行静态检查与测试
- name: Run lint and tests
run: |
npm run lint --if-present
npm test --if-present
# 5. 执行项目编译构建
- name: Build project
run: npm run build
当你在 GitHub 提交该文件后,切换到仓库顶部的 Actions 标签页,就能实时查看到自动触发的工作流运行状态和详尽的执行日志。
三、实战案例 2:Git Tag 触发自动打包并发布 GitHub Releases
当你为项目发布新版本并推送 Git Tag 时,该工作流会自动编译跨平台二进制产物,并在 GitHub 上创建全新的 Release 发布页,将二进制包自动上传供用户下载。
创建文件 .github/workflows/release.yml:
name: Publish Release
# 仅在推送形如 v1.0.0 的版本标签时触发
on:
push:
tags:
- 'v*'
jobs:
create-release:
runs-on: ubuntu-latest
permissions:
contents: write # 授予对 Releases 的写入权限
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.22'
# 编译 Linux amd64 二进制文件
- name: Build binary
run: |
mkdir -p dist
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o dist/myapp-linux-amd64 .
tar -czvf dist/myapp-${{ github.ref_name }}-linux-amd64.tar.gz -C dist myapp-linux-amd64
# 创建 Release 并上传归档包
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
files: dist/*.tar.gz
generate_release_notes: true # 自动根据 commit 生成更新日志
draft: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
发布新版本只需三行 Git 命令:
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0
Actions 会自动开始构建,几分钟后用户即可在你的 GitHub Releases 页面下载编译好的资产!
四、安全与最佳实践:GitHub Secrets
在 CI/CD 中,经常需要调用 Docker Hub 密钥、服务器 SSH 密码或第三方 API Token。绝对不能将敏感凭据明文提交到 Git 仓库!
配置安全机密(Secrets)
- 仓库主页 -> Settings -> 左侧 Secrets and variables -> Actions。
- 点击 New repository secret。
- 输入变量名(如
DOCKERHUB_TOKEN)和对应的密钥值。 - 在 YAML 工作流中通过
${{ secrets.VARIABLE_NAME }}安全引用:
GitHub Actions 在日志打印中会自动将所有 Secrets 字符串替换为- name: Log in to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }}***,彻底防止机密泄漏。
五、生态结合:国内服务器自动化部署与加速流转
在自动化运维(如远程 SSH 部署至国内服务器)过程中,国内服务器常常需要拉取刚刚通过 GitHub Actions 发布的 Release 资产或 Docker 镜像。
若直接使用 GitHub 官方直连,可能遭遇断连或限速,建议在部署脚本中结合 GH-Proxy 实现秒级高速流转:
# 在自动化部署脚本中集成 GH-Proxy 加速下载最新资产
VERSION="v1.0.0"
ASSET_NAME="myapp-${VERSION}-linux-amd64.tar.gz"
curl -L -O "https://gh-proxy.com/https://github.com/your-username/your-repo/releases/download/${VERSION}/${ASSET_NAME}"
tar -zxvf "${ASSET_NAME}"
这样不仅能确保 CI/CD 流程的稳定性,还能规避部署脚本因网络抖动中断的难题。