当前位置: 首页 > news >正文

免费的 CI/CD 服务,了解一下 GitHub Actions ?

前言

最近做了一个 apk,每次更新都要手动进行打包,再把 apk 分发出去,麻烦!

上网冲浪的时候,发现了这个 android_builder,发现 GitHub Actions 还是很香的,了解一下。

什么是 GitHub Actions

GitHub Actions 是 GitHub 推出的持续集成(CI/CD)服务,于 2018 年 10 月推出。它允许开发者在 GitHub 仓库中直接自动化软件开发工作流程。

核心概念:

  • Workflow(工作流):自动化流程,由一个或多个 Job 组成
  • Job(任务):一组在同一运行器上执行的步骤(Step)
  • Step(步骤):单个任务,可以运行命令或使用 Action
  • Action(动作):可复用的工作流代码单元,是最小的可移植构建块
  • Runner(运行器):执行工作流的服务器,GitHub 提供托管运行器(Ubuntu、Windows、macOS)

主要优势:

  • 🚀 与 GitHub 深度集成,无需第三方 CI/CD 工具
  • 💰 对公开仓库免费,私有仓库每月有免费额度
  • 🔧 丰富的预构建 Actions 可直接使用
  • 🌐 支持多种操作系统和编程语言
  • 📦 社区驱动,有大量开源 Actions 可用

基础语法

GitHub Actions 使用 YAML 格式配置文件,存放在仓库的 .github/workflows/ 目录下。

基本结构

name: 工作流名称# 触发条件
on:push:branches: [ main ]pull_request:branches: [ main ]# 任务列表
jobs:build:runs-on: ubuntu-lateststeps:- name: 检出代码uses: actions/checkout@v3- name: 运行命令run: echo "Hello, GitHub Actions!"

触发器(Triggers)

1. Push 事件

on:push:branches:- main- 'releases/**'paths:- '**.js'

2. Pull Request 事件

on:pull_request:types: [opened, synchronize, reopened]

3. 定时触发(Cron)

on:schedule:- cron: '0 0 * * *'  # 每天午夜运行

4. 手动触发

on:workflow_dispatch:inputs:environment:description: '部署环境'required: truedefault: 'staging'

5. 多个事件组合

on: [push, pull_request, workflow_dispatch]

常用配置项

环境变量

env:NODE_VERSION: '18'jobs:build:runs-on: ubuntu-latestenv:DATABASE_URL: ${{ secrets.DATABASE_URL }}steps:- run: echo $NODE_VERSION

矩阵策略(Matrix)

jobs:test:runs-on: ${{ matrix.os }}strategy:matrix:os: [ubuntu-latest, windows-latest, macos-latest]node-version: [14, 16, 18]steps:- uses: actions/setup-node@v3with:node-version: ${{ matrix.node-version }}

条件执行

steps:- name: 仅在主分支运行if: github.ref == 'refs/heads/main'run: echo "这是主分支"

依赖关系

jobs:build:runs-on: ubuntu-lateststeps:- run: npm run builddeploy:needs: build  # 等待 build 完成runs-on: ubuntu-lateststeps:- run: npm run deploy

实际应用示例

1. 前端项目 CI/CD

场景: React 项目的自动化测试、构建和部署

name: Frontend CI/CDon:push:branches: [ main ]pull_request:branches: [ main ]jobs:test:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: 设置 Node.jsuses: actions/setup-node@v3with:node-version: '18'cache: 'npm'- name: 安装依赖run: npm ci- name: 代码检查run: npm run lint- name: 运行测试run: npm test- name: 构建项目run: npm run build- name: 部署到 GitHub Pagesif: github.ref == 'refs/heads/main'uses: peaceiris/actions-gh-pages@v3with:github_token: ${{ secrets.GITHUB_TOKEN }}publish_dir: ./build

2. 后端测试

场景: Go 语言项目的自动化测试和代码覆盖率

