本文详细介绍了Github Actions的工作原理,包括事件触发、作业执行和任务定义,帮助新手快速入门。通过具体示例,展示了如何创建和配置工作流文件,涵盖构建、测试和部署等常见任务。此外,文章还提供了高级用法和实战技巧,如并行测试和自托管运行器的使用,进一步提升开发效率。
Github Actions 实战:新手入门及初级教程 Github Actions 简介什么是 Github Actions
Github Actions 是 GitLab CI 和 Travis CI 之后的又一个 CI/CD 工具,它允许用户在 Github 上直接定义和执行自动化任务。Github Actions 提供了从代码提交到生产部署的完整自动化流程。任务可以是构建、测试、部署,也可以是其他任意操作。每个任务都可以通过工作流文件来定义,并且可以与其他 Github 内部和外部的服务进行集成。
Github Actions 的作用和优势
1. 自动化构建
Github Actions 可以自动构建项目,包括编译代码和生成静态网站。这对于频繁修改代码的开发者来说非常实用,能够确保每次提交代码后都能自动构建出最新的版本。
2. 自动化测试
开发者可以配置 Github Actions 来运行单元测试、集成测试和端到端测试,确保每次更改不会引入新的 bug。这有助于维护代码质量,并加快开发速度。
3. 自动化部署
部署是开发流程中的重要步骤,Github Actions 可以将代码部署到云端服务器、运行容器或静态网站,保证软件的最新版本能够及时更新。
4. 集成度高
由于 Github Actions 是与 Github 无缝集成的,因此可以方便地利用 Github 提供的各种服务,如仓库管理、代码审查等。同时,它也支持第三方服务的集成,能够满足多样化的开发需求。
Github Actions 的工作原理
在 Github Actions 中,工作流(Workflow)是核心概念。工作流由若干作业(Job)组成,每个作业定义了要执行的任务(Step)。工作流文件是由 YAML 格式的文件定义的,通常放在项目的 .github/workflows
目录下。
- 事件触发:每个工作流都可以由特定的事件触发,如代码推送、pull request 事件、issue 事件等。
- 作业执行:每个作业可以在不同的运行器(Runner)上执行,运行器可以是操作系统运行环境。例如,一个作业可以在 Ubuntu 系统上运行,另一个作业可以在 Windows 系统上运行。
- 任务执行:每个任务由一系列命令组成,这些命令可以是 shell 命令、脚本或调用其他服务。
Github Actions 的基本概念
事件(Event):Github Actions 通过事件触发工作流的执行,事件可以是 push、pull request、issue、schedule 等。例如,每次代码推送后,都会触发一个构建工作流来自动构建代码。
工作流(Workflow):工作流文件定义了自动化任务的具体流程,这些任务可以是构建、测试、部署等。工作流文件的格式是 YAML,通常放在项目的 .github/workflows
目录下。
作业(Job):作业是工作流中的一个组件,它定义了要执行的具体任务。每个作业可以运行在特定的操作系统环境中,比如 Ubuntu、Windows 或 macOS。
任务(Step):任务是作业中最小的可执行单元,它由一系列命令组成,这些命令可以是 shell 命令、调用脚本或调用其他服务。
如何创建第一个 Workflow
- 创建一个新的文件
.github/workflows/my-first-workflow.yml
。 - 在文件中定义一个简单的构建任务,例如下面的示例代码:
name: My First Workflow
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v2
- name: Run a script
run: echo "Hello, World!"
该工作流文件定义了一个名为 My First Workflow
的工作流,它在每次代码推送时都会执行一个作业 build
。作业中包含两个步骤:一个是检查出代码仓库,另一个是运行一个简单的 shell 命令 echo "Hello, World!"
。
Github Actions 的文件结构
在 Github Actions 中,推荐将工作流文件放在项目的 .github/workflows
目录下。例如,一个典型的 .github/workflows
目录结构如下:
.github/
workflows/
ci.yml
cd.yml
pr.yml
其中,ci.yml
是用于持续集成的工作流文件,cd.yml
用于持续部署,pr.yml
用于处理 pull request。这种结构有助于将不同的工作流文件分开管理,便于阅读和维护。
Github Actions 的配置和使用
使用环境变量
环境变量可以用来存储敏感信息,如数据库密码、API 密钥等。可以通过 env
或 secrets
关键字来设置环境变量。
示例代码
name: Example
on: [push]
env:
NODE_ENV: production
API_KEY: ${{ secrets.API_KEY }}
jobs:
example:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v2
- name: Print environment variables
run: |
echo "Node Env: $NODE_ENV"
echo "API Key: $API_KEY"
该工作流文件定义了一个名为 Example
的工作流,它在每次代码推送时都会执行一个作业 example
。作业中包含两个步骤:检查出代码仓库和打印环境变量。
运行不同操作系统的作业
通过配置不同的运行器,可以在不同的操作系统上执行作业。例如,可以在 Ubuntu、Windows 或 macOS 上运行作业。
示例代码
name: Cross Platform Build
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v2
- name: Build for Ubuntu
run: echo "Building for Ubuntu"
test:
runs-on: windows-latest
steps:
- name: Check out the repository
uses: actions/checkout@v2
- name: Test on Windows
run: echo "Testing on Windows"
deploy:
runs-on: macos-latest
steps:
- name: Check out the repository
uses: actions/checkout@v2
- name: Deploy on macOS
run: echo "Deploying on macOS"
该工作流文件定义了一个名为 Cross Platform Build
的工作流,它在每次代码推送时都会执行三个作业:build
、test
和 deploy
。每个作业都在不同的操作系统上运行:build
在 Ubuntu 上运行,test
在 Windows 上运行,deploy
在 macOS 上运行。
利用第三方服务扩展功能
Github Actions 可以轻松地集成第三方服务,如发送通知、存储构建工件等。例如,可以使用 actions/upload-artifact
来上传构建工件。
示例代码
name: Upload Artifact
on: [push]
jobs:
build-and-upload:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v2
- name: Build project
run: |
mkdir build
echo "Building project in build directory"
- name: Upload build artifact
uses: actions/upload-artifact@v2
with:
name: build-artifact
path: build
该工作流文件定义了一个名为 Upload Artifact
的工作流,它在每次代码推送时都会执行一个作业 build-and-upload
。作业中包含三个步骤:检查出代码仓库、构建项目和上传构建工件。
工作流共享和复用
通过定义 reusable workflows,可以将频繁使用的任务定义为公共工作流,并在其他工作流中引用。这种方式可以简化工作流文件的管理和维护。
示例代码
在文件 .github/workflows/reusable-workflow.yml
中定义一个可重用的工作流:
name: Reusable Workflow
on:
workflow_call:
jobs:
check-requirements:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v2
- name: Install dependencies
run: npm ci
在其他工作流文件中引用该工作流:
name: Main Workflow
on: [push]
jobs:
main-job:
runs-on: ubuntu-latest
steps:
- name: Run reusable workflow
uses: ./.github/workflows/reusable-workflow.yml
利用事件触发器
除了默认的事件触发器,还可以自定义事件触发器,以满足更复杂的触发条件。例如,可以使用 schedule
关键字来定期执行工作流。
示例代码
在工作流文件中定义一个定时任务:
name: Scheduled Workflow
on:
schedule:
- cron: '0 0 * * *' # 每天午夜执行
jobs:
nightly-build:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v2
- name: Run nightly build
run: echo "Running nightly build"
该工作流文件定义了一个名为 Scheduled Workflow
的工作流,它会在每天午夜执行一个作业 nightly-build
,以运行夜间构建任务。
维护和调试工作流
为了提高工作流的可维护性,可以使用 logging
和 debug
选项来输出调试信息,以便于排查问题。
示例代码
在工作流文件中添加调试信息:
name: Debug Workflow
on: [push]
jobs:
debug-job:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v2
- name: Run debug script
run: |
echo "Debugging information:"
echo "VAR1=${VAR1}"
echo "VAR2=${VAR2}"
该工作流文件定义了一个名为 Debug Workflow
的工作流,它在每次代码推送时都会执行一个作业 debug-job
,以输出调试信息。
最佳实践和常见问题
1. 使用 matrix
进行并行测试
通过 matrix
,可以并行运行多个作业来加速测试。
示例代码
name: Parallel Test
on: [push]
jobs:
test:
strategy:
matrix:
node-version: [12.x, 14.x]
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- name: Test
run: npm test
该工作流文件定义了一个名为 Parallel Test
的工作流,它在每次代码推送时都会执行一个作业 test
。作业通过 matrix
并行运行多个版本的 Node.js 来测试。
2. 使用 self-hosted runners
自定义运行器
使用自托管运行器可以更好地控制运行环境和资源。
示例代码
name: Self-Hosted Runner
on: [push]
jobs:
build:
runs-on: self-hosted
steps:
- name: Check out the repository
uses: actions/checkout@v2
- name: Build
run: echo "Building on a self-hosted runner"
该工作流文件定义了一个名为 Self-Hosted Runner
的工作流,它在每次代码推送时都会执行一个作业 build
,并且该作业在自托管运行器上运行。
效率提升的小技巧
1. 使用 actions/cache
缓存依赖
使用 actions/cache
可以缓存依赖包,减少下载和构建时间。
示例代码
name: Cache Dependencies
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v2
- name: Cache dependencies
uses: actions/cache@v2
with:
path: ~/.npm
key: ${{ runner.os }}-node-modules-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-modules-
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
该工作流文件定义了一个名为 Cache Dependencies
的工作流,它在每次代码推送时都会执行一个作业 build
。作业中包含三个步骤:检查出代码仓库、缓存依赖包和安装和构建依赖。
2. 限制并发作业数量
通过 concurrency
限制并发作业数量,避免资源竞争。
示例代码
name: Limit Concurrency
on: [push]
jobs:
build:
concurrency: ${{ github.ref }}-${{ github.actor }}
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v2
- name: Build
run: echo "Building"
该工作流文件定义了一个名为 Limit Concurrency
的工作流,它在每次代码推送时都会执行一个作业 build
。通过 concurrency
限制了作业的并发数量。
学习和参考资源推荐
- 慕课网:慕课网提供了丰富的在线课程和教程,包括 Github Actions 的入门和进阶课程。
- 官方文档:Github Actions 的官方文档详细介绍了各种用法和配置选项,是学习和参考的重要资源。
- 社区论坛:Github 社区和 Stack Overflow 等论坛上有大量关于 Github Actions 的讨论和案例分享,可以帮助解决实际问题。
总的来说,Github Actions 是一个强大且灵活的 CI/CD 平台,通过合理配置和使用,可以大大提高软件开发的效率和质量。希望本文能够帮助你快速入门和深入了解 Github Actions。