【CI/CD·Actions篇】GitHub Actions 入门:Workflow 语法与自托管 Runner
前言GitHub Actions 是增长最快的 CI/CD 平台。如果你在 GitHub 上托管代码它几乎零成本就能跑起 CI。本篇从 Workflow 基础语法到自托管 Runner 配置带你快速上手。一、核心概念GitHub Actions 体系: Workflow工作流 → 一个 .yml 文件定义完整 CI/CD 流程 ├── Event事件 → 触发 Workflow 的条件push、PR、定时等 ├── Job任务 → 一个 Workflow 包含多个 Job │ ├── Step步骤→ 一个 Job 包含多个 Step命令或 Action │ └── Runner → 执行 Job 的环境GitHub 托管或自托管 └── Action → 可复用的 Step 组件类似函数调用二、Workflow 语法详解基本结构# .github/workflows/ci.yml name: CI Pipeline # 触发条件 on: push: branches: [main, develop] paths: - src/** - pom.xml pull_request: branches: [main] schedule: - cron: 0 2 * * * # 每天凌晨2点 workflow_dispatch: # 手动触发 inputs: environment: description: 部署环境 required: true default: dev type: choice options: [dev, staging, prod] # 全局环境变量 env: APP_NAME: myapp JAVA_VERSION: 17 jobs: build: runs-on: ubuntu-latest env: MAVEN_OPTS: -Dmaven.repo.local.m2 steps: - uses: actions/checkoutv4 - uses: actions/setup-javav4 with: java-version: ${{ env.JAVA_VERSION }} distribution: temurin cache: maven - run: mvn clean package -DskipTests - uses: actions/upload-artifactv4 with: name: app-jar path: target/*.jar retention-days: 7触发条件on# 多种触发方式组合 on: # Push 到特定分支 push: branches: [main, release/*] tags: [v*] paths-ignore: [docs/**, *.md] # PR 到 main pull_request: branches: [main] # 定时 schedule: - cron: 0 2 * * 1-5 # 工作日凌晨2点 # 手动触发 workflow_dispatch: inputs: debug: description: Enable debug mode type: boolean default: false # 其他 Workflow 完成后触发 workflow_run: workflows: [Build] types: [completed] branches: [main] # 仓库事件 issues: types: [opened, labeled] # 外部 Webhook repository_dispatch: types: [deploy]Job 和 Stepjobs: # 并行执行的 Job lint: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - run: npm ci - run: npm run lint test: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - run: npm ci - run: npm test # Job 的条件执行 if: github.event_name pull_request # 依赖前面 Job 的 Job deploy: needs: [lint, test] # 等 lint 和 test 都完成 runs-on: ubuntu-latest if: github.ref refs/heads/main steps: - run: ./deploy.sh条件表达式steps: # if 条件 - name: Deploy to prod if: github.ref refs/heads/main github.event_name push run: ./deploy.sh prod # 基于上一步的输出 - name: Test result if: ${{ steps.build.outcome success }} run: echo Build succeeded - name: Handle failure if: ${{ steps.build.outcome failure }} run: echo Build failed # 基于 GitHub 上下文 - name: PR comment if: github.event_name pull_request run: echo This is a PR build # Job 条件 jobs: deploy-prod: if: | github.ref refs/heads/main github.event_name push runs-on: ubuntu-latest矩阵构建Matrixjobs: test: runs-on: ubuntu-latest strategy: matrix: # 多版本并行测试 java: [17, 21] os: [ubuntu-latest, windows-latest] exclude: - os: windows-latest java: 21 # 排除特定组合 steps: - uses: actions/checkoutv4 - uses: actions/setup-javav4 with: java-version: ${{ matrix.java }} - run: mvn test三、Actions 复用使用 Marketplace 中的 Actionsteps: # 检出代码几乎所有 Workflow 第一步 - uses: actions/checkoutv4 with: fetch-depth: 0 # 获取完整历史用于 changelog 生成 # 缓存依赖 - uses: actions/cachev4 with: path: | ~/.m2/repository ~/.gradle key: ${{ runner.os }}-deps-${{ hashFiles(**/pom.xml) }} restore-keys: | ${{ runner.os }}-deps- # 上传产物 - uses: actions/upload-artifactv4 with: name: app path: target/*.jar # 下载产物跨 Job - uses: actions/download-artifactv4 with: name: appSecrets 和变量# 在 GitHub → Settings → Secrets and variables → Actions 中配置 steps: # 使用 Secret - name: Docker login run: docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASS }} # 使用环境变量非敏感 - name: Build env: APP_ENV: ${{ vars.APP_ENV }} run: npm run build # 从 Secret 读取 Docker Hub 密码 - name: Push image run: | echo ${{ secrets.DOCKER_PASS }} | docker login -u ${{ secrets.DOCKER_USER }} --password-stdin docker push myapp:${{ github.sha }}**踩坑提示**GitHub Secrets 只在 Actions 运行时注入到环境变量中日志中会显示为 ***。但如果你的脚本不小心把 Secret 输出到文件或日志Mask 不会生效。一定不要用 echo $SECRET 或 cat $SECRET_FILE。四、自托管 Runner为什么要自托管| 场景 | GitHub 托管 | 自托管 ||------|-----------|--------|| 开源项目 | 免费 | 不需要 || 私有仓库 | 有免费额度 | 可能需要 || 内网部署 | 不行 | 必须 || 特殊硬件GPU | 不行 | 必须 || 自定义环境 | 不行 | 必须 |添加自托管 Runner在 GitHub 仓库 → Settings → Actions → Runners → New self-hosted runner# Linux 服务器上操作 # 创建 Runner 目录 mkdir actions-runner cd actions-runner # 下载 RunnerURL 从 GitHub 页面获取 curl -o actions-runner-linux-x64-2.317.0.tar.gz -L \ https://github.com/actions/runner/releases/download/v2.317.0/actions-runner-linux-x64-2.317.0.tar.gz # 解压 tar xzf actions-runner-linux-x64-2.317.0.tar.gz # 配置Token 从 GitHub 获取有时效性 ./config.sh --url https://github.com/your-org/your-repo --token YOUR_TOKEN --labels linux,java,docker # 安装为系统服务 sudo ./svc.sh install sudo ./svc.sh start # 验证状态 sudo ./svc.sh status在 Workflow 中使用自托管 Runnerjobs: build: # 使用 GitHub 托管 runs-on: ubuntu-latest deploy: # 使用自托管 Runner runs-on: [self-hosted, linux, java] # labels 中必须全部匹配 docker-build: # 需要 Docker 的自托管 Runner runs-on: [self-hosted, docker]Runner 组管理在组织级别添加 Runner可用于组织下所有仓库# 组织级 Runner ./config.sh --url https://github.com/your-org --token YOUR_TOKEN --labels org-runner # 在 Workflow 中使用 runs-on: [self-hosted, org-runner]**培训要点**自托管 Runner 的安全风险是——Runner 可以访问你的私有仓库代码。不要让不受信任的人有权限触发 Runner 上的 Workflow尤其 PR 触发时。用 environment 保护生产部署的 Job。五、实战完整 Spring Boot 项目 Workflow# .github/workflows/ci-cd.yml name: CI/CD on: push: branches: [main] tags: [v*] pull_request: branches: [main] env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} jobs: # 构建 build: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - uses: actions/setup-javav4 with: java-version: 17 distribution: temurin cache: maven - run: mvn clean package -DskipTests - uses: actions/upload-artifactv4 with: name: app-jar path: target/*.jar # 测试并行 unit-test: needs: build runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - uses: actions/setup-javav4 with: java-version: 17 distribution: temurin cache: maven - run: mvn test - uses: dorny/test-reporterv1 if: always() with: name: Test Results path: target/surefire-reports/TEST-*.xml reporter: java-junit sonar: needs: build runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - uses: actions/setup-javav4 with: java-version: 17 distribution: temurin - run: mvn verify sonar:sonar -Dsonar.token${{ secrets.SONAR_TOKEN }} # Docker 构建 docker: needs: [unit-test] runs-on: ubuntu-latest permissions: contents: read packages: write steps: - uses: actions/checkoutv4 - uses: actions/download-artifactv4 with: name: app-jar path: target/ - uses: docker/login-actionv3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - uses: docker/metadata-actionv5 id: meta with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | typesha typeref,eventtag typeraw,valuelatest,enable${{ github.ref refs/heads/main }} - uses: docker/build-push-actionv5 with: context: . push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} # 部署 deploy: needs: [docker] runs-on: [self-hosted, k8s] if: startsWith(github.ref, refs/tags/v) environment: production steps: - run: | kubectl set image deployment/myapp \ app${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:sha-${{ github.sha }} \ -n prod kubectl rollout status deployment/myapp -n prod --timeout300s六、本篇要点回顾1. Workflow 用on定义触发jobs定义任务每个 Job 有多个steps2.needs控制 Job 依赖if控制条件执行matrix实现并行多版本测试3. Marketplace Actions 用uses调用Secrets 用secrets.XXX引用4. 自托管 Runner 用runs-on: [self-hosted, label]匹配5.environment: production保护生产部署 Job需要人工审批下一篇预告《进阶实战复合 Action 开发与 Marketplace 利用》——从使用别人的 Action 到开发自己的 Action实现 CI/CD 代码复用。

