ハッカー向け開発環境「TSYSTEM」の紹介


自己紹介

僕は、中学生の頃にプログラミングを始め、高校は通信制高校に通いながら、都内のベンチャー企業で働いていました。2022年の3月に在学中の慶應SFCを卒業し、現在はフリーランスのエンジニアをしながら、趣味で自作OSSソフトウェアを作り続けています。

はじめに

僕は今までLinux PCを使い続けていて、環境構築でシェルコマンドを毎日叩いていました。PCは10年間で6回買い替え、その度に環境構築のやり直しをしていました。そのタイミングで、使い慣れた環境は一旦リセットされ、ソフトウェアのバージョンが合わずエラーに悩まされたりしてきました。PCが壊れる可能性は誰にでもあり、その度に、おぼろげに覚えているソフトウェアを手順をググりながら、インストールする必要があり、仕事の納期が近い時でも、環境復元に時間をかけなければなりません。

これを解決するために、まず思い浮かぶのは、Docker, Ansible, Chefなどの環境構築ソフトウェアですが、個人的に、ソフトウェアのインストールやファイル操作の度にレシピファイルを書き換えるのは手間がかかります。

そこで僕は、実行したシェルコマンドをすぐに保存し、他のPCに順番に実行させることにより、環境構築を自動で行ってくれる、使いやすいツールが必要だと考えました。それが、僕がOSSとして開発した「TSYSTEM」です。

TSYSTEMとは?

TSYSTEMとは、エンジニアの使ってるCUIの開発環境を、ハッカーOSのようにカスタマイズするためのツールです。コアの機能は大きく分けて以下の通りです。

  • CUIで行った処理の手順をGithubに保存
  • 新しいPCにコマンド一つで全て復元
  • 複数の端末間での環境の同期
  • コマンド一つで最新のソフトウェアに更新

このコアの機能は全てシェルスクリプトで書かれていて、自分の環境に応じて自分で書き換えたり、拡張することができます。

例えば、updateコマンド実行時に、自分がインターネットからダウンロードしたソフトウェアまで、まとめて最新にしたい場合、updateコマンドをすぐに書き換えることができます。

TSYSTEMの仕組み

TSYSTEMは、PCへの変更を全てシェルスクリプトとして作成し、Githubに保存することでバックアップを取ります。

GithubからPullすることによって、複数端末で同期をすることができます。

ユーザーのGithubのSSH Keyさえあれば、コマンド一つで、GithubからTSYSTEMをcloneし、今までの保存された変更を順番に実行します。

GithubにPushすることによって、バックアップが完了します。

動作環境

以下の動作を確認しています。

  • M1 Mac
  • Ubuntu

インストール

1. 自分のGithubアカウントにSSH Keyを登録して、秘密鍵をPC内に用意します。

2. 自分のGithubに以下のプライベートリポジトリを作成します。

  • tsystem
  • tbin

3. tsystem-installerを使い、PCにTSYSTEMをインストールします。
以下のコマンドを実行し、CUIの案内に従って入力します。

bash <(curl -sL https://bit.ly/3y63bdG)

使い方

apt, yum, homebrewパッケージのインストール

tsys install <PACKAGE NAME>

パッケージがインストールされると同時に、インストールしたパッケージ名が~/tsystem/package.txtに記録されます。このpackage.txtは、更新と復元時にソフトウェアを全てインストール済みの状態にするために生成されます。

環境の変更の保存

tsys migrate add <MIGRATION TITLE> # 変更するためのシェルスクリプトの編集
tsys migrate # シェルスクリプト実行
tsys save # シェルスクリプトの保存

例: rustのインストール

tsys migrate add rust-install

これを実行すると、

~/tsystem/migration/20211227-111214-rust-install.sh

のようなファイルが生成され、vimで開かれます。

そのシェルスクリプトに、rustの公式サイトに載っているインストールコマンドを書きます。

#!/bin/bash

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

保存したら、以下のコマンドでそのシェルスクリプトを実行します。

tsys migrate

正常に実行されたかを確認し、失敗していたら、先ほどのシェルスクリプトを編集し、再度実行します。実行する前に、~/tsystem/migrated.txtを編集し、シェルスクリプト名を削除します。

正常に実行されたら、変更の差分を確認します。

tsys status # 生成されたファイルの差分

tsys status package # package.txtの差分

そのシェルスクリプトをGithubに保存します。

tsys save

このコマンドは、変更差分をGitでコミットして、Pushしています。

更新

tsys update

このコマンド一つで以下を行います。

  • apt, yum, homebrewなどのパッケージマネージャー本体の更新
  • パッケージマネージャにインストールされているソフトウェアの更新
  • 他のTSYSTEMで保存された変更差分の実行

高度な使い方

 binディレクトリの保存

自作のシェルスクリプトやコマンドなどを、一つのbinディレクトリに保存して、git管理すると、常に全てのマシンで使い慣れたCUI環境が再現できます。複数行のコマンドを一つのコマンドとして保存するフローが出来上がれば、最速で仕事を完了させることが可能です。

 パッケージ化

TSYSTEMでは、tsystem module managerという簡易的な独自パッケージ管理システムがあります。それを使うと、同じくTSYSTEMを使ってるユーザー向けに、ソフトウェアのインストール手順を公開できます。

tsystem module managerの使い方については、次の記事で公開したいと思います。

なぜハッカー向け開発環境と呼べるか

もちろんカーネルを作ったわけでも、Linuxディストリビューションを開発したわけでもないですが、僕は、自作コマンドや自動化を日々Githubにアップロードしています。その自作コマンドがどんな時でもすぐに使えて、大抵の作業をコマンド数行実行するだけで完了してしまいます。自分のPCを自分が一番使いやすいようにカスタマイズするワークフローを提供するのがこのTSYSTEMです。

僕はこのTSYSTEMを自分のマシンで運用し始めてから3年が経ちましたが、PCを買い替えるときに作業が止まらなかったのは、TSYSTEMを使っていたからだと断言できます。

また、日々自作した自動化コマンドは、READMEを書けば公開できるので、作業の自動化や高速化ができる上にGithubの実績にもなって一石二鳥です。

もしどんなコマンドを作ってきたか、気になる方は、僕のGithubをご覧ください。