データファイルの更新、コミット対プルリクエスト


一度は、このポストが他の誰かに役立つことができるならば、私は少し疑問に思います.私のコンテキストはかなり具体的だと思います.とにかく、それがケースであるならば、ここにあります.
マイJet Train プロジェクトはGTFS . GTFSは一般的なトランジットフィード仕様を表します.これは、公共交通機関のスケジュールと関連する地理情報をモデル化します.
gtfsは2種類のデータ,静的データ,動的データに基づいている.静的データは、変更されるかもしれないが、例えば、輸送機関とバスステーションをめったにしない.彼らは静的なファイルとしてダウンロードする必要があるとして利用可能です.前に、デモを実行するたびに、ダウンロードして上書きしなければなりませんでした.
開発者として、怠惰であり、このタスクを自動化したい.そのためにgithubアクションを使いました.
name: Refresh Dataset
on:
  schedule:
    - cron: '12 2 * * 1'                                                     # 1
jobs:
  build:
    name: Refresh Dataset
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2                                            # 2
      - name: Fetch dataset archive
        un: curl -o archive.zip https://api.511.org/transit/datafeeds\?api_key\=${ {secrets.FIVEONEONE_API_KEY} }\&operator_id\=RG  # 3
      - name: Extract archive
        run: unzip -o -d ./infrastructure/data/current/ archive.zip          # 4
      - name: Add & commit
        uses: stefanzweifel/git-auto-commit-action@v4                        # 5
        with:
          commit_message: Update to latest data files
          add_options: '-u'
  • 毎週実行する
  • リポジトリのチェックアウト
  • 静的データファイルアーカイブを取得する
  • アーカイブからファイルを展開する
  • 使用するgit-auto-commit アクション
  • 直接コミットすることは問題ではない.実際、それはコードではなくデータです.コードは、ランタイムで例外を発生させることから予期しないデータを防ぐために、すべてのビルトインガードを持っている必要があります.私は既にいくつかの驚きを以前に持っていて、多くの防御プログラミング技術を適用しました.
    しかし、上記の自動化に満足できませんでした.
  • 私はデモを実行する必要があるかどうかに関係なく、毎週、コミットが発生します.それは不必要なコミットの多くを作成します.それは私が毎週頻繁に行動をスケジュールした理由です.
  • 行動は月曜日に予定されている.私が金曜日にデモを実行するならば、私はとにかくデータファイルをアップデートする必要があります.
  • したがって、私は別のアプローチに切り替えることを決めた.コミットの代わりに、スクリプトを更新してプルリクエストを開きました.デモを実行する必要がある場合は、私はそれをマージします(ローカルプル);そうでなければ、それは開いたままでいます.オープンされたPRが既に存在するならば、アクションはそれを上書きします.今、私はより頻繁に行動をスケジュールすることができます.
    name: Refresh Dataset
    on:
      schedule:
        - cron: '12 2 * * *'                                                     # 1
    jobs:
      build:
        name: Refresh Dataset
        runs-on: ubuntu-latest
        steps:
          - name: Checkout
            uses: actions/checkout@v2                                            # 2
          - name: Fetch dataset archive
            run: curl -o archive.zip https://api.511.org/transit/datafeeds\?api_key\=${ {secrets.FIVEONEONE_API_KEY} }\&operator_id\=RG  # 3
          - name: Extract files of interest from the archive
            run: unzip -o -j archive.zip agency.txt routes.txt stop_times.txt stops.txt trips.txt -d ./infrastructure/data/current  # 4
          - name: Remove archive
            run: rm archive.zip                                                  # 5
          - name: Create PR
            uses: peter-evans/create-pull-request@v3                             # 6
            with:
              commit-message: Update to latest data files
              branch: data/refresh
              delete-branch: true
              title: Refresh data files to latest version
              body: ""
    
  • 毎日行動する
  • リポジトリのチェックアウト
  • 静的データファイルアーカイブを取得する
  • アーカイブから必要なファイルのみを抽出する
  • クリーンアップ用のアーカイブファイルを削除する
  • 使用するcreate-pull-request アクション.アクションは、自動的にすべての新しい更新ファイルを含むPRを作成しますそれが私がいくつかのファイルを抽出し、アーカイブを削除する理由です.
  • 私が紹介で言及したように、私はこのポストが多くの人々を助けることができると確信しません.それがするならば、どうか私にあなたのユースケースについて知らせさせてくださいとコメントすることを躊躇しないでください.
    この投稿の完全なソースコードはGithubにあります.

    ヘーゼルキャスト / ジェットトレイン



    ジェット列車


    このプロジェクトはHazelcast Jet , データストリーミングエンジンHazelcast IMDG .
    これは、ほぼリアルタイムでベイエリアの公共交通機関の位置が表示されます.
    ノート
    スイスの公共交通機関を展示するために使用された
    残念ながら、スイスのデータプロバイダはGTFS - RT
    図1.デモスクリーンショット
    テクノロジスタックは以下の通りである.

  • Hazelcast Jet

  • Hazelcast IMDG

  • Kotlin コード用

  • Spring Boot webappの場合

  • Maven ビルドシステム用
  • 全体構造


    プロジェクトには、いくつかのモジュールが含まれています.
    名称
    説明commonモジュール間で共有されるコードinfrastructure静的データファイルを含みます.また、Dockerlocal-jet前のモジュールの代替として、IDEの内部でデバッグできるローカルジェットインスタンスを起動しますload-staticメモリ内のファイルから静的データを読み込む

    View on GitHub
    当初公開A Java Geek 2021年8月15日