kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

act: GitHub Actions のワヌクフロヌをロヌカル環境で実行する

GitHub Actions でワヌクフロヌを実行するずきに git commit ず git push を実行しお GitHub Actions の実行を埅぀こずがよくあるより迅速に実行しお結果を受け取るために「act」を䜿っお GitHub Actions をロヌカル環境コンテナで実行する仕組みを詊しおみた䟿利だったので玹介しようず思う❗

圓然ながら GitHub Actions を完党再珟できおるわけではなく最終的には GitHub Actions を䜿うこずにはなるけど特に開発䞭に頻繁にテストを実行できるのはメリットだず思ううたく䜵甚しながら開発䜓隓を高めよう👌

github.com

セットアップ

macOS の堎合は Homebrew を䜿っお簡単にセットアップできる他には Chocolatey (Windows) や Bash script も遞べる今回は act 0.2.40 ず Docker Desktop 4.16.1 を䜿う

$ brew install act

$ act --version
act version 0.2.40

act コマンドには倚くのオプションがある以䞋に茉せおおく

$ act --help
Run GitHub actions locally by specifying the event name (e.g. `push`) or an action name directly.

Usage:
  act [event name to run] [flags]

If no event name passed, will default to "on: push"
If actions handles only one event it will be used as default instead of "on: push"

Flags:
  -a, --actor string                                      user that triggered the event (default "nektos/act")
      --artifact-server-addr string                       Defines the address to which the artifact server binds. (default "10.0.0.6")
      --artifact-server-path string                       Defines the path where the artifact server stores uploads and retrieves downloads from. If not specified the artifact server will not start.
      --artifact-server-port string                       Defines the port where the artifact server listens. (default "34567")
  -b, --bind                                              bind working directory to container, rather than copy
      --bug-report                                        Display system information for bug report
      --container-architecture string                     Architecture which should be used to run containers, e.g.: linux/amd64. If not specified, will use host default architecture. Requires Docker server API Version 1.41+. Ignored on earlier Docker server platforms.
      --container-cap-add stringArray                     kernel capabilities to add to the workflow containers (e.g. --container-cap-add SYS_PTRACE)
      --container-cap-drop stringArray                    kernel capabilities to remove from the workflow containers (e.g. --container-cap-drop SYS_PTRACE)
      --container-daemon-socket string                    Path to Docker daemon socket which will be mounted to containers (default "/var/run/docker.sock")
      --container-options string                          Custom docker container options for the job container without an options property in the job definition
      --defaultbranch string                              the name of the main branch
      --detect-event                                      Use first event type from workflow as event that triggered the workflow
  -C, --directory string                                  working directory (default ".")
  -n, --dryrun                                            dryrun mode
      --env stringArray                                   env to make available to actions with optional value (e.g. --env myenv=foo or --env myenv)
      --env-file string                                   environment file to read and use as env in the containers (default ".env")
  -e, --eventpath string                                  path to event JSON file
      --github-instance string                            GitHub instance to use. Don't use this if you are not using GitHub Enterprise Server. (default "github.com")
  -g, --graph                                             draw workflows
  -h, --help                                              help for act
      --input stringArray                                 action input to make available to actions (e.g. --input myinput=foo)
      --input-file string                                 input file to read and use as action input (default ".input")
      --insecure-secrets                                  NOT RECOMMENDED! Doesn't hide secrets while printing logs.
  -j, --job string                                        run a specific job ID
      --json                                              Output logs in json format
  -l, --list                                              list workflows
      --no-recurse                                        Flag to disable running workflows from subdirectories of specified path in '--workflows'/'-W' flag
      --no-skip-checkout                                  Do not skip actions/checkout
  -P, --platform stringArray                              custom image to use per platform (e.g. -P ubuntu-18.04=nektos/act-environments-ubuntu:18.04)
      --privileged                                        use privileged mode
  -p, --pull                                              pull docker image(s) even if already present
  -q, --quiet                                             disable logging of output from steps
      --rebuild                                           rebuild local action docker image(s) even if already present
      --remote-name string                                git remote name that will be used to retrieve url of git repo (default "origin")
      --replace-ghe-action-token-with-github-com string   If you are using replace-ghe-action-with-github-com  and you want to use private actions on GitHub, you have to set personal access token
      --replace-ghe-action-with-github-com stringArray    If you are using GitHub Enterprise Server and allow specified actions from GitHub (github.com), you can set actions on this. (e.g. --replace-ghe-action-with-github-com =github/super-linter)
  -r, --reuse                                             don't remove container(s) on successfully completed workflow(s) to maintain state between runs
      --rm                                                automatically remove container(s)/volume(s) after a workflow(s) failure
  -s, --secret stringArray                                secret to make available to actions with optional value (e.g. -s mysecret=foo or -s mysecret)
      --secret-file string                                file with list of secrets to read from (e.g. --secret-file .secrets) (default ".secrets")
      --use-gitignore                                     Controls whether paths specified in .gitignore should be copied into container (default true)
      --userns string                                     user namespace to use
  -v, --verbose                                           verbose output
      --version                                           version for act
  -w, --watch                                             watch the contents of the local repo and run when files change
  -W, --workflows string                                  path to workflow file(s) (default "./.github/workflows/")

