@ka2n

Technology and beer

Github ActionsでCloud Firestoreセキュリティールールのテストを実行する

.github/workflows/security-rules.yml

name: security rules

on:
  pull_request:
    paths:
      - "packages/internal/__tests__/**/*"
      - "packages/internal/*.rules"
      - "packages/internal/scripts/test-firestore.sh"

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      FIREBASE_EMULATORS_PATH: ${{ github.workspace }}/emulator-cache
      FIREBASE_TOOLS_VERSION: 7.12.1
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
        with:
          node_version: 10
      - uses: actions/cache@v1
        with:
          path: ~/.cache/yarn
          key: ${{ runner.os }}-yarn-${{ hashFiles(format('{0}{1}', github.workspace, '/yarn.lock')) }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - name: emulator cache patch
        run: |
          mkdir -p $FIREBASE_EMULATORS_PATH
          echo $FIREBASE_TOOLS_VERSION > "$FIREBASE_EMULATORS_PATH/VERSION"
        working-directory: "./packages/internal"

      - name: cache Emulator
        uses: actions/cache@v1
        with:
          path: ${{ env.FIREBASE_EMULATORS_PATH }}
          key: ${{ runner.os }}-firebase-emulators-${{ hashFiles(format('{0}{1}', github.workspace, '/emulator-cache/**')) }}
        continue-on-error: true

      - name: setup env
        run: |
          echo "::set-env name=GOPATH::$(go env GOPATH)"
          echo "::add-path::$(go env GOPATH)/bin"

      - run: yarn install --frozen-lockfile --prefer-offline
        working-directory: "./packages/internal"

      - run: scripts/test-firestore.sh 
        working-directory: "./packages/internal"

packages/internal/scripts/test-firestore.sh

#!/usr/bin/env bash
set -e
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
CWD="$(pwd)"

echo "Running in ${CWD}"
echo "Running with node: $(which node)"
echo "Running with npm: $(which npm)"

echo "Ensuring CLI tools..."
npm list -g firebase-tools || npm install --global firebase-tools@${FIREBASE_TOOLS_VERSION:-7.12.1}
go get github.com/ka2n/waitport/cmd/waitport/...
echo "Ensured CLI tools:"
echo -e "\t$(which firebase)"
echo -e "\t$(which waitport)"

export FIRESTORE_EMULATOR_HOST=localhost:8080

firebase emulators:start --only firestore &
PID="$!"
waitport -listen $FIRESTORE_EMULATOR_HOST -timeout 2m

yarn test --ci

kill -INT $PID
wait

# TODO: test functions, hosting,,etc...

テスト失敗した場合の処理はどうせ掃除されると見越して雑です。

Dayun Z1の初期セットアップを楽にするFWを作りました

2018/10/08に再アップロードされた20180930版に少し手を入れてあります。(以前のものとの違いは調べてません)

  • 初期状態で固定IPになっているのをDHCPに変更
  • アドレスを変更(どうせなので)

TODO: - 定期的に再起動するように設定

Z1: z1_stable_850M_mod20181015.7z - Google ドライブ

prootとqemu-arm-staticを使ってARM用ディスクイメージをカスタマイズする

ASICのカスタムファーム作りのためにメーカーが配布しているFWを編集することがあります。設定を予め終えた状態のFWを作る等。 普通にマウントして作業しても良いんですが、内部のライブラリをアップデートしたい場合があります。そんな時にprootqemu-arm-staticを組み合わせて作業すると便利でした。

環境

  • Host: Linux 4.18.4-arch1-1-ARCH #1 SMP PREEMPT Wed Aug 22 07:33:26 UTC 2018 x86_64 GNU/Linux
  • 対象のFW: Linux Baikal 3.4.39 #2 SMP PREEMPT Mon Nov 21 16:23:11 CST 2016 armv7l armv7l armv7l GNU/Linux

アーキテクチャが違うのでそのままchrootしてもうまくコマンドが使えませんのでダメです。

prootとQEMU(qemu-arm-static)を使う

prootとQEMUを組み合わせて使うことでアーキテクチャが違うOSであってもライブラリのアップデートなどが行なえます。 prootはchrootを実現し、qemu-arm-staticは異なるアーキテクチャをエミュレーションしてくれます。どちらもユーザー空間で動きます。

prootのインストール

PRoot — chroot, mount --bind, and binfmt_misc without privilege/setupに入手法が書いてありますが、ArchLinuxではAURからインストールできるので、yayを使って入れます。

yay -S proot

qemu-arm-staticのインストール

詳しくは QemuUserEmulation - Debian Wiki を参照。 qemu-arm-staticqemu-user-staticというパッケージに含まれています。

yay -S qemu-user-static

イメージファイルをマウント

まず、fdiskでディスクイメージ上のパーティションの区切り位置を確認します。

$ fdisk -l ./PiZero_GX10_180410_V1.2.img
Disk /home/k2/tmp/PiZero_GX10_180410_V1.2.img: 3.7 GiB, 3904897024 bytes, 7626752 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0007a4f5

Device                                             Boot  Start     End Sectors  Size Id Type
/home/k2/tmp/PiZero_GX10_180410_V1.2.img1       40960  172031  131072   64M  b W95 FAT32
/home/k2/tmp/PiZero_GX10_180410_V1.2.img2      172032 7544831 7372800  3.5G 83 Linux

次にmountコマンドでそれぞれをマウントします。オプションでSector sizeとSectorの位置とサイズを元にoffsetとsizelimitを指定します。

$ su -
# mkdir -p /mnt/pizero_boot
# mkdir -p /mnt/pizero
# mount -t vfat -o loop,offset=$((40960*512)),sizelimit=$((131072*512)) /home/k2/tmp/PiZero_GX10_180410_V1.2.img /mnt/pizero_boot
# mount -t ext4 -o loop,offset=$((172032*512)),sizelimit=$((7372800*512)) /home/k2/tmp/PiZero_GX10_180410_V1.2.img /mnt/pizero

prootでchrootする

以下のようにしてprootコマンドとqemu-arm-staticを組み合わせてchrootします。

# export PROOT_NO_SECCOMP=1 # ホストマシンのカーネルによっては必要
# cp $(which qemu-arm-static) /mnt/pizero/bin/qemu-arm-static # arm64ならqemu-aarch64-static
# proot -S /mnt/pizero -b /mnt/pizero_boot:/boot -q qemu-arm-static /bin/bash
root # 
root # export PATH=/bin:/usr/bin # PATHを設定

あとは自由に設定変更 & パッケージのインストールを行う

参考