8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Firebase の快適 GitHubActions まとめ

Last updated at Posted at 2020-06-04

だいたい毎回追加してる Workflow の雛形紹介。

Firestore

Test Security Rules

..github/workflows/firestore_security_rules_test.yaml
name: Firestore_Security_Rules_Test

on:
  pull_request:
    types: [opened, synchronize]
    paths:
      - firestore/rules/**
      - firestore/test/**
      - firestore/*.json
      - .github/workflows/firestore_security_rules_test.yaml
  push:
    branches:
      - master
    paths:
      - firestore/rules/**
      - firestore/test/**
      - firestore/*.json
      - .github/workflows/firestore_security_rules_test.yaml

jobs:
  firestore_security_rules_test:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    defaults:
      run:
        working-directory: firestore
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 1
      - uses: actions/setup-node@v1
        with:
          node-version: '12.x'
      - run: |
          npm install
          npm i -g firebase-tools
          firebase emulators:exec --only firestore 'npm test'

Deploy Security Rules

..github/workflows/firestore_security_rules_deploy.yaml
name: Firestore_Security_Rules_Deploy

on:
  push:
    branches:
      - master
    paths:
      - firestore/rules/**
      - firestore/*.json
      - firestore/generate_rules.js
      - .github/workflows/firestore_security_rules_deploy.yaml

jobs:
  firestore_security_rules_deploy:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    defaults:
      run:
        working-directory: firestore
    steps:
      - name: start deployment
        uses: bobheadxi/deployments@master
        id: deployment
        with:
          step: start
          token: ${{ secrets.GITHUB_TOKEN }}
          env: Firestore_Security_Rules-dev
      - uses: actions/checkout@v2
        with:
          fetch-depth: 1

      # See: https://medium.com/firebase-developers/imports-for-firestore-security-rules-are-the-best-26f0770ad23c
      #- name: generate rules
      #  run: npm run generate

      - uses: w9jds/firebase-action@master
        with:
          args: deploy --only firestore:rules -P dev
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_DEV_TOKEN }}
          PROJECT_PATH: firestore
      - name: update deployment status
        uses: bobheadxi/deployments@master
        if: always()
        with:
          step: finish
          token: ${{ secrets.GITHUB_TOKEN }}
          status: ${{ job.status }}
          deployment_id: ${{ steps.deployment.outputs.deployment_id }}
          env_url: https://example.com

Deploy Indexes

..github/workflows/firestore_indexes_deploy.yaml
name: Firestore_Indexes_Deploy

on:
  push:
    branches:
      - master
    paths:
      - firestore/firestore.indexes.json
      - .github/workflows/firestore_indexes_deploy.yaml

jobs:
  firestore_indexes_deploy:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    defaults:
      run:
        working-directory: firestore
    steps:
      - name: start deployment
        uses: bobheadxi/deployments@master
        id: deployment
        with:
          step: start
          token: ${{ secrets.GITHUB_TOKEN }}
          env: Firestore_Indexes-dev
      - uses: actions/checkout@v2
        with:
          fetch-depth: 1
      - uses: w9jds/firebase-action@master
        with:
          args: deploy --only firestore:indexes -P dev
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_DEV_TOKEN }}
          PROJECT_PATH: firestore
      - name: update deployment status
        uses: bobheadxi/deployments@master
        if: always()
        with:
          step: finish
          token: ${{ secrets.GITHUB_TOKEN }}
          status: ${{ job.status }}
          deployment_id: ${{ steps.deployment.outputs.deployment_id }}
          env_url: https://example.com

ちなみに、手元の json 更新自体は firebase firestore:indexes > ./firestore.indexes.json ってやると早いです。

Functions

Unite Test

..github/workflows/functions_unit_test.yaml
name: Functions_Unit_Test

on:
  pull_request:
    types: [opened, synchronize]
  push:
    branches:
      - master

jobs:
  functions_unit_test:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    defaults:
      run:
        working-directory: functions
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 1
      - uses: actions/setup-node@v1
        with:
          node-version: '12.x'
      - run: |
          npm ci
          npm i -g firebase-tools
          nyc --reporter=lcovonly mocha lib/test/ --recursive --timeout=10000 --reporter spec
      - uses: codecov/codecov-action@v1
        with:
          token: ${{secrets.CODECOV_TOKEN}}
          file: functions/coverage/lcov.info

Deploy

..github/workflows/functions_deploy.yaml
name: Functions_Deploy

on:
  push:
    branches:
      - master

jobs:
  functions_deploy:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    defaults:
      run:
        working-directory: functions
    steps:
      - name: start deployment
        uses: bobheadxi/deployments@master
        id: deployment
        with:
          step: start
          token: ${{ secrets.GITHUB_TOKEN }}
          env: Functions-dev
      - uses: actions/checkout@v2
        with:
          fetch-depth: 1
      - uses: actions/setup-node@v1
        with:
          node-version: '10'
      - name: build
        run: npm ci && npm run build
      - uses: w9jds/firebase-action@master
        with:
          args: deploy --only functions -P dev
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_DEV_TOKEN }}
          PROJECT_PATH: functions
      - name: update deployment status
        uses: bobheadxi/deployments@master
        if: always()
        with:
          step: finish
          token: ${{ secrets.GITHUB_TOKEN }}
          status: ${{ job.status }}
          deployment_id: ${{ steps.deployment.outputs.deployment_id }}
          env_url: http://example.com

共通

TypeScript Format

..github/workflows/format.yaml
name: Format

on:
  push:
    branches:
      - master
    paths:
      - '**.ts'
  pull_request:
    types: [opened, synchronize]
    paths:
      - '**.ts'

jobs:
  format_on_firestore:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: firestore
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 1
      - uses: actions/setup-node@v1
        with:
          node-version: '12.x'
      - run: npm install
      - run: npm run formatOnCI
  format_on_functions:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: functions
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 1
      - uses: actions/setup-node@v1
        with:
          node-version: '12.x'
      - run: npm ci
      - run: npm run formatOnCI

npm の formatOnCI には、prettier --check './**/*.ts' を設定してある。