今回䜿うサンプルワヌクフロヌ

今回はサンプルずしおPython で実装した FizzBuzz コヌドに察しお Flake8 ず pytest を実行するワヌクフロヌを䜿うGitHub Actions の「Starter Workflows」ずしお公開されおいる python-package.yml をベヌスに .github/workflows/test.yaml を甚意した

name: Python package

on:
  push:
    - master
  pull_request:
    - master

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        python-version: ['3.8', '3.9', '3.10']

    steps:
    - uses: actions/checkout@v3
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v3
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        python -m pip install flake8 pytest
        if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
    - name: Lint with flake8
      run: |
        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
    - name: Test with pytest
      run: |
        pytest

github.com

act コマンドを詊す

さっそく act コマンドを詊しおいく❗

act --list コマンド

act --list コマンドを実行するずワヌクフロヌ䞀芧を確認できる

$ act --list
Stage  Job ID  Job name  Workflow name   Workflow file  Events
0      build   build     Python package  test.yaml      push,pull_request

act コマンド初回実行

act コマンドを実行するずワヌクフロヌを実行できる初回実行の堎合は実行時に䜿う Docker Image を Large / Medium / Micro から遞ぶ今回は Medium を遞んだするず自動的に ~/.actrc ずいう蚭定ファむルが䜜られおデフォルト蚭定ずしお䜿えるようになる.actrc をリポゞトリごずに䜜っお蚭定を䞊曞きするこずもできる

$ act
? Please choose the default image you want to use with act:

  - Large size image: +20GB Docker image, includes almost all tools used on GitHub Actions (IMPORTANT: currently only ubuntu-18.04 platform is available)
  - Medium size image: ~500MB, includes only necessary tools to bootstrap actions and aims to be compatible with all actions
  - Micro size image: <200MB, contains only NodeJS required to bootstrap actions, doesn't work with all actions

参考たでに Large / Medium / Micro それぞれを遞んだずきに自動的に䜜られた ~/.actrc の蚭定ファむルを以䞋に茉せおおく

Micro

-P ubuntu-latest=node:16-buster-slim
-P ubuntu-22.04=node:16-bullseye-slim
-P ubuntu-20.04=node:16-buster-slim
-P ubuntu-18.04=node:16-buster-slim

Medium

-P ubuntu-latest=catthehacker/ubuntu:act-latest
-P ubuntu-22.04=catthehacker/ubuntu:act-22.04
-P ubuntu-20.04=catthehacker/ubuntu:act-20.04
-P ubuntu-18.04=catthehacker/ubuntu:act-18.04

Large

-P ubuntu-latest=catthehacker/ubuntu:full-latest
-P ubuntu-latest=catthehacker/ubuntu:full-20.04
-P ubuntu-18.04=catthehacker/ubuntu:full-18.04

なおact 0.2.40 たでは Micro を遞んだずきに䜜られる蚭定ファむルが間違っおいお以䞋のプルリク゚ストを出しお盎しおおいた既にリリヌスされおいる act 0.2.41 で盎っおいる✌

github.com

今回のワヌクフロヌでは runs-on: ubuntu-latest ず蚭定しおいるためMedium だず catthehacker/ubuntu:act-latest むメヌゞを䜿っおワヌクフロヌが実行される珟時点だず ubuntu-latest は ubuntu-22.04 を参照しおいるため明瀺的に -P ubuntu-latest=catthehacker/ubuntu:act-22.04 ず蚭定しおおくのも良いかず〜

github.com

act コマンド

改めお act コマンドを実行するずワヌクフロヌを実行できる今回は matrix を䜿っお Python 3.8 / 3.9 / 3.10 を䞊列実行するため実行ログには以䞋の3皮類が混圚する芋にくいため順番は入れ替えお茉せおいるたた pip install の実行ログや pytest 実行ログも衚瀺されるため暙準出力は非垞に倚くなっおしたう💊

  • build-1: Python 3.8
  • build-2: Python 3.9
  • build-3: Python 3.10
$ act

䞭略

