Closed5

OneDevを試してみよう

dekimasoondekimasoon

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

The One DevOps Platform
Git Server with CI/CD, Kanban, and Packages.

https://onedev.io/

dekimasoondekimasoon

Kubernetes上にインストールしてみる

公式のHelm Chartがある。嬉しい。
なおOneDevはGithub上にもリポジトリが存在するが、これはミラーで、実際には https://code.onedev.io/ という場所ではOneDevを使って管理されている。Helm Chartのコードは以下。

https://code.onedev.io/onedev/server/~files/main/server-product/helm

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
dekimasoondekimasoon

アクセスしてみる

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による管理もできそう
    • マイルストーンも作成できる
dekimasoondekimasoon

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 Urlhttps://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/openid-configurationという形式らしい。

設定すると以下のようなCallbackURLが生成される。
cognitoのところはnameで設定した値が使われるっぽい。
これをCognitoUserPoolのクライアントの許可するCallbackURLに設定しておく。

https://example.com/~sso/callback/cognito

一度ログアウトすると、ログイン画面にLogin With Cognitoというボタンが増えている。
ボタンを押すとCognitoのログイン画面に遷移して、問題なくSSOできた!やった。

dekimasoondekimasoon

CIを試してみる

ドキュメントには記載が無いような気がするが、まずはExecutorを作ると思われる。
タイプにKubernetes Executor選んで、あとは任意の名前(今回はexecutor1にした)を付けたら、あとはデフォルト値で作成できた。Executorのテスト実行もできて、問題なく実行された。
どういう仕組みなのか興味があるが、いまは一旦動けばいいか。

あとはソースコード側に.onedev-buildspec.ymlというファイルを用意するとCIが動くらしい。
ちょっと書き方が分かりづらいな。

GUIでもStepを作成していけるらしい。
基本的にはコンテナ上で実行するものみたいだ。後でためそう。

このスクラップは16日前にクローズされました