OneDevを試してみよう

GitlabをセルフホストしてみたがHelm Chartが巨大すぎて保守が怖くなった。
あまり知られていないが、オープンソースのGit ServerであるOneDevを試してみたいと思う。
公式ページの謳い文句がかっこいい。
The One DevOps Platform
Git Server with CI/CD, Kanban, and Packages.

Kubernetes上にインストールしてみる
公式のHelm Chartがある。嬉しい。
なおOneDevはGithub上にもリポジトリが存在するが、これはミラーで、実際には https://code.onedev.io/ という場所ではOneDevを使って管理されている。Helm Chartのコードは以下。
values.yamlをみると300行弱だ。Gitlabと比べてもかなり少ない。ありがたい。
DBだけでいけるっぽい。mysql
, mariadb
, postgresql
, mssql
を利用可能らしい。
とりあえず外部のDBは使わずに、Helmで一緒に作られるMySQLで動かしてみよう。
例によってPulumiで定義。
import * as k8s from "@pulumi/kubernetes"
import * as pulumi from "@pulumi/pulumi"
export type KubernetesOneDevArgs = {
domain: string
}
export class KubernetesOneDev extends pulumi.ComponentResource {
public opts: pulumi.ResourceOptions
public namespace: k8s.core.v1.Namespace
public release: k8s.helm.v3.Release
public httpRoute!: k8s.apiextensions.CustomResource
constructor(
name: string,
args: KubernetesOneDevArgs,
opts?: pulumi.ResourceOptions,
) {
super("stack8:kubernetes:OneDev", name, undefined, opts)
this.opts = { ...opts, parent: this }
this.namespace = new k8s.core.v1.Namespace(
"namespace",
{
metadata: {
name: "onedev",
},
},
this.opts,
)
this.release = new k8s.helm.v3.Release(
"release",
{
chart: "onedev",
namespace: this.namespace.metadata.name,
version: "10.3.0",
repositoryOpts: {
repo: "https://dl.cloudsmith.io/public/onedev/onedev/helm/charts/",
},
values: {},
},
{
...this.opts,
// FIXME:
// It always comes up as a diff, so we'll make it an ignore target once.
// We want to investigate.
ignoreChanges: ["checksum"],
},
)
}
}
pulumi upして結果を待つ。30秒ほどでpodが立ち上がった。
なんとonedevというpodが1つ立ち上がっているのみ。Gitlabと比較してなんてシンプルなんだ。
ありがたや。
✗ kubectl get all -n onedev
NAME READY STATUS RESTARTS AGE
pod/release-b3afdc3f-onedev-0 1/1 Running 0 60s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/release-b3afdc3f-onedev ClusterIP 172.20.213.77 <none> 80/TCP,22/TCP 60s
NAME READY AGE
statefulset.apps/release-b3afdc3f-onedev 1/1 60s
ボリュームはこんな感じ。
標準のgp2になっているから、後でgp3に変えておきたい。
100Giは大きいな。でもアップロードファイルとか全部をここに置くのか。
有料ラインセンスだとS3に置き場を変えられるらしい。
✗ kubectl get pvc -n onedev
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-release-b3afdc3f-onedev-0 Bound pvc-89facb78-1c3f-4778-a34f-8fb54a47fda8 100Gi RWO gp2 4m28s

アクセスしてみる
HTTP Route(GatewayAPI)で外部からアクセスできるようにしてアクセスしてみる。
初回アクセス時にadminユーザーを作成できるらしい。いい感じだ。
adminユーザー作成直後の画面はこんな感じ。
色々設定できそうだけど、まずはリポジトリを作ってみる。
リポジトリ=Projectという感じっぽい。test
というProjectを作る。OK。
次にcloneしてみる。
UI上からAcccess Tokenが作成する。Tokenの権限はユーザーの権限と同じになるっぽい。
どこにもclone用のURLが出て無くて戸惑ったが、以下のようにドメイン + プロジェクト名 + .git
でいけた。
例によってユーザー名とパスを聞かれるのでadmin
と作成したAccess Tokenを使った。
$ git clone https://example.com/test.git
pushも問題なくできることを確認。
差分を作ってPRの画面を見てみる。
コメントの対象を行単位ではなく、文字単位にできる。ちょっと新鮮。
良い感じである。嬉しい機能としては以下な感じ。
git、Issue管理、packages管理、CIだけが必要であれば良さそう。
- 最低限だけど見やすくて良い
- Issue管理が割と充実している
- 親子関係も作れそう。それなりに見やすいかもしれない。
- Issue作成時のカスタムなフィールドを設定することもできそう
- Issueテンプレートも作成できそう
- Kanbanによる管理もできそう
- マイルストーンも作成できる

Single Sign Onを試してみる
OneDevはOpenIDやLDAPによる認証が行えるらしい。
Administration > Authentication Source > Single Sign On から認証プロバイダの設定ができそう。
複数いけるっぽい。
認証元は標準のOpenID以外にも、GithubとかDiscordとかが選べるっぽい。
今回はCognito UserPoolを使いたいのでOpenIDを選んだ。
必要な設定に情報は以下
- name (任意の値でOK)
- Configuration Discovery Url
- Client Id
- Client Secret
Cognitoの場合Configuration Discovery Url
はhttps://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/openid-configuration
という形式らしい。
設定すると以下のようなCallbackURLが生成される。
cognito
のところはnameで設定した値が使われるっぽい。
これをCognitoUserPoolのクライアントの許可するCallbackURLに設定しておく。
一度ログアウトすると、ログイン画面にLogin With Cognito
というボタンが増えている。
ボタンを押すとCognitoのログイン画面に遷移して、問題なくSSOできた!やった。

CIを試してみる
ドキュメントには記載が無いような気がするが、まずはExecutorを作ると思われる。
タイプにKubernetes Executor
選んで、あとは任意の名前(今回はexecutor1にした)を付けたら、あとはデフォルト値で作成できた。Executorのテスト実行もできて、問題なく実行された。
どういう仕組みなのか興味があるが、いまは一旦動けばいいか。
あとはソースコード側に.onedev-buildspec.yml
というファイルを用意するとCIが動くらしい。
ちょっと書き方が分かりづらいな。
GUIでもStepを作成していけるらしい。
基本的にはコンテナ上で実行するものみたいだ。後でためそう。