decadence

個人のメモ帳

2022年にOSS活動した便利機能3選

これは何

2022年に自身がOSS活動した中で、個人的に便利だなと思っている機能を紹介したいと思う。

便利機能3選

FairwindsOps/polaris: 一部のcheckのみを走らせられる

github.com

Polaris | Open Source Policy Engine for Kubernetes は、 Gatekeeper 同様、k8s resourceのpolicy制御を行ってくれるツールである。これはadmission controllerとしてk8sへdeployすることも可能だし、それ以外にもコマンドラインツールとしてファイルを検査することも可能だ。polaris自体が提供するpre-definedなpolicyで基本的なsecurityを担保しつつ、自身でopenapiを用いてpolicyを記述することでカスタムチェックを作成することも出来る。

FOLIOではpolarisでカスタムチェックを定義することにより、プラットフォーム上各アプリケーションチームに必ず定義して欲しい設定を静的検査でdeploy前にチェック出来るような仕組みを提供している。*1

アプリケションチームが書くyamlpolarisのカスタムチェックで検査するのは、そのままpolarisを実行するだけで済む。また、カスタムチェック自体が正しい実装になっているのかは、これもpolarisを実行することでテストが出来る。当初polarisでは配置されているチェックを全て実行することは出来たのだが、特定のチェックのみを走らせることが出来なかった。そのため、カスタムチェック自体のテストをする際に、全てのカスタムチェックを満たすyamlを書かねばならず、ユニットテストを書くにも他の処理に依存してしまうという問題があった。

そこでこのPRでは、特定のcheckのみを走らせられる機能を追加した。実運用においては、ディレクトリ毎にテストケースを用意+ディレクトリをなめつつ特定のカスタムチェックのみをテストすることで、カスタムチェックのユニットテストが他のカスタムチェックに依存しない形で書くことが出来るようになった。

runatlantis/atlantis: 一部のrepoのみlockをdisableに

github.com

Terraform Pull Request Automation | Atlantis は、terraformとvcsを連携してGithub Flowなどにterraformを実行するタイミングを組み込めるツールである。具体的には、PR作成webhookを受け取りterraform planを実行 → PR review → PR commentに terraform apply と記述することで反映 → PR merge のようなフローを実現出来る。

atlantisにはterraformが提供するlockとは別の独自のlockの仕組みがある。複数名が同じtf fileなどを編集した場合、先に出されたPRがlockを保持し、そのPRがmergeされるかunlockするまでは他のPRはplan/applyが実行出来ない。本番環境などで意図しない反映をしないためにもこのlockは大事なのだが、開発環境で複数名が同時に開発を行う際には少し邪魔になることがある。もともとatlantisではサーバ起動時に --disable-repo-locking を指定するとlockを取らない状態には出来たが、環境毎にlockをon/offすることが出来なかった。

上記のPRでは、サーバ設定でもrepository側の設定でも、任意の環境においてlockをon/offすることが出来るようにした。これにより、開発環境branchをtargetにする場合はlockを取らない、本番環境branchをtargetにする場合はlockを取るといったことが可能になる。*2

argoproj/argo-workflows: navbarの色を変えられる

github.com

Argo Workflows - The workflow engine for Kubernetesk8s nativeなworkflow engineである。このPRでやったことは、navbarの色を設定で変えれるようにしただけだ。なぜnavbarの色を変えたいのかというと、環境毎にargo workflowが立つ場合に意図せず他の環境で作業することを避けたい、といった思いがあるからだ。

これは便利機能としてとりあげたものの、取り込まれるまでに紆余曲折があった。

argo-cdとの差異

Argo Project · GitHub にはargo-workflows以外に有名所として Argo CD - Declarative GitOps CD for Kubernetes なども存在する。argo-cdの場合、設定でcustom cssをそのまま当てることができるため、環境毎に色を変えたいならそれを設定すれば良い。argo-workflowsにも色を変えたい要望がissueとしてあげられた際、argo-cd相当の実装が作成されたこともあった。一方でメンテナとしてはcustom cssはupgrade時に表示が壊れうるなどの理由から、より簡潔な設定で出来るようにしたいという思いがあった。その結果、上記のPRではargo-cdとは異なり「navbarの色を指定する」だけの設定を追加することで実現した。

rxjs major upgrade

argo-workflowsのUIには、argoprojとしての共通componentである GitHub - argoproj/argo-ui: Argoproj shared React components が利用されている。今回navbarの色を変えるにあたり、argo-ui側に実装のあるnavbarに対してcssを当てれるようにする必要があった。reactで提供されているargo-uiに対してpropsを追加して、更新されたargo-uiをargo-workflowsに取り込めば完成である。

がしかし、当時のargo-workflowsはargo-uiに暫く追従出来ていない問題があった。argo-cd側の開発なども進む中でargo-uiも更新されていくのだが、argo-workflows側では特にあげる理由がなかったため古いargo-uiに依存していた。その状態からnavbar更新の変更を取り込もうとすると、見事にlibraryのversion差異などで簡単には取り込めない。

特に顕著なものが、rxjsであり、これをメジャーアップデートしなければ先へは進めなかった(のでやった)。

chore: upgrade argo-ui v2.5.0 by krrrr38 · Pull Request #7598 · argoproj/argo-workflows · GitHub

この記事は FOLIO Advent Calendar 2022 - Adventar としても記述した。株式会社FOLIOでは、自分たちのサービスを安心・安全に運用していくためにOSSへの貢献なども行いつつ、「技術と想像で"未来の金融"の礎となる」Visionを掲げて事業を展開しています。このようなサービス開発に興味があれば、カジュアル面談からでもお話させてください。

corp.folio-sec.com

*1:具体的にはgitlab-ciで静的検査のciを行うtemplateなどを配布していたりするのだが、これは誰かがいつか書いてくれるはず

*2:書いている時点ではまだmergeされていないが