怎么玩 Github Actions?

我也不知道什么时候接触的 Github Actions(简称 Actions),记得是因为本地一直构建不出来 Spigot 所以想到了本身服务器就在大陆以外的 Actions,并且通过模仿其他项目和查询 Github 的文档制作了 SpigotBuildAction

Github Actions 本意应该是配合 Github 本身的服务来达到持续集成和持续交付的目标,但是因为过于强大,所以被很多人用来当免费的算力使用,例如拿来给自己的京东签到等等。我的一个朋友曾经就有一个专门的项目收集这些奇奇怪怪的用法(LF112/gotAction)。但是因为这样子违背了 Github 的原意,所以经过一段时间的管理(封库,封号等),许多这类项目都或多或少的跑路了。提及这一段是为了让你明白那些事情是可以做的,但是那些事情又是不应该做的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle

name: Java CI with Gradle

on:
push:
branches: [ "1.18" ]
pull_request:
branches: [ "1.18" ]

permissions:
contents: read

jobs:
build:

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Build with Gradle
uses: gradle/gradle-build-action@0d13054264b0bb894ded474f08ebb30921341cee
with:
arguments: build

上面是 Github Actions “Java with Gradle” 的模板,我们拆开来看一下。

精读示例工作流程

首先最开始看到 “#” 的几行,很明显是注释。Github Actions 配置文件使用的是 YAML,所以要用 “#” 来作为注释的开头。

我谁啊?啥时候干什么啊?能干什么啊?

接下来是 name 字段,代表的是在项目的 Actions 页面里看到的名字,通常需要比较简略但是关键的描述这个工作流到底是干什么的。

然后是 on,代表工作流何时会被执行。这里写了 “push” 和 “pull_request”,分别代表代码从本地 push 到远端(Remote)时,和 Pull Request 被提交时。这里的 “branches” 是筛选器,代表在那个分支被 push 或者 pull_request 时执行,这是可以省略的(如下代码)。你可以参考触发工作流程触发工作流程事件

on: [push, fork, pull_request]

permissions 管理这个工作流程的权限。不太需要管他,你可以参考工作流程语法/权限。

粗略的讲一下我要干那些事?

从 jobs 开始,就是非常关键的工作流程具体内容了,通常只会包含一个 Job,例如这里的 build。里面的 runs-on 规定了运行的操作系统,通常为 ubuntu-latestwindows-latest

系统都来了,那我到底要干什么?

steps 是真正运行的指令和程序。Github 提供了直接执行控制台指令的 run 和使用其他用户已经帮你封装好的库 use。

踩在巨人的肩膀上!

Github Actions 最奇妙的部分莫过于很多东西只需要引用别人封装好的 Action 就行了,例如 “Set up JDK 11” 就是很好的例子。你只需要通过 with 传入参数,他就帮你吭哧吭哧的把 JDK 给下下来装好了。这里的 use 代表的是一个 Github 项目,你可以直接在前面加上 Github URL 去看看这个项目到底是什么内容,例如 “actions/setup-java@v3” 就是 https://github.com/actions/setup-java

自己当巨人

虽然这个示例中没有使用到 run,但是为了方便,我还是很常用到直接 run 来跑的步骤,例如 Gradle Build(如下)。但是你一定要注意使用到的脚本文件能不能在你要的系统上执行,例如 gradlew 在 *nix 系统上很有可能就没有执行的权限,要配合 chmod 来用!

1
2
3
steps:
- name: Build Artifact
run: gradlew build

那么有那些巨人是常用到的呢?

根据我自己的需求,我常会用到这些库。actions 组织是 Github Actions 官方发布的库,可以放心使用。

库名称 介绍内容
actions/checkout 将项目代码拉取到本地,非常非常常用!难道你项目都没代码的么?
actions/setup-java 将 JDK 安装到本地,通常被 JVM 平台的项目使用。
actions/upload-artifact 将构建结果或者日志上传到 Action 页面。
marvinpinto/action-automatic-releases 将结果放到新的 Release 中。按需选择,推荐使用 upload-artifact