0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laminar CI - Jenkins代替

Last updated at Posted at 2024-09-16

はじめに

CI/CDツールのうち, オンプレミスで動作して, Dockerコンテナを起動するタイプではないものは限られています. 巨大なフレームワークやSDKを扱う場合や, Windows上のSDKしか提供されていない場合, Dockerコンテナ越しでCI/CDを行うことは大変です.

Jenkins

オンプレミスでDockerコンテナに依存しないCIツールとして, Jenkinsが有名ですが, 私が欠点と思っているのは次です.

  • ジョブをコードとして管理することが難しい
    • シェルスクリプトにするか, GroovyのDSLにすればできる
    • GroovyのDSLはローカル実行できないので, 開発・保守が非常に手間
  • 不安定
    • 多く要求される機能でもプラグインで対応する体制なので, 更新停止, 脆弱性・不具合の放置がよくある
    • うっかりJenkinsを更新しようものなら, プラグインが対応していなくて環境が崩壊する
    • "何もしていないのに動かなくなりました"が本当に起きる

OSSなんだから不満は自分から改善するように働きかければ?というのは, 私が自動化・CI/CDに興味がないのでモチベーションが湧かないのです.

Laminar

Laminar(GitHub)を試してみます.
LaminarはLinux専用のCIツールです. Laminarの役割は待ち行列に積まれたジョブを実行し, ジョブの出力とステータスの集計・保存, それらをHTMLに整形することです.
ジョブ管理, VCSとの連携や定期実行などの機能はありません. ジョブの記述はシェルスクリプト, 定期実行はcronなどを使います.

インストール

Windowsで使いたいので, WSL上にインストールします.

aptやrpmのパッケージもありますが, 依存するバージョンのlibcapnpがDebian Bookwormになかったため, ソースからビルドします.

依存パッケージとビルドツールをインストールします.

sudo apt install git capnproto cmake g++ libboost-dev libcapnp-dev libsqlite3-dev make rapidjson-dev zlib1g-dev pkg-config

インストール時に, systemdのサービス設定もコピーされます.

git clone https://github.com/ohwgiles/laminar.git
cd laminar
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr
make -j "$(nproc)"
# Warning: the following will overwrite an existing /etc/laminar.conf
sudo make install
sudo mkdir -p /var/lib/laminar

WSLのsystemd

systemdで動かしたいので, /etc/wsl.confにsystemdサポートを追加しておきます.

/etc/wsl.conf
[boot]
systemd=true

Laminarサービス

/lib/systemd/system/laminar.serviceの実行ユーザを変更します. ローカルで動かすことにするので, ユーザはrootとします.

[Service]
User=root
sudo systemctl start laminar
sudo systemctl enable laminar

設定

バインドアドレス等を設定する場合は, /etc/laminar.confを編集します.

ジョブ

ジョブは/var/lib/laminar/cfg/jobs以下に, 拡張子.runで作成します. 中身はシェルスクリプトです.

echosleepするだけの簡単なジョブhello.runを作成してみます.
バイナリファイルでも起動できるようにということか, シェル経由で実行ではなくプロセス起動だと思われます. 実行権限を与えないとエラーになります.

sudo mkdir -p /var/lib/laminar/cfg/jobs
sudo touch /var/lib/laminar/cfg/jobs/hello.run
sudo chmod a+x /var/lib/laminar/cfg/jobs/hello.run

次のような, ジョブを作成します.

hello.run
#!/usr/bin/bash -ex
echo 'start hello'
sleep 10
echo 'finish hello'

CLIツールlaminarcでキューにジョブを入れます.

laminarc queue hello

Web UI

デフォルトでは, http://localhost:8080でWeb UIを確認できます.

トップ画面では各種統計が表示されます.
laminar00.jpg

ジョブのコンソールログも確認できます.
laminar01.jpg

CLIツール

laminarc <command>の形式で, 操作・情報表示ができます.

コマンド
queue [JOB [PARAMS...]]... ひとつ以上のジョブをキューに入れる. --nextをJOBの前に付けると, キューの先頭に入れる.
start [JOB [PARAMS...]]... ひとつ以上のジョブを開始する. ジョブが開始されるまで待つ.
run [JOB [PARAMS...]]... ひとつ以上のジョブを実行する. 全てのジョブが終了するまで待つ.
set [VARIABLE=VALUE]... ひとつ以上の環境変数を設定する. $JOBと$RUNが同一な以降のスクリプトにエクスポートされる
show-jobs ジョブ一覧を表示する ($LAMINAR_HOME/cfg/jobs/*.run).
show-running 実行中のジョブを表示する
show-queued キューで待機中のジョブを表示する
abort JOB NUMBER 実行中のジョブを強制終了する

ジョブの書き方

公式ドキュメントから, 必要そうなシナリオを実現する方法です.

定期実行

cronに登録します.

0 3 * * * LAMINAR_REASON="Nightly build" laminarc queue hello

ジョブチェイン

ジョブを連鎖させたい場合は, laminarc queueをスクリプト内に書けばよいです.

#!/usr/bin/bash -xe
if [ ... ]; then
  laminarc run example-downstream-special
else
  laminarc run example-downstream-regular
fi

ジョブのパラメータ

ジョブ名の後に, パラメータ名=値を付けるとスクリプトに渡される.

laminarc queue example foo=bar
#!/usr/bin/bash
if [ "$foo" == "bar" ]; then
   ...
else
   ...
fi

共通処理

/var/lib/laminar/cfg/scriptsがPATHに追加されるためヘルパースクリプトを置いておくと便利です.

Windowsのバッチや実行ファイルを起動

WSLから直接起動もできますが, パスや環境変数の扱いに詰まることがあるので, SSH経由の方が安定している印象です.

TODO:SSH経由の詳細

まとめ

今のところ安定性はJenkinsより良いと思います. すでに枯れたLinuxのツールを組み合わせるので, 将来環境が壊れるという心配も少ないです.
環境移行も設定やスクリプト群とSQLiteのファイルひとつをコピーするだけなので簡便です.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?