[Python package/build-1] 🧪  Matrix: map[python-version:3.8]
[Python package/build-2] 🧪  Matrix: map[python-version:3.9]
[Python package/build-3] 🧪  Matrix: map[python-version:3.10]
[Python package/build-1]   ✅  Success - Main actions/checkout@v3
[Python package/build-2]   ✅  Success - Main actions/checkout@v3
[Python package/build-3]   ✅  Success - Main actions/checkout@v3
[Python package/build-1]   ✅  Success - Main Set up Python 3.8
[Python package/build-2]   ✅  Success - Main Set up Python 3.9
[Python package/build-3]   ✅  Success - Main Set up Python 3.10
[Python package/build-1]   ✅  Success - Main Install dependencies
[Python package/build-2]   ✅  Success - Main Install dependencies
[Python package/build-3]   ✅  Success - Main Install dependencies
[Python package/build-1]   ✅  Success - Main Lint with flake8
[Python package/build-2]   ✅  Success - Main Lint with flake8
[Python package/build-3]   ✅  Success - Main Lint with flake8
[Python package/build-1]   ✅  Success - Main Test with pytest
[Python package/build-2]   ✅  Success - Main Test with pytest
[Python package/build-3]   ✅  Success - Main Test with pytest
[Python package/build-1]   ✅  Success - Post Set up Python 3.8
[Python package/build-2]   ✅  Success - Post Set up Python 3.9
[Python package/build-3]   ✅  Success - Post Set up Python 3.10
[Python package/build-1] 🏁  Job succeeded
[Python package/build-2] 🏁  Job succeeded
[Python package/build-3] 🏁  Job succeeded

act --quiet コマンド

暙準出力を "倚少" 枛らすずきは --quiet オプションを組み合わせお䜿うpip install の実行ログや pytest 実行ログを非衚瀺にできるそれでもただ倚いけど〜

$ act --quiet

䞭略

[Python package/build-1] 🧪  Matrix: map[python-version:3.8]
[Python package/build-2] 🧪  Matrix: map[python-version:3.9]
[Python package/build-3] 🧪  Matrix: map[python-version:3.10]
[Python package/build-1]   ✅  Success - Main actions/checkout@v3
[Python package/build-2]   ✅  Success - Main actions/checkout@v3
[Python package/build-3]   ✅  Success - Main actions/checkout@v3
[Python package/build-1]   ✅  Success - Main Set up Python 3.8
[Python package/build-2]   ✅  Success - Main Set up Python 3.9
[Python package/build-3]   ✅  Success - Main Set up Python 3.10
[Python package/build-1]   ✅  Success - Main Install dependencies
[Python package/build-2]   ✅  Success - Main Install dependencies
[Python package/build-3]   ✅  Success - Main Install dependencies
[Python package/build-1]   ✅  Success - Main Lint with flake8
[Python package/build-2]   ✅  Success - Main Lint with flake8
[Python package/build-3]   ✅  Success - Main Lint with flake8
[Python package/build-1]   ✅  Success - Main Test with pytest
[Python package/build-2]   ✅  Success - Main Test with pytest
[Python package/build-3]   ✅  Success - Main Test with pytest
[Python package/build-1]   ✅  Success - Post Set up Python 3.8
[Python package/build-2]   ✅  Success - Post Set up Python 3.9
[Python package/build-3]   ✅  Success - Post Set up Python 3.10
[Python package/build-1] 🏁  Job succeeded
[Python package/build-2] 🏁  Job succeeded
[Python package/build-3] 🏁  Job succeeded

act --reuse コマンド

ワヌクフロヌ実行時に構築するむメヌゞを再利甚する堎合は --reuse オプションを組み合わせお䜿う実行時間は倚少早くなる

$ act --reuse

act --watch コマンド

--watch オプションを䜿うずコヌドやワヌクフロヌ蚭定の倉曎を怜知しお自動的にワヌクフロヌを再実行できるただし実際に詊しおみるず1床テストが萜ちるず再実行されず挙動に䞍安があった🌀

$ act --watch

䞭略

[Python package/build-1]   ❌  Failure - Main Test with pytest
[Python package/build-2]   ❌  Failure - Main Test with pytest
[Python package/build-3]   ❌  Failure - Main Test with pytest

act --env-file ず act --secret-file コマンド

ワヌクフロヌに「環境倉数」や「シヌクレット」を蚭定する堎合以䞋のように --env-file や --secret-file オプションを䜿っおファむルを読み蟌める盎接蚭定するなら --env や --secret オプションも䜿えるけど特にシヌクレットはファむルを読み蟌むのが良さそう

$ act --env-file my.env
$ act --secret-file my.secrets

act pull_request ず act schedule コマンド