Update Packages Cron

..github/workflows/update_dependencies.yaml
name: Update_Dependencies

on:
  schedule:
    - cron: '0 0 * * *' # UTC

# https://www.npmjs.com/package/npm-check-updates を使う
jobs:
  update_dependencies_for_firestore:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 1
          ref: master
      - uses: actions/setup-node@v1
        with:
          node-version: '12.x'
      - name: update
        working-directory: firestore
        run: |
          npm install
          npm install -g npm-check-updates
          ncu -u
          npm install
      - name: create PR
        uses: peter-evans/create-pull-request@v2
        with:
          commit-message: '[Scheduled] update dependencies for Firestore'
          title: '[Scheduled] update dependencies for Firestore'
          body: |
            Auto-generated by [create-pull-request][1]

            Why is PR author User? Why not Bot?
            -> See: https://github.com/peter-evans/create-pull-request/blob/master/docs/concepts-guidelines.md#triggering-further-workflow-runs

            [1]: https://github.com/peter-evans/create-pull-request
          branch: cron_update_dependencies_for_firestore
          base: master
          token: ${{ secrets.REPO_SCOPED_TOKEN }}

  update_dependencies_for_functions:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 1
          ref: master
      - uses: actions/setup-node@v1
        with:
          node-version: '10'
      - name: update
        working-directory: functions
        run: |
          npm ci
          npm install -g npm-check-updates
          ncu -u
          npm install
      - name: create PR
        uses: peter-evans/create-pull-request@v2
        with:
          commit-message: '[Scheduled] update dependencies for Functions'
          title: '[Scheduled] update dependencies for Functions'
          body: |
            Auto-generated by [create-pull-request][1]

            Why is PR author User? Why not Bot?
            -> See: https://github.com/peter-evans/create-pull-request/blob/master/docs/concepts-guidelines.md#triggering-further-workflow-runs

            [1]: https://github.com/peter-evans/create-pull-request
          branch: cron_update_dependencies_for_functions
          base: master
          token: ${{ secrets.REPO_SCOPED_TOKEN }}

関連

script とか関連する公式ドキュメントのリンクを置いておきます。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?