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 工作流。

相关推荐
A洛2 小时前
Cloudflare Pages 部署 Next.js 应用教程
开发语言·github·nextjs·cloudflare·cloudflarepages
bigbig猩猩20 小时前
GitHub上克隆项目
github
落难Coder1 天前
为你的 Github 仓库引入自动构建的Github Pages静态页面
github
shiming88792 天前
GitHub上克隆项目
github
小程爱敲代码2 天前
github远程仓库环境搭建及使用
github
绘绘~2 天前
PDF扫描版文字识别OCR
pdf·开源·github·ocr
stormsha2 天前
github高级搜索
github
程序员-杨胡广3 天前
Redis重要知识点:哨兵是什么?哨兵如何选择Redis主服务器
redis·git·bootstrap·github
马卫斌 前端工程师3 天前
如何从github上clone项目
github
代码之光_19803 天前
Spring Boot校园管理系统:技术选型与架构设计
spring boot·后端·github