1,简介
GitHub Actions 是 GitHub 的一个自动化功能,它允许你在 GitHub 仓库中自动执行软件开发工作流程。你可以使用 GitHub Actions 来执行各种任务,比如:
- 自动测试:每当代码被推送到仓库时,自动运行测试来确保代码质量。
- 持续集成:自动构建和部署代码,确保新的代码更改不会破坏现有功能。
- 代码格式化:自动格式化代码,以保持代码风格的一致性。
- 自动部署:将代码部署到服务器或云平台。
- 自动化发布:自动创建版本发布和更新软件包。
- 监控:监控应用程序和基础设施,以确保它们正常运行。
- 自动化工作流:创建复杂的工作流,以自动化多个步骤和任务。
GitHub Actions 通过定义在 .github/workflows
目录中的 YAML 文件来配置。这些工作流可以触发于各种事件,如推送、拉取请求、定时任务等。你可以使用 GitHub 提供的预设操作(actions),也可以创建自己的自定义操作。
2,如何使用action
使用 GitHub Actions 来自动化你的工作流程涉及几个步骤,下面是基本的流程:
-
创建工作流文件:
- 在你的 GitHub 仓库中,找到或创建一个名为
.github/workflows
的目录。 - 在这个目录下,创建一个新的 YAML 文件来定义你的工作流。文件名可以是任意的,但必须以
.yml
或.yaml
结尾。
- 在你的 GitHub 仓库中,找到或创建一个名为
-
定义工作流内容:
- 工作流文件的基本结构包括触发器(
on
)、作业(jobs
)和步骤(steps
)。 - 触发器定义了何时运行工作流,例如,当代码被推送到仓库时。
- 作业是工作流中的一个执行单元,它可以包含多个步骤。
- 步骤是作业中的单个任务,比如运行脚本或使用操作(action)。
- 工作流文件的基本结构包括触发器(
-
使用操作(Actions):
- 操作是 GitHub Actions 的核心,它们是可重用的代码片段,用于执行特定的任务。
- 你可以使用社区提供的现成操作,或者创建自己的操作。
- 在步骤中,通过
uses
关键字指定要运行的操作。
-
配置工作流:
- 你可以配置工作流以使用不同的环境变量、设置权限、使用不同的运行器(如不同的操作系统或硬件配置)等。
-
运行工作流:
- 一旦你推送了工作流文件到仓库,工作流就会根据你定义的触发器自动运行。
- 你可以在 GitHub 仓库的 "Actions" 标签页中查看工作流的运行状态和历史。
-
调试和修改:
- 如果工作流运行失败,你可以查看日志来调试问题。
- 根据需要调整工作流文件,然后再次推送以测试更改
下面是一个简单的 GitHub Actions 工作流示例,它在每次推送到 main
分支时运行一个简单的 Node.js 脚本:
name: Node.js CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
uses: actions/checkout@v3
name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: '14'
run: npm ci
run: npm run build
在这个例子中:
name
定义了工作流的名称。on
指定了触发工作流的事件,这里是push
事件。jobs.build
定义了一个名为build
的作业。runs-on
指定了运行作业的虚拟机环境。steps
定义了作业中的步骤,包括检出代码、设置 Node.js 环境、安装依赖和构建项目。
3, 实例
以下是一个编译Android13的工作流:
name: Build Kernel - Android 13
on:
push:
branches: ["main", "ci", "checkci"]
paths:
".github/workflows/build-kernel-a13.yml"
".github/workflows/gki-kernel.yml"
".github/scripts/build_a13.sh"
"kernel/**"
pull_request:
branches: ["main"]
paths:
".github/workflows/build-kernel-a13.yml"
".github/workflows/gki-kernel.yml"
".github/scripts/build-a13.sh"
"kernel/**"
workflow_call:
jobs:
build-kernel:
if: github.event_name != 'pull_request' && github.ref != 'refs/heads/checkci'
strategy:
matrix:
include:
- version: "5.10"
sub_level: 189
os_patch_level: 2023-11
- version: "5.10"
sub_level: 198
os_patch_level: 2024-01
- version: "5.10"
sub_level: 205
os_patch_level: 2024-03
- version: "5.10"
sub_level: 209
os_patch_level: 2024-05
- version: "5.10"
sub_level: 210
os_patch_level: 2024-06
- version: "5.10"
sub_level: 214
os_patch_level: 2024-07
- version: "5.10"
sub_level: 218
os_patch_level: 2024-08
- version: "5.15"
sub_level: 123
os_patch_level: 2023-11
- version: "5.15"
sub_level: 137
os_patch_level: 2024-01
- version: "5.15"
sub_level: 144
os_patch_level: 2024-03
- version: "5.15"
sub_level: 148
os_patch_level: 2024-05
- version: "5.15"
sub_level: 149
os_patch_level: 2024-07
- version: "5.15"
sub_level: 151
os_patch_level: 2024-08
uses: ./.github/workflows/gki-kernel.yml
secrets: inherit
with:
version: android13-${{ matrix.version }}
version_name: android13-{{ matrix.version }}.{{ matrix.sub_level }}
tag: android13-{{ matrix.version }}-{{ matrix.os_patch_level }}
os_patch_level: ${{ matrix.os_patch_level }}
patch_path: ${{ matrix.version }}
upload-artifacts:
needs: build-kernel
runs-on: ubuntu-latest
if: ${{ ( github.event_name != 'pull_request' && github.ref == 'refs/heads/main' ) || github.ref_type == 'tag' || github.ref == 'refs/heads/ci' }}
env:
CHAT_ID: ${{ secrets.CHAT_ID }}
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
MESSAGE_THREAD_ID: ${{ secrets.MESSAGE_THREAD_ID }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
COMMIT_URL: ${{ github.event.head_commit.url }}
RUN_URL: {{ github.server_url }}/{{ github.repository }}/actions/runs/${{ github.run_id }}
steps:
- name: Download artifacts
uses: actions/download-artifact@v4
- uses: actions/checkout@v4
with:
path: KernelSU
fetch-depth: 0
- name: List artifacts
run: |
tree
- name: Download prebuilt toolchain
run: |
AOSP_MIRROR=https://android.googlesource.com
BRANCH=main-kernel-build-2024
git clone $AOSP_MIRROR/platform/prebuilts/build-tools -b $BRANCH --depth 1 build-tools
git clone $AOSP_MIRROR/kernel/prebuilts/build-tools -b $BRANCH --depth 1 kernel-build-tools
git clone $AOSP_MIRROR/platform/system/tools/mkbootimg -b $BRANCH --depth 1
pip3 install telethon
- name: Set boot sign key
env:
BOOT_SIGN_KEY: ${{ secrets.BOOT_SIGN_KEY }}
run: |
if [ ! -z "$BOOT_SIGN_KEY" ]; then
echo "$BOOT_SIGN_KEY" > ./kernel-build-tools/linux-x86/share/avb/testkey_rsa2048.pem
fi
- name: Bot session cache
id: bot_session_cache
uses: actions/cache@v4
if: false
with:
path: scripts/ksubot.session
key: ${{ runner.os }}-bot-session
- name: Build boot images
run: |
export AVBTOOL=$GITHUB_WORKSPACE/kernel-build-tools/linux-x86/bin/avbtool
export GZIP=$GITHUB_WORKSPACE/build-tools/path/linux-x86/gzip
export LZ4=$GITHUB_WORKSPACE/build-tools/path/linux-x86/lz4
export MKBOOTIMG=$GITHUB_WORKSPACE/mkbootimg/mkbootimg.py
export UNPACK_BOOTIMG=$GITHUB_WORKSPACE/mkbootimg/unpack_bootimg.py
cd $GITHUB_WORKSPACE/KernelSU
export VERSION=(((git rev-list --count HEAD) + 10200))
echo "VERSION: $VERSION"
cd -
bash $GITHUB_WORKSPACE/KernelSU/.github/scripts/build_a13.sh
- name: Display structure of boot files
run: ls -R
- name: Upload images artifact
uses: actions/upload-artifact@v4
with:
name: boot-images-android13
path: Image-android13*/*.img.gz
check-build-kernel:
if: (github.event_name == 'pull_request' && !github.event.pull_request.draft) || github.ref == 'refs/heads/checkci'
strategy:
matrix:
include:
- version: "5.10"
sub_level: 218
os_patch_level: 2024-08
- version: "5.15"
sub_level: 151
os_patch_level: 2024-08
uses: ./.github/workflows/gki-kernel.yml
with:
version: android13-${{ matrix.version }}
version_name: android13-{{ matrix.version }}.{{ matrix.sub_level }}
tag: android13-{{ matrix.version }}-{{ matrix.os_patch_level }}
os_patch_level: ${{ matrix.os_patch_level }}
patch_path: ${{ matrix.version }}
对上面的工作流文件的详细解释:
工作流名称
name: Build Kernel - Android 13:定义了工作流的名称。
触发器 on
push:当向 main、ci 或 checkci 分支推送代码时触发。
pull_request:当向 main 分支发起拉取请求时触发。
workflow_call:允许其他工作流调用此工作流。
paths:指定了触发工作流的文件路径,只有当这些文件被修改时,工作流才会运行。
作业 jobs
build-kernel:定义了一个名为 build-kernel 的作业。
if:条件语句,用于确定何时运行作业。这里排除了 pull_request 事件和 checkci 分支。
strategy.matrix:定义了一个矩阵策略,用于生成不同的作业变体。每个变体都有不同的 version、sub_level 和 os_patch_level。
uses:指定了要使用的另一个工作流文件 gki-kernel.yml。
secrets:设置为 inherit,意味着这个作业将继承父工作流的所有秘密(如 API 密钥等)。
with:传递参数到 gki-kernel.yml 工作流。
上传工件 upload-artifacts
needs:指定这个作业依赖于 build-kernel 作业。
runs-on:指定在 ubuntu-latest 虚拟机上运行。
if:条件语句,用于确定何时运行这个作业。这里包括了主分支的推送、标签的创建或 ci 分支的推送。
env:定义了环境变量,这些变量通常用于配置通知或其他脚本。
steps:定义了作业的步骤,包括下载工件、检出代码、列出工件、下载预构建工具链、设置引导签名密钥、缓存机器人会话、构建引导镜像、显示引导文件结构和上传引导镜像工件。
检查构建 check-build-kernel
if:条件语句,用于确定何时运行这个作业。这里包括了非草稿的拉取请求或 checkci 分支。
strategy.matrix:定义了一个矩阵策略,用于生成不同的作业变体。
uses:指定了要使用的另一个工作流文件 gki-kernel.yml。
with:传递参数到 gki-kernel.yml 工作流。