実は act コマンドを実行するず GitHub に察する push むベントをトリガヌするワヌクフロヌを実行しおいる䟋えばプルリク゚スト時に䞀郚異なるワヌクフロヌを実行しおいるような堎合は act pull_request コマンドを実行するず pull_request むベントをトリガヌするワヌクフロヌを実行できるスケゞュヌル実行をしおいるような堎合は act schedule コマンドを実行するず schedule むベントをトリガヌするワヌクフロヌを実行できる

on:
  push:
    branches:
      - master
    pull_request:
      - master

もしワヌクフロヌの䞭で github.event.pull_request.* などのむベントプロパティに䟝存しおいる堎合は --eventpath オプションを組み合わせる詳しくは Wiki の Beginner's guide に茉っおいる

github.com

たずめ

GitHub Actions のワヌクフロヌをロヌカル環境で実行できる「act」を詊した❗

調べたずころ「act」は GitHub Blog でも玹介されおいた

github.blog

実際に詊しおみお act は䟿利だったけど圓然ながら GitHub Actions を完党再珟できおるわけではなく䟋えば「実行できる環境が Ubuntu 限定」や前に玹介した GitHub Actions の「reusable workflowワヌクフロヌの再利甚未察応」などは気にしおおく必芁があるず思うあずワヌクフロヌが゚ラヌになっお再詊行で盎るなど䞍安定な挙動もあっおもう少し䜿っおみようず思う🌀

