关于 github-actions
面向 GitHub 仓库自动化的 GitHub Actions 技能,介绍构建、测试和部署工作流,以及可复用组件、自托管 Runner 和故障排查。
主要功能
- 01配置推送、PR、定时和手动触发
- 02设置矩阵构建与任务依赖
- 03管理密钥、变量和缓存
- 04上传与下载构建产物
- 05创建可复用工作流
- 06配置自托管 Runner 并排查问题
适用场景
- 01为仓库建立 CI/CD 流程
- 02跨多个系统或版本运行测试
- 03复用部署工作流并按环境使用密钥
- 04排查未触发或权限不足的工作流
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill github-actions安装后在 Claude Code 中输入/github-actions确认已加载。
附带文件references/workflow-patterns.md
详细介绍
GitHub Actions
在 GitHub 仓库中直接使用 GitHub Actions 自动化软件工作流。
何时使用此技能
在以下情况下使用此技能:
- 为 GitHub 仓库设置 CI/CD 流水线
- 自动化构建、测试和部署工作流
- 创建可复用的工作流组件
- 配置自托管运行器
- 管理工作流机密和变量
- 调试失败的工作流运行
前置条件
- 拥有写入权限的 GitHub 仓库
- 了解 YAML 语法
- 对于自托管运行器:安装了 Docker 的服务器(可选)
工作流文件结构
工作流定义在 .github/workflows/ 目录中:
name: CI Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm test
常见触发条件
推送和拉取请求
on:
push:
branches: [main]
paths:
- 'src/**'
- 'package.json'
pull_request:
branches: [main]
定时运行
on:
schedule:
- cron: '0 2 * * *' # Daily at 2 AM UTC
手动触发
on:
workflow_dispatch:
inputs:
environment:
description: 'Deployment environment'
required: true
default: 'staging'
type: choice
options:
- staging
- production
作业配置
矩阵构建
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18, 20, 22]
os: [ubuntu-latest, windows-latest]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: npm test
作业依赖关系
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: npm run build
test:
needs: build
runs-on: ubuntu-latest
steps:
- run: npm test
deploy:
needs: [build, test]
runs-on: ubuntu-latest
steps:
- run: ./deploy.sh
环境保护
jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: production
url: https://example.com
steps:
- run: ./deploy.sh
机密和变量
使用机密
steps:
- name: Deploy
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run: aws s3 sync ./dist s3://my-bucket
使用变量
steps:
- name: Build
env:
API_URL: ${{ vars.API_URL }}
run: npm run build
缓存依赖项
- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
构建产物
上传构建产物
- uses: actions/upload-artifact@v4
with:
name: build-output
path: dist/
retention-days: 5
下载构建产物
- uses: actions/download-artifact@v4
with:
name: build-output
path: dist/
Docker 构建
jobs:
docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: user/app:latest
可复用工作流
定义可复用工作流
# .github/workflows/reusable-deploy.yml
name: Reusable Deploy
on:
workflow_call:
inputs:
environment:
required: true
type: string
secrets:
deploy_key:
required: true
jobs:
deploy:
runs-on: ubuntu-latest
environment: ${{ inputs.environment }}
steps:
- run: echo "Deploying to ${{ inputs.environment }}"
调用可复用工作流
jobs:
deploy-staging:
uses: ./.github/workflows/reusable-deploy.yml
with:
environment: staging
secrets:
deploy_key: ${{ secrets.STAGING_KEY }}
自托管运行器
注册运行器
# Download runner
mkdir actions-runner && cd actions-runner
curl -o actions-runner-linux-x64.tar.gz -L https://github.com/actions/runner/releases/download/v2.311.0/actions-runner-linux-x64-2.311.0.tar.gz
tar xzf actions-runner-linux-x64.tar.gz
# Configure
./config.sh --url https://github.com/OWNER/REPO --token TOKEN
# Run
./run.sh
使用自托管运行器
jobs:
build:
runs-on: self-hosted
steps:
- uses: actions/checkout@v4
调试工作流
启用调试日志
设置仓库机密:
ACTIONS_RUNNER_DEBUG:trueACTIONS_STEP_DEBUG:true
调试步骤
- name: Debug
run: |
echo "GitHub context: ${{ toJson(github) }}"
echo "Job context: ${{ toJson(job) }}"
常见问题
问题:工作流未触发
问题:工作流在推送或拉取请求时未运行 解决方案:检查分支筛选器和路径筛选器,并确保工作流文件位于默认分支上
问题:权限被拒绝
问题:Actions 无法推送或创建拉取请求
解决方案:在工作流中配置 permissions,或更新仓库设置
permissions:
contents: write
pull-requests: write
问题:缓存未恢复
问题:存在缓存,但仍未命中 解决方案:确认缓存键完全匹配,并检查运行器的操作系统
最佳实践
- 将 Action 版本固定到特定提交或标签
- 使用依赖项缓存来加快构建
- 通过限定环境范围,尽量减少机密泄露
- 使用矩阵构建进行跨平台测试
- 使用
continue-on-error实现适当的错误处理 - 使用可复用工作流和复合 Action 保持工作流 DRY
相关技能
- gitlab-ci - GitLab CI/CD 替代方案
- docker-management - 容器构建
- semantic-versioning - 自动化发布
评论
支持 Markdown