Gitea 1.19.0 包含了一个新功能,叫做 Gitea Actions。 这是一个 Gitea 内置的 CI 系统,类似于 GitHub Actions,并与其兼容。
这篇博客将介绍 Gitea Actions 的一些细节,包括如何使用它以及它是如何工作的。 需要注意的是,文中的信息是基于当前版本的,所以可能会在未来过时。
如何使用
在 Feature Preview: Gitea Actions,我们已经讨论过如何试用它。 但是,随着开发工作的推进,有一些情况已经变了,所以我们有必要重新梳理一下。
配置 Gitea 实例
首先,你需要一个 Gitea 实例,版本为 1.19.0 或更高。 你可以参考文档来安装一个新的实例,或者升级你现有的实例。 无论你已什么方式安装或运行 Gitea,都可以启用 Actions。
Actions 功能默认是禁用的(因为它仍然是一个正在开发中的功能),所以你需要在配置文件中添加以下内容来启用它:
[actions]
ENABLED=true
如果你想了解更多配置信息,或者在配置过程中遇到了问题,请参考Configuration Cheat Sheet。
配置 Runner
我们有一个基础版本的 Gitea Actions Runner,叫做 act runner。 它是基于 act 项目实现的.
目前,安装 runner 的方式仅限于自行编译或者使用预编译的二进制文件。 我们还没有提供 Docker 镜像或其他基于包管理安装方式。 启动 runner 也是简单地通过命令行执行。 当然,你也可以自行将这个二进制文件包装成比如系统服务、supervisord 或 Docker 容器的来方便运行。
但在你包装它开始之前,我们建议你先将它作为命令行运行一下,以确保它能够在你的环境中正常工作,特别是如果你是在本地主机上运行 runner。 此外,如果条件允许,我们建议将 runner 部署在独立的机器上,以避免与 Gitea 实例争用资源而影响后者运行。
另外,确保你已经安装了 Docker。 虽然 Docker 不是严格必须的,但是通常情况下我们需要它。 我们将在后面讨论这个问题。
在启动一个 runner 执行任务之前,你需要先将它注册到你的 Gitea 实例上,命令如下:
./act_runner register --no-interactive --instance <instance> --token <token>
这里有两个必需参数,instance
和 token
。
instance
是你的 Gitea 实例的地址,比如 http://192.168.8.8:3000
或 https://gitea.com
。
runner 自身和 job 容器(runner 启动的用于执行任务的容器)将会连接到这个地址。
这意味着它可以与 Gitea 实例的 ROOT_URL
不一样,后者是用于 web 访问的。
注意,使用 127.0.0.1
或 localhost
这样的回环地址是一个糟糕的做法,我们将在后面讨论为什么。
如果你不确定使用该哪个地址,那么使用局域网地址通常情况下不会有错。
token
是用于识别和认证的,形如 P2U1U0oB4XaRCi8azcngmPCLbRpUGapalhmddh23
。
它是一次性的,不能用于注册多个 runner。
你可以在 your_gitea.com/admin/runners
页面获取 token。
如果你不能看到这个页面,那么可能是你使用的 Gitea 版本不正确,或者没有启用 Actions。 请检查上面的步骤。
注册完成后,一个名为 .runner
的新文件将会出现在当前目录。
这个文件存储了注册信息。
请不要手动编辑它。
如果这个文件丢失或损坏,你可以直接删除它并重新注册。
最后,我们可以启动 runner 了。
./act_runner daemon
然后,你可以在 Gitea 实例的管理页面看到新的 runner:
你想了解更多的注册参数,可以查看 gitea/act_runner。
使用 Actions 执行任务
即使 Actions 功能在实例上已经启用,代码仓库仍然是默认禁用 Actions 的。
你可以在仓库的设置页面启用它:
接下来就比较复杂了,你需要学习 workflow 语法 并编写你想要的 workflow 文件。
但别担心,我们可以先从一个简单的例子开始:
name: Gitea Actions Demo
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
on: [push]
jobs:
Explore-Gitea-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🎉 The job was automatically triggered by a ${{ gitea.event_name }} event."
- run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!"
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- name: Check out repository code
uses: actions/checkout@v3
- run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- name: List files in the repository
run: |
ls ${{ gitea.workspace }}
- run: echo "🍏 This job's status is ${{ gitea.status }}."
你可以将这个文件保存为 YAML 文件并上传到仓库的 .gitea/workflows/
目录下,例如 .gitea/workflows/demo.yaml
。
你可以已经注意到了,这个文件和 Quickstart for GitHub Actions 中的示例文件非常相似。
这是因为 Gitea Actions 在设计上就是为了与 GitHub Actions 尽可能兼容。
注意,这个示例文件使用了一些 emoji。
请确保你的数据库支持它们,特别是在使用 MySQL 时。
如果字符集不是 utf8mb4
,将会出现错误,例如 Error 1366 (HY000): Incorrect string value: '\\xF0\\x9F\\x8E\\x89 T...' for column 'name' at row 1
。
请参阅 Database Preparation。
或者,你可以使用不带 emoji 的这个示例:
name: Gitea Actions Demo
run-name: ${{ gitea.actor }} is testing out Gitea Actions
on: [push]
jobs:
Explore-Gitea-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "The job was automatically triggered by a ${{ gitea.event_name }} event."
- run: echo "This job is now running on a ${{ runner.os }} server hosted by Gitea!"
- run: echo "The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- name: Check out repository code
uses: actions/checkout@v3
- run: echo "The ${{ gitea.repository }} repository has been cloned to the runner."
- run: echo "The workflow is now ready to test your code on the runner."
- name: List files in the repository
run: |
ls ${{ gitea.workspace }}
- run: echo "This job's status is ${{ gitea.status }}."
on: [push]
一行表示这个 workflow 会在你推送提交时触发。
然而,当你上传这个文件时,它本身就会触发一个提交,所以你应该在 Actions 标签页中看到已经存在一个新的任务。
干得漂亮!你已经成功用上 Actions 了。
问答
为什么 Actions 不是默认启用的?
我们知道启用 Actions(尤其是每个仓库都要单独启用)很烦人,但是,并不是每个人都喜欢或需要这个功能。 我们希望让用户自己决定是否启用它。
我们应该在 workflow 文件中使用 ${{ github.xyz }}
还是 ${{ gitea.xyz }}
?
你可以使用 github.xyz
,Gitea 也能正常工作。
正如上面提到的,Gitea Actions 的设计目标就是与 GitHub Actions 尽可能兼容。
但是,我们建议你使用 gitea.xyz
,以避免存在歧义(确保这个 workflow 在 Gitea 上使用,而不是 GitHub)。
不过还是得说明下,这是可选的,因为两个写法到目前为止效果是一样的。
可以只给特定的组织或仓库注册 runner 吗?
当然可以,这取决于你从哪里获取注册令牌。
/admin/runners
: 这是实例级 runner,它会为实例中的所有仓库运行任务。/org/<org>/settings/runners
: 这是组织级 runner,它会为组织中的所有仓库运行任务。/<owner>/<repo>/settings/runners
: 这是仓库级 runner,它只会为它们所属的仓库运行任务。