name: Go API Testson: [push, pull_request]jobs:test:runs-on: ubuntu-latestservices:postgres:image: postgres:14env:POSTGRES_PASSWORD: postgresoptions: >---health-cmd pg_isready--health-interval 10s--health-timeout 5s--health-retries 5steps:- uses: actions/checkout@v3- name: 设置 Go 环境uses: actions/setup-go@v4with:go-version: '1.21'- name: 下载依赖run: go mod download- name: 运行测试run: go test -v -race -coverprofile=coverage.txt -covermode=atomic ./...- name: 上传代码覆盖率uses: codecov/codecov-action@v3with:files: ./coverage.txt

3. 自动发布版本

场景: 创建 Tag 时自动发布 Release

name: Releaseon:push:tags:- 'v*'jobs:release:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: 构建二进制文件run: |GOOS=linux GOARCH=amd64 go build -o app-linux-amd64GOOS=windows GOARCH=amd64 go build -o app-windows-amd64.exeGOOS=darwin GOARCH=amd64 go build -o app-darwin-amd64- name: 创建 Releaseuses: softprops/action-gh-release@v1with:files: |app-linux-amd64app-windows-amd64.exeapp-darwin-amd64body: |## 更新内容- 功能改进- Bug 修复draft: falseprerelease: falseenv:GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

4. 定时任务

场景: 每天自动爬取数据并提交

name: Daily Data Syncon:schedule:- cron: '0 2 * * *'  # 每天凌晨 2 点workflow_dispatch:  # 支持手动触发jobs:sync:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: 设置 Pythonuses: actions/setup-python@v4with:python-version: '3.11'- name: 安装依赖run: pip install -r requirements.txt- name: 运行爬虫run: python scraper.py- name: 提交更改run: |git config --local user.email "action@github.com"git config --local user.name "GitHub Action"git add data/git diff --quiet && git diff --staged --quiet || (git commit -m "chore: update data [skip ci]" && git push)

5. Docker 镜像构建与发布

场景: 自动构建并推送 Docker 镜像到 Docker Hub

name: Docker Build and Pushon:push:branches: [ main ]tags: [ 'v*' ]jobs:docker:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: 设置 Docker Buildxuses: docker/setup-buildx-action@v2- name: 登录 Docker Hubuses: docker/login-action@v2with:username: ${{ secrets.DOCKER_USERNAME }}password: ${{ secrets.DOCKER_PASSWORD }}- name: 提取元数据id: metauses: docker/metadata-action@v4with:images: myusername/myapp- name: 构建并推送uses: docker/build-push-action@v4with:context: .push: truetags: ${{ steps.meta.outputs.tags }}labels: ${{ steps.meta.outputs.labels }}cache-from: type=ghacache-to: type=gha,mode=max

6. 代码质量检查

场景: 自动进行代码审查和安全扫描

name: Code Qualityon: [push, pull_request]jobs:lint:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: 运行 ESLintuses: reviewdog/action-eslint@v1with:github_token: ${{ secrets.GITHUB_TOKEN }}reporter: github-pr-reviewsecurity:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: 运行安全扫描uses: aquasecurity/trivy-action@masterwith:scan-type: 'fs'scan-ref: '.'format: 'sarif'output: 'trivy-results.sarif'- name: 上传扫描结果uses: github/codeql-action/upload-sarif@v2with:sarif_file: 'trivy-results.sarif'

运行机制

工作原理

  1. 事件触发:当仓库中发生特定事件(push、PR、issue 等)时,GitHub 会检查是否有对应的工作流配置

  2. Runner 分配:GitHub 从 Runner 池中分配一个可用的运行器(或使用自托管 Runner)

  3. 环境准备

    • 创建虚拟环境(VM 或容器)
    • 克隆仓库代码
    • 设置环境变量
  4. 执行步骤

    • 按顺序执行每个 Step
    • 每个 Step 可以是 Shell 命令或 Action
    • Step 之间共享文件系统但不共享环境变量(除非显式传递)
  5. 结果报告

    • 收集执行日志
    • 报告成功/失败状态
    • 可选:发送通知、创建 Check Run