相关新闻

示波器时基与基础测量入门

示波器时基与基础测量入门

面向新入行硬件测试工程师、硬件工程师、嵌入式工程师的技术科普 1. 调整示波器的时基,就是调整什么? 调整示波器的时基,本质上是在调整屏幕横轴的时间刻度,也就是: 每一格代表多少时间英文常见叫法: Time Base Horizontal Scale Time/Div s/div sec/div比如示波器…

2026/8/11 13:18:47 阅读更多 →
原神7.0前瞻内容介绍 mac可以玩原神吗

原神7.0前瞻内容介绍 mac可以玩原神吗

原神7.0前瞻放出的信息量极大,不仅敲定了上线日期,还曝光了地图、角色、战斗机制与限时福利,直接拉高了玩家对新版本的期待。不少Mac玩家发愁设备没法原生运行游戏,想要第一时间探索雪原秘境,吃透原神7.0前瞻里的玩法内…

2026/8/11 13:18:23 阅读更多 →
双机热备旁挂组网实验

双机热备旁挂组网实验

需求:sw3的流量 正常:sw1--->FW1--->sw1--->R5 故障:sw2--->FW2--->sw2--->R6 sw4的流量 正常:sw2--->FW2--->sw2--->R6 故障:sw1--->FW1--->sw1--->R5 sw1和sw2是核心层设备&…

