CIでYamlをチェック&修正しよう
👉 はじめに
数ヶ月前、私たちはソースコードのCI & CDをGithub.comに移行する作業を始めました。
その後、開発チームと運用チームはソースコードの移行作業に着手しました。
しかし運用チームがGitHub.comへと多くのAnsible関連のリポジトリを移行するということになり、私たちはYamlのリントとコード品質を活用したかったのです。
運用チームは移行プロセスを完全にコード駆動でテスト可能なものとして開発し始めました。
必要になったのは、以下のような膨大な量のコード管理でした:
- 1️⃣ リント (構文の妥当性、でもキー重複や行の長さ、末尾のスペース、インデントなどの変な問題やコスメティックな問題)
- 2️⃣ 大量のリントのフィードバックを修正/実装 (あまりにも多くて手作業ではできないほど)
運用チームは以下のアプローチを取り入れました:
開発チームと運用チームは日々の業務でyaml
を多用しているので(k8s、CIの設定、Spring Bootの設定など)、私たちは次のことを考え始めました。
すべてのCIパイプラインに組み込むことができる共通のツールボックスを考える。
私たちには以下のことが必要でした:
- 運用チームのソースコードを統合(DevOPSのチームワーク)
- 専用のGHアクションとしてパッケージ化して、誰もが数行のコードでパイプラインに追加できるようにする
🛠️ Yaml Fixer
運用チームはcli
から便利に使えるようにyamlfixerの大きな作業を行いました。
yamllintの報告による問題を自動的に修正するためにその出力を解析
yamlfixerはyamllintの報告による問題を自動的に修正し、その出力を解析します。
以下はyaml-test-suiteで実行されたyamlfixerのスクリーンショットです:
yamlfixer
をインストールする最も簡単な方法は、以下に記述されているようにpypiからです。
🐧 Linuxインストール
python3 -m pip install yamlfixer-opt-nc
🪟 Windowsインストール
python -m pip install yamlfixer-opt-nc
pipx
セットアップ
最適な体験を得るためにはpipx
の利用をお勧めします。
インストールするために:
pipx install yamlfixer-opt-nc
pipx list
アップグレードするために:
pipx upgrade yamlfixer-opt-nc
アンインストールするために:
pipx uninstall yamlfixer-opt-nc
このソフトウェアは自動的にyamllint
が報告した一部のエラーや警告を修正します。
usage: yamlfixer [-h] [-v] [-b] [-B BACKUPSUFFIX] [-d] [-D DIFF_FILE] [-e EXTENSIONS] [-f]
[-F] [-l] [-N] [-n] [-r LEVEL] [-j | -p | -s] [-t TABSIZE]
[-c CONFIG_FILE | -C CONFIG_DATA]
[FILE_or_DIR [FILE_or_DIR ...]]
YAMLドキュメントのフォーマット問題を修正します。ファイルが指定されていない場合は、入力を読み込みます
・・・
それでもまだこのcli
は使うためにPythonの実行環境が必要でした。
🐳 Dockerイメージとして配布
次に私たちはより簡単に配る方法を求めました、つまり:
Dockerイメージとしてパッケージングする。
その時、開発チームはGH CIでDockerリリースを実装し、DockerHubにoptnc/yamlfixerとしてイメージをプッシュしました:
🏃 GHアクションとして配布
そして今、私たちは公開GHアクションを実装するためにDockerイメージを使用することができます:
opt-nc / yamlfixer-action
yamllintによって報告されたいくつかのエラーや警告を修正し、修正内容を含むプルリクエストを作成するGithubアクション
このgithub-actionはYamlfixer
ツールに基づいています:
@tamere-allo-peter
さんによって開発・統合された@mbarre
さんによってGithubアクションとして統合された
これはyamllint
によって報告されたいくつかのエラーや警告を自動的に修正し、修正を含むプルリクエストを作成します。
🧰 使い方
action.ymlを参照してください。
検査されたリポジトリにプルリクエストを作成する権限を持っているGithubアカウントが必要です。
以下に、冗長モードで各プッシュごとにyaml
ファイルをチェックする例を示します:
name: Lint yaml files
on: [push]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout my app
uses: actions/checkout@v3
- name: Lint yaml files
uses: opt-nc/yamlfixer-action
with:
options: --summary
user: ${{secrets.my_user}}
token: ${{secrets.my_user_password}}
github-actionは以下を作成します:
yamlfixer/patch/$branch_name
という名前の新しいブランチ- 作業ブランチにマージされるプルリクエスト
以下はMarketplaceでリリースされる有用なリソースです:
🤖 アクションの使い方
任意のワークフローでアクションを使用するために必要なコードは(そして... それはyaml
🐔🥚🐣)こちらです:
name: Lint yaml files
on: [push]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout my app
uses: actions/checkout@v2
- name: Lint yaml files
uses: opt-nc/yamlfixer-action
with:
yaml_file: .github/*.yml
options: --verbose
user: ${{secrets.my_user}}
token: ${{secrets.my_user_password}}
👉 このアクションは新しいブランチと作業ブランチにマージされるプルリクエストを作成するため、このコードの活動は他のソースコードの提案と同じように管理しレビューすることができます。
言葉より実際に見た方がわかりやすいので、専用リポジトリでGithubアクションが実行される様子をぜひご覧ください:
📷 例を詳しく見る
❌ リント失敗のため拒否されたPR
✔️ GHアクションからの有効なPR
そしてコード変更のレビュー:
🪙 ROI
今では、開発チームも運用チームも積極的にCIの助けを借りてyaml
の品質を高めており、yaml
の品質問題はGitHub Issue上の私たちの日々のワークフローで管理されています。
👉 また、GHアクションを使用しているすべてのチームが組織全体で同じ品質レベルを持っていることにも注目してください。
🙏 謝辞 🧑🤝🧑
この作業を実現させたチーム全体に感謝します。すべてが私たちのDEVOPSパイプライン上で行われました:
- コア
Yaml Fixer
開発者・統合者のJerome ALETさん - DockerパッケージングとGHアクション開発のMichèle BARREさん
- DockerHubでの公開テスト及びこの新しいGHアクションに対する継続的なフィードバックを提供しているDaniel SANTOSさん
こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/optnc/let-ci-check-fix-your-yamls-kfa