$ act
Error: remote reusable workflows are currently not supported (see https://github.com/nektos/act/issues/826 for updates)

kakakakakku.hatenablog.com

Calendly: Zapier を䜿っお Notion ず連携しよう

「Calendly」は倚くのサヌビスずのむンテグレヌションをサポヌトしおいる"Professional" プラン以䞊で䜿える「Zapier むンテグレヌション」で連携するず開発をするこずなくノヌコヌドむベント駆動な仕組みを実装できる

Calendly を詊しながら「ミヌティングの申し蟌みがあったら自動的に Notion にドキュメントを䜜る」ずいうこずを実珟したくトラむアル期間䞭に Zapier ずの連携を実装しおみた❗実際に䜿っおいお䟿利〜課金したくなる...💰プラン詳现は以䞋のドキュメントにたずたっおいる

calendly.com

Calendly に関しおは以䞋の蚘事で玹介しおいるので読んでもらえればず〜📝

kakakakakku.hatenablog.com

Zapier セットアップ

最初に Calendly 偎で Zapier 甚の API Key を取埗しおZapier の Zap に蚭定する

次に Zapier 偎で Trigger (Calendly) ず Action (Notion) を蚭定するNotion ドキュメントのタむトルず本文には Calendly のフィヌルド倀を蚭定する候補日だけではなく質問に察する回答なども取埗できる

するず自動的に Notion ドキュメントが䜜られる❗

Calendly: 気軜に 1on1 を申し蟌もう

仕事に関係なく「話したいなぁ〜」ず思った盞手ずのミヌティング1on1 / 壁打ち / 技術雑談などを気軜に申し蟌めるサヌビス「Calendly」を玹介する❗ちょっず前から気になっおお詊しおみたら䟿利でさっそく導入テスト運甚䞭もしおみた機胜は限られるけど無料で䜿える "Basic" でも問題なさそう〜

calendly.com

Calendly 操䜜むメヌゞ🎀

Calendly を䜿っお「ミヌティングを申し蟌む流れ」を芋おもらえばむメヌゞは掎めるず思う❗

1. Calendly サむトにアクセスする

Calendly サむトにアクセスするず蚭定しおいるむベント「1on1」を遞べる本圓は「Blog 1on1」や「Tech 1on1」や「General 1on1」など耇数むベントを蚭定したかったけどBasic プランだず1むベントのみ蚭定できるようになっおいる

2. 候補日を遞ぶ

次に候補日を遞ぶ日時ず時間は管理画面で现かく蚭定しおいお以䞋の䟋だず 1/31 の 10:00 ず 10:30 で申し蟌める

3. 質問に回答する

名前や 1on1 トピックなど簡単な質問に回答しお申し蟌み完了今回は Google Meet を䜿う蚭定にしおいる圓日お䌚いしたしょう簡単䟿利〜 (・∀・)

Calendly 機胜玹介🎀

むンテグレヌションの倚さ

Calendly は倚くのサヌビスずのむンテグレヌションをサポヌトしおいる「カレンダヌサヌビス」なら Google Calendar や Office 365 Calendar などをサポヌトしおいお「ビデオ䌚議サヌビス」なら Zoom や Google Meet や Microsoft Teams などをサポヌトしおいるむンテグレヌションは他にもただただある❗

柔軟な質問を蚭定できる

ミヌティングを申し蟌む前に質問に回答しおもらえる倚すぎるず面倒だけどアゞェンダなど最䜎限の情報を把握できるのはお互いに助かるず思う回答タむプも充実しおいお䟿利❗

  • One Line䞀行テキスト
  • Multiple Lines耇数行テキスト
  • Radio Buttons単䞀遞択
  • Checkboxes耇数遞択
  • Dropdown単䞀遞択
  • Phone Number電話番号

ミヌティングが隙間なく埋たらないようにブロックできる

Before event ず After event を蚭定するこずでミヌティングが隙間なく埋たらないようにミヌティングの前埌をブロックできる準備時間や䌑憩時間を確保できおむむ❗

他の予定ずコンフリクトしないように考慮できる

Calendly で「毎週䜕時」や「特定日」など候補日を柔軟に蚭定できるけど気になるのは他の予定が入ったずきに Calendly ぞの反映を忘れおしたっお「ダブルブッキングになっおしたった💊」ずいう事故だず思うCalendly には「Check for conflicts」ずいう機胜があっお䟋えば Google Calendar だず指定したカレンダヌに予定が入っおいたらコンフリクトしそうだったら候補日にならないようにしおくれるこれは本圓に䟿利な機胜で Calendly の管理がしやすくなる❗

サむトに埋め蟌める

Calendly をサむトに埋め蟌む機胜もある珟時点では3皮類ある個人的には「ポップアップボタン」があるず良いなぁ〜ず思った今埌に期埅❗

  • Inline EmbedCalendly を盎接埋め蟌む
  • Popup Widgetフロヌティングしたボタンをクリックするず Calendly が衚瀺される
  • Popup Textテキストリンクをクリックするず Calendly が衚瀺される

たずめ

「Calendly」を詊しおみた❗個人利甚でも䌁業利甚でも䟿利だず思う〜

今幎はテックブログに関する壁打ちや雑談などをもっず気軜にできたら良いなぁ〜ず思っおいおさっそく Calendly を導入しおみた珟状ただ「テスト運甚䞭」で候補日は少ないけどkakakakakku blog のサむドバヌに Popup Text を埋め蟌んでおいたもしくは以䞋のリンクから盎接アクセスしおもらっおも OK💡実際に運甚をしおみないずわからないこずもあっおお話したしょう〜

calendly.com

GitHub App「Pull Request Size」プルリク゚ストのサむズをラベル化しよう

GitHub App「Pull Request Size」を䜿うずプルリク゚ストの差分量から "サむズを意味する" ラベルを付けおくれお䟿利❗やっおるこずは単玔だけど「このプルリク゚ストは倧きすぎるな〜」ずいう刀断材料にも䜿える個人アカりントなら無料なのも嬉しい✌

github.com

ラベル䞀芧

ラベルに関しおは以䞋の「蚈6皮類」が甚意されおいる

  • size/XS : 差分量 0-9 行
  • size/S : 差分量 10-29 行
  • size/M : 差分量 30-99 行
  • size/L : 差分量 100-499 行
  • size/XL : 差分量 500-999 行
  • size/XXL : 差分量 1000 行 以䞊

差分量の蚈算匏ず陀倖ファむル

「差分量」を算出する蚈算匏は GitHub に茉っおいお基本的には「远加 + 削陀」になるでも generated file自動生成されるファむル の差分を陀倖しおくれるのはよく考えられおいるず思った❗具䜓的には node_modules/ ディレクトリなどが考慮されおいお䞀芧は GitHub の noqcks/generated リポゞトリで管理されおいるさらに「Pull Request Size」では .gitattributes を䜿うず陀倖ファむルをカスタマむズするこずもできる〜

total additions + total deletions - (all generated file additions/deletions)

github.com

github.com

ラベルの色をカスタマむズする

カスタマむズずいう芳点だず .github/labels.yml ファむルを䜿っお「ラベルの色」も蚭定できる痒いずころに手が届く感じ❗

XS:
  name: size/XS
  lines: 0
  color: 3CBF00
S:
  name: size/S
  lines: 10
  color: 5D9801

プルリク゚ストを曎新するずラベルは曎新される

プルリク゚ストを出した埌にレビュヌを繰り返しながらコヌドを修正したらどうなるんだろうず気になった実際に詊したずころコミットごずに蚈算されお自動的にラベルは曎新された❗

たずめ

さっそく GitHub App「Pull Request Size」を䜿っおいくぞヌ❗

ツむヌト

リアルなテストデヌタを䜜っおモック化たでできる Mockaroo

リアルなテストデヌタを簡単に䜜っおモック化たでできるサヌビス「Mockaroo」を玹介する❗デヌタベヌスのテストデヌタを䜜ったりフロント゚ンドを実装するずきに必芁になるバック゚ンド API をモック化できるテストデヌタに test や hoge ずいう文字列を䜿っおしたうず本番環境盞圓の確認がしにくくできる限りリアルなテストデヌタを䜜りたい堎面は倚くあるず思う💡

www.mockaroo.com

Mockaroo の特城ずしおはサポヌトしおるタむプがなんず珟時点で「13 カテゎリ169 皮類」もある以䞋にカテゎリごずにタむプ数をたずめるWhat's new を芋るず定期的にタむプは増えおいる

  • Advanced10 皮類
  • Basic29 皮類
  • Car1 皮類
  • Commerce13 皮類
  • Construction6 皮類
  • Crypto7 皮類
  • Health17 皮類
  • IT21 皮類
  • Location14 皮類
  • Nature5 皮類
  • Personal30 皮類
  • Products6 皮類
  • Travel10 皮類

さらに Mockaroo では「11 皮類」のフォヌマット圢匏でテストデヌタをダりンロヌドできる以䞋にたずめる泚意点ずしおはデヌタ件数は「最倧 1000 件」ずなるずころ

  • CSV
  • JSON
  • Tab-Delimited
  • SQL
  • Cassandra CQL
  • Firebase
  • InfluxDB
  • Custom
  • Excel
  • XML
  • DBUnit XML

お詊し① SQL フォヌマット

以䞋のタむプを遞んで users テヌブルに䜿えそうなテストデヌタを䜜っおみた

  • Row Number
  • Username
  • Email Address
  • Avatar (Size: 50x50)
  • City
  • Country
  • Datetime (unix timestamp)

以䞋の条件で「SQL フォヌマット」でダりンロヌドした

  • Rows: 1000
  • Format: SQL
  • Table Name: users
insert into users (id, username, email, avatar, country, created_at) values (1, 'mchedgey0', 'tmonkeman0@phoca.cz', 'https://robohash.org/dictaautmollitia.png?size=50x50&set=set1', 'Bangladesh', '1650159167000');
insert into users (id, username, email, avatar, country, created_at) values (2, 'spigram1', 'sgulleford1@live.com', 'https://robohash.org/utillosaepe.png?size=50x50&set=set1', 'Bangladesh', '1638834568000');
insert into users (id, username, email, avatar, country, created_at) values (3, 'bgranville2', 'hlarroway2@ezinearticles.com', 'https://robohash.org/nihiloccaecatidoloribus.png?size=50x50&set=set1', 'Palestinian Territory', '1620444328000');
insert into users (id, username, email, avatar, country, created_at) values (4, 'dblezard3', 'emcallaster3@shinystat.com', 'https://robohash.org/quiquiasunt.png?size=50x50&set=set1', 'Germany', '1598947981000');
insert into users (id, username, email, avatar, country, created_at) values (5, 'ehebbs4', 'lmaxworthy4@jalbum.net', 'https://robohash.org/rerumesteum.png?size=50x50&set=set1', 'United States', '1619682314000');

そしお SQL を MySQL にロヌドしおク゚リを実行するず期埅通りにデヌタを取埗できた䟿利❗

mysql> SELECT COUNT(*) FROM users;
+----------+
| COUNT(*) |
+----------+
|     1000 |
+----------+
1 row in set (0.01 sec)

mysql> SELECT * FROM users LIMIT 5;
+------+-------------+------------------------------+----------------------------------------------------------------------+-----------------------+---------------+
| id   | username    | email                        | avatar                                                               | country               | created_at    |
+------+-------------+------------------------------+----------------------------------------------------------------------+-----------------------+---------------+
|    1 | mchedgey0   | tmonkeman0@phoca.cz          | https://robohash.org/dictaautmollitia.png?size=50x50&set=set1        | Bangladesh            | 1650159167000 |
|    2 | spigram1    | sgulleford1@live.com         | https://robohash.org/utillosaepe.png?size=50x50&set=set1             | Bangladesh            | 1638834568000 |
|    3 | bgranville2 | hlarroway2@ezinearticles.com | https://robohash.org/nihiloccaecatidoloribus.png?size=50x50&set=set1 | Palestinian Territory | 1620444328000 |
|    4 | dblezard3   | emcallaster3@shinystat.com   | https://robohash.org/quiquiasunt.png?size=50x50&set=set1             | Germany               | 1598947981000 |
|    5 | ehebbs4     | lmaxworthy4@jalbum.net       | https://robohash.org/rerumesteum.png?size=50x50&set=set1             | United States         | 1619682314000 |
+------+-------------+------------------------------+----------------------------------------------------------------------+-----------------------+---------------+
5 rows in set (0.00 sec)

mysql> SELECT country, COUNT(*) AS COUNT FROM users GROUP BY country HAVING COUNT > 50 ORDER BY COUNT DESC;
+-------------+-------+
| country     | COUNT |
+-------------+-------+
| China       |   203 |
| Indonesia   |   105 |
| Philippines |    51 |
| Russia      |    51 |
+-------------+-------+
4 rows in set (0.00 sec)

お詊し② CSV フォヌマット

今床は他のタむプ気になったものを適圓に遞んでテストデヌタを䜜っおみた

  • ULID
  • Color
  • Latitude
  • Longitude
  • File Name
  • Company Name
  • Credit Card Type
  • Credit Card #

以䞋の条件で「CSV フォヌマット」でダりンロヌドした

  • Rows: 1000
  • Format: CSV
  • Include: header
$ head -n 10 MOCK_DATA.csv
id,color,latitude,longitude,company_name,credit_card_type,credit_card_number
01GNHJCSXXATB5CJF9XME7KSF5,Violet,46.6473105,0.813275,Twitterworks,jcb,3529226789542666
01GNHJCSY1E70GJR7PEQ4WN1NA,Puce,-14.658228,49.6452092,Dabshots,jcb,3553539000204067
01GNHJCSY4YNVQ2G6GMHFJ6AP3,Turquoise,43.8051322,43.7759042,Livetube,jcb,3548207679524102
01GNHJCSY7G822Z6717N0MMYSR,Violet,23.0029267,105.2545888,Livetube,laser,67093426547314751
01GNHJCSYAW8P55K0X8B3EWB38,Pink,-9.2623446,-77.6929792,Eazzy,jcb,3544135599033025
01GNHJCSYDJB6BV6088EGGGCP4,Teal,45.72727,112.35563,Pixonyx,jcb,3572010371487902
01GNHJCSYGNSN0A529BHQ1FYYS,Purple,6.9782137,79.9115522,Trudoo,maestro,50203305431642795
01GNHJCSYKDXPGXENM5DDWFASG,Crimson,-7.3863388,108.1888233,Flashspan,jcb,3564637074986317
01GNHJCSYPF117F0YT2SFA0DMS,Red,29.3728871,113.1149933,Skajo,jcb,3528564263246532

そしお CSV を Amazon S3 に眮いおAmazon DynamoDB にロヌドしおみた

aws.amazon.com

期埅通りに Amazon DynamoDBテヌブルグロヌバルセカンダリむンデックスからデヌタを取埗できた䟿利❗

$ aws ddb select mockaroo \
--no-consistent-read \
--max-items 5
Count: 1000
Items:
- color: Fuscia
  company_name: Twinte
  credit_card_number: '6706053594972617'
  credit_card_type: laser
  id: 01GNHJCWVBM133QADNWR1YP48K
  latitude: '62.107429'
  longitude: '129.517113'
- color: Green
  company_name: Skimia
  credit_card_number: '3565626637296552'
  credit_card_type: jcb
  id: 01GNHJCSYZYZPRE1AJVWVHDR56
  latitude: '36.3573462'
  longitude: '25.4459308'
- color: Indigo
  company_name: Minyx
  credit_card_number: '3542499593981213'
  credit_card_type: jcb
  id: 01GNHJCWN9RZ3DFFDDCAWBEK4Y
  latitude: '25.200027'
  longitude: '119.482942'
- color: Fuscia
  company_name: Yombu
  credit_card_number: '374283946958998'
  credit_card_type: americanexpress
  id: 01GNHJCV5QKDH1QMNP9SGHQ7MB
  latitude: '44.5241667'
  longitude: '129.5688889'
- color: Aquamarine
  company_name: Devbug
  credit_card_number: '675936707426408066'
  credit_card_type: maestro
  id: 01GNHJCVBQQYTP4YHRM27N1XQH
  latitude: '32.790614'
  longitude: '35.326882'
NextToken: eyJFeGNsdXNpdmVTdGFydEtleSI6IG51bGwsICJib3RvX3RydW5jYXRlX2Ftb3VudCI6IDV9
ScannedCount: 1000

$ aws ddb select mockaroo \
--index-name credit_card_type_gsi \
--key-condition 'credit_card_type = "visa"' \
--no-consistent-read \
--max-items 5
Count: 22
Items:
- color: Yellow
  company_name: Skajo
  credit_card_number: '4017959596578'
  credit_card_type: visa
  id: 01GNHJCWSWARJ3JW85VNKA8N37
  latitude: '39.930136'
  longitude: '119.576091'
- color: Red
  company_name: Fivechat
  credit_card_number: '4041590127551'
  credit_card_type: visa
  id: 01GNHJCTMH0V8CYAFKYS9JSKQ3
  latitude: '-7.0386444'
  longitude: '107.9692467'
- color: Khaki
  company_name: Mymm
  credit_card_number: '4041597904940630'
  credit_card_type: visa
  id: 01GNHJCWTV7NG6EMYG6EDPK57B
  latitude: '29.709214'
  longitude: '107.606105'
- color: Green
  company_name: Kazu
  credit_card_number: '4017952066698478'
  credit_card_type: visa
  id: 01GNHJCTT2SZGY195EN2S52JTG
  latitude: '32.187849'
  longitude: '119.425836'
- color: Pink
  company_name: Leexo
  credit_card_number: '4260700145435501'
  credit_card_type: visa
  id: 01GNHJCX9DSZYM826T0JBAQRY7
  latitude: '-9.5541709'
  longitude: '119.0285355'
NextToken: eyJFeGNsdXNpdmVTdGFydEtleSI6IG51bGwsICJib3RvX3RydW5jYXRlX2Ftb3VudCI6IDV9
ScannedCount: 22

その他

Mockaroo には他にも機胜があっお気になった機胜を玹介する❗

blank

フィヌルドごずにブランク率 (%) を指定できる意図的に「欠損倀のあるテストデヌタ」を䜜れたりする

Formula

Mockaroo Formula Syntax を䜿うずデヌタを倉換できる䟋えば数倀蚈算をしたり倧文字や小文字に倉換したりBase64 ゚ンコヌドもできるたた if/elsif/else を䜿っお条件付きで倉換もできる

this + 1
upper(this)
lower(this)
base64(this)

Mockaroo APIs

Mockaroo APIs を䜿うずMockaroo の蚭定を API で操䜜できる操䜜するためには API Key を取埗しおおく必芁がある

  • GET /api/types
  • POST /api/datasets/:name
  • DELETE /api/datasets/:name
  • POST /api/generate(.format)

API 仕様に関しおは以䞋に詳しく茉っおいる

Mockaroo Mock API

Mockaroo Mock API を䜿うずMockaroo にホスティングされたモック API からテストデヌタを取埗できるフロント゚ンドを実装するずきに必芁になるバック゚ンド API をモック化できたりする❗手順ずしおは䜜った「スキヌマ」を登録しおそれに察応した Mock API を簡単に䜜れるそれに察応した Mock API を䜜る

以䞋の䟋ではusers スキヌマからサンプルデヌタを5件取埗しおいるこれは䟿利〜👏

$ curl -s -H 'X-API-Key: xxxxxxxx' https://my.api.mockaroo.com/users.json | jq .
[
  {
    "id": 1,
    "username": "rcranfield0",
    "email": "tdavidovsky0@printfriendly.com",
    "avatar": "https://robohash.org/utetnon.png?size=50x50&set=set1",
    "country": "Somalia",
    "created_at": "1602125107000"
  },
  {
    "id": 2,
    "username": "hjaggs1",
    "email": "amilington1@alibaba.com",
    "avatar": "https://robohash.org/nihiladipiscireiciendis.png?size=50x50&set=set1",
    "country": "Portugal",
    "created_at": "1584420589000"
  },
  {
    "id": 3,
    "username": "cscimoni2",
    "email": "xpilley2@java.com",
    "avatar": "https://robohash.org/errortemporibusdolorum.png?size=50x50&set=set1",
    "country": "Greece",
    "created_at": "1648988379000"
  },
  {
    "id": 4,
    "username": "kelletson3",
    "email": "nzecchii3@mlb.com",
    "avatar": "https://robohash.org/eligendietid.png?size=50x50&set=set1",
    "country": "Russia",
    "created_at": "1638996409000"
  },
  {
    "id": 5,
    "username": "bambage4",
    "email": "jkendal4@cisco.com",
    "avatar": "https://robohash.org/similiqueofficiisquisquam.png?size=50x50&set=set1",
    "country": "Russia",
    "created_at": "1630924325000"
  }
]

たずめ

仕事でむンストラクタヌ技術講垫をしおいるのでデモやプロトタむプを実装する機䌚が倚くあるそのずきにできる限りリアルなテストデヌタを䜿いたく普段は Faker を䜿っおテストデヌタを流し蟌んでいるFaker 以倖に方法を探しおいたら Mockaroo を発芋しお詊しおみたら良くお蚘事にたずめおおくこずにした❗ Mockaroo は芚えおおこう〜

www.mockaroo.com