CIでYamlをチェック&修正しよう

👉 はじめに

数ヶ月前、私たちはソースコードのCI & CDをGithub.comに移行する作業を始めました。

その後、開発チームと運用チームはソースコードの移行作業に着手しました。

しかし運用チームがGitHub.comへと多くのAnsible関連のリポジトリを移行するということになり、私たちはYamlのリントとコード品質を活用したかったのです。

運用チームは移行プロセスを完全にコード駆動でテスト可能なものとして開発し始めました。

必要になったのは、以下のような膨大な量のコード管理でした:

  • 1️⃣ リント (構文の妥当性、でもキー重複や行の長さ、末尾のスペース、インデントなどの変な問題やコスメティックな問題)
  • 2️⃣ 大量のリントのフィードバックを修正/実装 (あまりにも多くて手作業ではできないほど)

運用チームは以下のアプローチを取り入れました:

  • 1️⃣ リントyamllintを使って
  • 2️⃣ 修正yamlfixerを使って、これは実際にはコアとしてyamllintを使っています

開発チームと運用チームは日々の業務でyamlを多用しているので(k8sCIの設定Spring Bootの設定など)、私たちは次のことを考え始めました。

すべてのCIパイプラインに組み込むことができる共通のツールボックスを考える。

私たちには以下のことが必要でした:

  1. 運用チームのソースコードを統合(DevOPSのチームワーク
  2. 専用のGHアクションとしてパッケージ化して、誰もが数行のコードでパイプラインに追加できるようにする

🛠️ Yaml Fixer

運用チームはcliから便利に使えるようにyamlfixerの大きな作業を行いました。

yamllintの報告による問題を自動的に修正するためにその出力を解析

yamlfixeryamllintの報告による問題を自動的に修正し、その出力を解析します。

以下はyaml-test-suiteで実行されたyamlfixerのスクリーンショットです:

yamlfixer's screenshot

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としてイメージをプッシュしました:
Image description

🏃 GHアクションとして配布

そして今、私たちは公開GHアクションを実装するためにDockerイメージを使用することができます:

GitHub logo 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は以下を作成します:

  1. yamlfixer/patch/$branch_nameという名前の新しいブランチ
  2. 作業ブランチにマージされるプルリクエスト

以下はMarketplaceでリリースされる有用なリソースです:

Image description

🤖 アクションの使い方

任意のワークフローでアクションを使用するために必要なコードは(そして... それは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

Image description

✔️ GHアクションからの有効なPR

Image description

そしてコード変更のレビュー:

Image description

🪙 ROI

今では、開発チームも運用チームも積極的にCIの助けを借りてyamlの品質を高めており、yamlの品質問題はGitHub Issue上の私たちの日々のワークフローで管理されています。

👉 また、GHアクションを使用しているすべてのチームが組織全体で同じ品質レベルを持っていることにも注目してください。

🙏 謝辞 🧑‍🤝‍🧑

この作業を実現させたチーム全体に感謝します。すべてが私たちのDEVOPSパイプライン上で行われました: