#gitlab #runner #jobs #interaction #build #phase #helper

构建 gitlab-runner

构建自定义 gitlab 运行器的辅助库

11 个版本

0.1.0 2024 年 5 月 17 日
0.0.8 2023 年 1 月 13 日
0.0.7 2022 年 10 月 18 日
0.0.5 2022 年 5 月 16 日
0.0.1 2021 年 9 月 26 日

#168构建工具

每月 <42 次下载

MIT/Apache 协议

79KB
2K SLoC

gitlab-runner-rs

一个库,帮助构建自定义 gitlab 运行器实现。

自定义运行器的实现

总体思路是,这个库处理与 gitlab 服务器的所有交互并驱动执行,而运行器实现则专注于如何处理来自 gitlab 的作业。

对于自定义运行器的实现者来说,重点是实现异步的 JobHandler 特性,该特性在作业执行期间会被调用。一个绝对最小化的运行器可以这样实现

use gitlab_runner::{outputln, GitlabLayer, RunnerBuilder, JobHandler, JobResult, Phase};
use tracing_subscriber::prelude::*;
use std::path::PathBuf;

#[derive(Debug)]
struct Run {}

#[async_trait::async_trait]
impl JobHandler for Run {
      async fn step(&mut self, script: &[String], phase: Phase) -> JobResult {
          outputln!("Running script for phase {:?}", phase);
          for s in script {
            outputln!("Step: {}", s);
          }
          Ok(())
      }
}

#[tokio::main]
async fn main() {
    let (layer, jobs) = GitlabLayer::new();

    // By default show logs from my_runner and warnings, the gitlab_runner::gitlab::job span which
    // sets the gitlab.job field is always enabled regardless of the over all log level.
    let env = std::env::var("RUNNER_LOG").unwrap_or_else(|_| "my_runner=info,warn".to_string());
    let envfilter = tracing_subscriber::EnvFilter::builder()
        .parse(&env)
        .unwrap_or_else(|_| panic!("Failed to parse RUNNER_LOG env var: {env}"))
        .add_directive("gitlab_runner::gitlab::job=error".parse().unwrap());

    tracing_subscriber::Registry::default()
        .with(
            tracing_subscriber::fmt::Layer::new()
               .pretty()
               .with_filter(envfilter),
        )
        .with(layer)
        .init();
    let mut runner = RunnerBuilder::new(
        "https://gitlab.example.com".try_into().expect("failed to parse url"),
        "runner token",
        "/tmp",
        jobs
    )
    .build()
    .await;
    runner.run(move | _job | async move { Ok(Run{}) }, 16).await.unwrap();
}

在设置跟踪订阅者时,应仅使用每层过滤,以确保不会过滤掉旨在发送给 gitlab 的日志。对于其他日志输出,应始终启用 gitlab_runner::gitlab::job 目标,以获取包含 gitlab 作业 id 的 gitlab.job 字段。

创建 Gitlab 运行器

这个库不支持在 GitLab 服务器上创建新的运行器。这可以通过使用 运行器创建 API 或在 GitLab 的 运行器管理网页界面 中手动完成。请确保遵循带有身份验证令牌的运行器创建工作流程,因为注册令牌工作流程已被弃用。

创建运行器时提供的参数之一是 run_untagged=false(或在网页界面中不选中 Run untagged jobs 复选框),这将使运行器 选取与它的标签匹配的作业。这很重要,以防止运行器选取它无法处理的“常规”作业。

当创建运行器时,GitLab 会提供一个以 glrt- 开头的身份验证令牌。这个令牌应提供给运行器以用于其 GitLab 连接。

可以使用类似于以下 curl 命令来验证令牌

curl --request POST "https://GITLAB_URL/api/v4/runners/verify"  \
  --form "token=AUTHENTICATION_TOKEN"

此步骤是可选的。

依赖关系

~15-29MB
~470K SLoC