テック

GitHub Actionsでエクセルファイルの差分をPRコメントする

Excelファイルの差分をプルリクエストにコメントするGitHub Actoinsのワークフローを作りました。

完成形

GitHub Actionsのコードは以下になります。

name: CI for excel diff
on:
  pull_request:
    branches:
      - 'main'
    types: [opened, synchronize, closed]

permissions:
  id-token: write
  contents: read
  pull-requests: write

jobs:
  comment_diff:
    runs-on: ubuntu-latest
    env:
      TIKA_VERSION: 2.7.0
      BASE_BRANCH: main
      DIFF_PATH: 'docs/*.xlsx'
    steps:
      - name: Switch to pull request branch
        uses: actions/checkout@v3
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Fetch base branch
        run: git fetch origin ${BASE_BRANCH}:${BASE_BRANCH}

      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Set up tika
        run: |
          curl -s -o /usr/local/bin/tika.jar --create-dirs -L "https://archive.apache.org/dist/tika/${TIKA_VERSION}/tika-app-${TIKA_VERSION}.jar"

      - name: Run actions using diff_files
        run: |
          git config --global diff.openxml.textconv ./scripts/unopenxml

          echo "DIFF<<EOF" >> $GITHUB_ENV
          git diff ${BASE_BRANCH} HEAD -- "${DIFF_PATH}" >> $GITHUB_ENV
          echo "EOF" >> $GITHUB_ENV

      - name: comment
        uses: marocchino/sticky-pull-request-comment@v2
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          header: diff excel files
          message: |
            <details>
              <summary>Show Diff Excel Files</summary>

              ```
              ${{ env.DIFF }}
              ```

            </details>
#!/bin/sh
java -jar /usr/local/bin/tika.jar -t "$1"
*.xlsx diff=openxml

差分の見え方の例

セルの変更

例えば、以下のようにセルの内容を変更します。

上記エクセルをPRすると、以下のように変更した行に対しての差分内容がコメントされます。

行の追加

以下のように行を追加します。

上記エクセルをPRすると、以下のように差分内容がコメントされます。

行の削除

以下のように行を削除します。

上記エクセルをPRすると、以下のように差分内容がコメントされます。

解説

バイナリファイルのExcelファイルをテキストベースで差分比較するため、Apache Tikaを使いました。

Apache Tika™ツールキットは、1000種類以上のファイルタイプ(PPT、XLS、PDFなど)からメタデータやテキストを検出し、抽出します。これらのファイルタイプはすべて、単一のインターフェースで解析することができ、Tikaは、検索エンジンのインデックス作成、コンテンツ分析、翻訳など、さまざまな用途に役立ちます。

引用元:https://tika.apache.org/ (原文訳)

また、.gitattributesで.xlsxファイルに対するdiffは、tikaでテキスト化した結果を日あっ区するように指定しています。

*.xlsx diff=openxml
#!/bin/sh
java -jar /usr/local/bin/tika.jar -t "$1"

上記をGitHub Actionsで使うため、main.yamlで以下コマンドを実行しています。

...
      - name: Run actions using diff_files
        run: |
          git config --global diff.openxml.textconv ./scripts/unopenxml

今回の例では、docsディレクトリ配下の*.xlsxファイルの差分を検出しPRにコメントするようにしています。

実際に差分表示に用いたリポジトリ

また、実際のPRは以下になります。

コピペ利用は全く問題ありませんので、是非ご活用ください。

参考リンク

PR

ビッグデータ分析