github中action作用和讲解

1,简介

GitHub Actions 是 GitHub 的一个自动化功能,它允许你在 GitHub 仓库中自动执行软件开发工作流程。你可以使用 GitHub Actions 来执行各种任务,比如:

  1. 自动测试:每当代码被推送到仓库时,自动运行测试来确保代码质量。
  2. 持续集成:自动构建和部署代码,确保新的代码更改不会破坏现有功能。
  3. 代码格式化:自动格式化代码,以保持代码风格的一致性。
  4. 自动部署:将代码部署到服务器或云平台。
  5. 自动化发布:自动创建版本发布和更新软件包。
  6. 监控:监控应用程序和基础设施,以确保它们正常运行。
  7. 自动化工作流:创建复杂的工作流,以自动化多个步骤和任务。

GitHub Actions 通过定义在 .github/workflows 目录中的 YAML 文件来配置。这些工作流可以触发于各种事件,如推送、拉取请求、定时任务等。你可以使用 GitHub 提供的预设操作(actions),也可以创建自己的自定义操作。

2,如何使用action

使用 GitHub Actions 来自动化你的工作流程涉及几个步骤,下面是基本的流程:

  1. 创建工作流文件

    • 在你的 GitHub 仓库中,找到或创建一个名为 .github/workflows 的目录。
    • 在这个目录下,创建一个新的 YAML 文件来定义你的工作流。文件名可以是任意的,但必须以 .yml.yaml 结尾。
  2. 定义工作流内容

    • 工作流文件的基本结构包括触发器(on)、作业(jobs)和步骤(steps)。
    • 触发器定义了何时运行工作流,例如,当代码被推送到仓库时。
    • 作业是工作流中的一个执行单元,它可以包含多个步骤。
    • 步骤是作业中的单个任务,比如运行脚本或使用操作(action)。
  3. 使用操作(Actions)

    • 操作是 GitHub Actions 的核心,它们是可重用的代码片段,用于执行特定的任务。
    • 你可以使用社区提供的现成操作,或者创建自己的操作。
    • 在步骤中,通过 uses 关键字指定要运行的操作。
  4. 配置工作流

    • 你可以配置工作流以使用不同的环境变量、设置权限、使用不同的运行器(如不同的操作系统或硬件配置)等。
  5. 运行工作流

    • 一旦你推送了工作流文件到仓库,工作流就会根据你定义的触发器自动运行。
    • 你可以在 GitHub 仓库的 "Actions" 标签页中查看工作流的运行状态和历史。
  6. 调试和修改

    • 如果工作流运行失败,你可以查看日志来调试问题。
    • 根据需要调整工作流文件,然后再次推送以测试更改

下面是一个简单的 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 工作流。

相关推荐
编码小袁32 分钟前
深入了解Git、GitHub、GitLab及其应用技巧
git·gitlab·github
油泼辣子多加2 小时前
2024年11月8日Github流行趋势
github
Cachel wood2 小时前
Github配置ssh key原理及操作步骤
运维·开发语言·数据库·windows·postgresql·ssh·github
王解21 小时前
Jest项目实战(4):将工具库顺利迁移到GitHub的完整指南
单元测试·github
油泼辣子多加21 小时前
2024年11月4日Github流行趋势
github
梓羽玩Python1 天前
推荐一款用了5年的全能下载神器:Motrix!全平台支持,不限速下载网盘文件就靠它!
程序员·开源·github
小牛itbull1 天前
ReactPress:重塑内容管理的未来
react.js·github·reactpress
鱼满满记2 天前
1.6K+ Star!GenAIScript:一个可自动化的GenAI脚本环境
人工智能·ai·github
梦魇梦狸º2 天前
腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
docker·容器·github
Huazie2 天前
一篇搞定 Hexo Diversity 主题接入!支持多主题自由切换!
javascript·github·hexo