Action 复用机制

Action 可以通过三种方式引用:

  1. 公共仓库uses: actions/checkout@v3
  2. 私有仓库uses: owner/repo@ref
  3. 本地路径uses: ./.github/actions/my-action

Action 本质是:

  • JavaScript Action:Node.js 脚本
  • Docker Action:Docker 容器
  • Composite Action:组合多个步骤

Secrets 管理

GitHub Actions 使用加密存储来保护敏感信息:

  • Secrets 在传输和存储时都经过加密
  • 日志输出会自动屏蔽 Secrets 内容
  • Secrets 仅对有权限的工作流可见
  • 支持仓库级、组织级和环境级 Secrets

并发与限制

并发限制:

  • 公共仓库:20 个并发任务
  • 私有仓库:根据计费方案不同(5-180 个)

使用限制:

  • 每个工作流最多运行 72 小时
  • 每个 Job 最多 6 小时
  • API 请求限制:1000 次/小时
  • Artifact 存储:90 天自动删除

免费额度(私有仓库):

  • Linux:2000 分钟/月
  • Windows:1000 分钟/月(2 倍计费)
  • macOS:200 分钟/月(10 倍计费)

参考

  • 阮一峰的网络日志 GitHub Actions 入门教程
  • 官方文档
  • awesome-actions
  • GitHub 官方市场
  • GitHub Actions 使用限制
  • 工作流语法参考
http://www.dtcms.com/a/426595.html

相关文章:

  • 基于 CI/CD 平台将应用程序自动部署到 Kubernetes 集群
  • QT示例 使用QTcpSocket和QTcpServer类实现TCP的自定义消息头、消息体通信示例
  • YDWE编辑器系列教程一:编辑器界面
  • 外贸网站怎么找客户名城建设有限公司网站
  • Linux 系统基础配置:主机名、IP、主机映射、防火墙
  • AI 重构实体经济:2025 传统产业的智能转型革命
  • 【金仓数据库产品体验官】KingbaseES-Oracle兼容性体验
  • 初探 ansible 部署 devops 持续集成持续交付
  • 【VBA】点击按钮,实现将Excel表A数据按格式填入表B
  • 微硕WST8205A双N沟MOSFET,汽车阅读灯静音负载开关
  • LabVIEW与PLC 汽车驻车制动自动调整
  • 【办公类-115-01】20250920职称资料上传01——多个jpg转同名PDF(如:荣誉证书)并自动生成单一文件夹
  • 基于Kafka+ElasticSearch+MongoDB+Redis+XXL-Job日志分析系统(学习)
  • 【龙泽科技】智能网联汽车智能传感器测试装调仿真教学软件
  • JAVA:Spring Boot 集成 BouncyCastle 实现加密算法
  • 石家庄住房和城乡建设局官方网站app模板下载网站
  • gRPC从0到1系列【9】
  • IDEA 2024 中创建 Maven 项目的详细步骤
  • 2025 AI 图景:从工具革命到生态重构的五大趋势
  • 网站开发者模式下载视频wordpress如何添加备案号
  • UNIX下C语言编程与实践22-UNIX 文件其他属性获取:stat 结构与 localtime 函数的使用
  • UNIX下C语言编程与实践15-UNIX 文件系统三级结构:目录、i 节点、数据块的协同工作机制
  • 青浦做网站的公司网站开发语言html5 php
  • 【分布式中间件】RabbitMQ 功能详解与高可靠实现指南
  • SOME/IP-SD报文结构和交互详解
  • 给贾维斯加“手势控制”:从原理到落地,打造多模态交互的本地智能助
  • 电商数据分析优化清理大师
  • 论文阅读:《Self-Supervised Continual Graph Learning in Adaptive Riemannian Spaces》
  • Qt事件处理全解析
  • 深入理解 LLM 分词器:BPE、WordPiece 与 Unigram