2026/8/11 13:18:45 阅读更多 →

最新新闻

Tessent 2025.04工具链:AI驱动与3D IC测试技术解析

Tessent 2025.04工具链:AI驱动与3D IC测试技术解析

1. Tessent 2025.04工具链深度解析 作为半导体测试领域的工业级标准工具,Tessent系列始终引领着DFT(Design for Test)技术的发展方向。2025年春季发布的Tessent 2025.04版本在AI驱动的测试模式生成、3D IC测试架构支持以及超低功耗测试方案三…

2026/8/11 14:12:19 阅读更多 →
SpringBoot+Vue构建农产品电商系统实战

SpringBoot+Vue构建农产品电商系统实战

1. 项目背景与核心需求 本庄村果园预售系统是一个典型的农产品电商平台,主要解决传统果园销售模式中的几个痛点: 季节性滞销问题 :水果成熟期集中,传统线下销售渠道有限 预售模式缺失 :无法提前锁定客户需求&…

2026/8/11 14:12:19 阅读更多 →
单相单电容电机原理与双电机空压机安全检修指南

单相单电容电机原理与双电机空压机安全检修指南

1. 先搞清楚单相单电容电机和双电机空压机到底是怎么回事 今天聊的这个主题,核心是两个事:一是单相单电容电机怎么转起来的,二是双电机空压机坏了怎么安全地修。尤其是带储气罐的设备,很多人不敢碰,怕操作不当出问题。…

2026/8/11 14:12:19 阅读更多 →
ATM火控动力电路改造:电容选型与焊接实战,释放速凌五代无刷电机潜能

ATM火控动力电路改造:电容选型与焊接实战,释放速凌五代无刷电机潜能

在电动玩具改装领域,动力系统的稳定与爆发力是决定性能上限的关键。许多玩家在升级了速凌五代这类高性能无刷电机后,常常会遇到原厂ATM火控系统“力不从心”的情况,表现为响应延迟、射速不稳定,甚至在连续击发时出现“断电”或“卡…

2026/8/11 14:12:19 阅读更多 →
Nginx 上的通配符证书 90 天到期,续签这事我是这么搞的

Nginx 上的通配符证书 90 天到期,续签这事我是这么搞的

用免费通配符证书有个绕不开的问题:90 天就过期。 我管着三个子域名,api.xxx.com、admin.xxx.com、cdn.xxx.com,一开始每个域名各申请一张单域名证书,后来换了通配符证书,*.xxx.com 一张搞定。省事是省事了&#xff0c…

2026/8/11 14:12:19 阅读更多 →
PHP.d目录模块化配置与性能优化实战

PHP.d目录模块化配置与性能优化实战

1. PHP.d目录的配置模块化革命在PHP的世界里,php.ini这个"庞然大物"曾经让无数开发者头疼不已。想象一下,当你需要管理几十个PHP扩展配置时,所有内容都挤在一个文件里,就像把整个厨房的调料都倒进一个罐子——找起东西来…

2026/8/11 14:11:19 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →