CircleCI에서 firebase function(Node.js)의 CI/CD하기

개요



Github과 CircleCI의 연계는 계정 연계만 할 수 있으므로 적당히 권합니다.
이 기사에서는 git 디렉토리 구성과 CircleCI 설정 파일 (작업을 설명)에 대해 설명합니다.

git 디렉토리 구성


firebase init를 실행 한 계층 구조를 git 관리의 루트 디렉토리로 설정합니다.
.
├── .circleci
├── firebase.json
├── functions
│   ├── index.js
│   ├── node_modules
│   ├── package.json  ← この階層と
│   └── test
├── node_modules
└── package.json ← この階層を行き来する

원래 functions 디렉토리를 git 관리의 루트 디렉토리로 만들었지만 firebase CLI의 편의상이 계층 구조를 관리하고 있습니다. (후술)

.circleci/config.yml



circleci에서 수행하는 태스크는 이 파일에 작성되므로 디렉토리/파일을 작성합니다.
주로 배포 작업과 테스트 작업을 설명합니다.
 version: 2
 jobs:
   function-deploy:
     docker:
       - image: circleci/node:latest
     steps:
       - checkout
       # functions配下のnpm設定
       # 基本的にfunctions配下で作業するため、working_directoryでfunctionsを指定している
       # キャッシュ関連処理ではworking_directoryが利用できない
       - run: sudo npm install -g npm@latest
       # 毎回npm installに時間がかかると面倒なのでキャッシュから取ってくる
       - restore_cache:
          key: dependency-cache-{{ checksum "functions/package.json" }}
       - run: 
          command: npm install
          working_directory: functions
       # 毎回npm installに時間がかかると面倒なのでキャッシュに保存する
       - save_cache:
          key: dependency-cache-{{ checksum "functions/package.json" }}
          paths:
             - functions/node_modules
       # トップレベルのnpm設定 
       # npm run deployは最上位レベルから叩くため、working_directoryを移動しない
       - restore_cache:
          key: dependency-cache-{{ checksum "package.json" }}
       - run: 
          command: npm install
       - save_cache:
          key: dependency-cache-{{ checksum "package.json" }}
          paths:
             - ./node_modules
       - run: 
          command: npm run deploy
   function-test:
     docker:
       - image: circleci/node:latest
     steps:
       - checkout
       - run: sudo npm install -g npm@latest
       - restore_cache:
          key: dependency-cache-{{ checksum "functions/package.json" }}
       - run: 
          command: npm install
          working_directory: functions
       - save_cache:
          key: dependency-cache-{{ checksum "functions/package.json" }}
          paths:
             - functions/node_modules
       - run: 
          # functions直下のpackage.jsonで設定したテストを実行する
          command: npm test
          working_directory: functions
 workflows:
  version: 2
  # testというワークフローを作成
  test:
    jobs:
     # 上の方で設定した'function-test'を実行する
      - function-test:
          filters:
            branches:
              # 対象はdevelopブランチ
              only: develop
  # deployというワークフローを作成
  deploy:
    jobs:
     # 上の方で設定した'function-deploy'を実行する
      - function-deploy:
          filters:
            branches:
              # 対象はmasterブランチ
              only: master


캐시계의 태스크(restore_cache와 save_cache)는 없어도 움직이기 때문에 초기 동작의 확인시는 빼도 좋다고 생각합니다.

# save_cache 의 paths에 지정하는 디렉토리 부하가 캐쉬되므로, 의도하지 않고 자신의 소스 코드를 캐쉬하지 않게 주의합시다.
# 캐시를 지우고 싶다면,key: dependency-cache-{{ checksum "package.json" }}-{{ .Environment.NPM_VERSION }}와 같이 키를 설정하면 NPM_VERSION의 값을 CircleCI 관리 화면에서 변경하고 흐름을 Re-run하면 캐시가 사라집니다. (Git의 소스 변경없이 캐시가없는 상태에서 작업을 실행할 수 있습니다.)

package.json



최상위 package.json에 다음을 설정합니다.
이렇게하면 npm run deploy에서 firebase 배포 명령이 실행됩니다.
또한 firebase 배포를 위해 firebase-tools를 설치합니다.
   "scripts": {
    "deploy": "firebase deploy --only functions --token $FIREBASE_TOKEN --project $PROJECT_NAME",
   },
   "devDependencies": {
    "firebase-tools": "^7.0.2"
  }

그건 그렇고,이 배포 명령은 명령을 실행 한 계층 구조 바로 아래에 functions 디렉터리를 대상으로 배포하는 것 같습니다.functions 디렉터리에 있는 상태에서 이 배포 명령을 실행하면 바로 아래에 functions 디렉터리가 없으므로 실패합니다.

환경 변수 설정



package.json에 기재된 $FIREBASE_TOKEN, $PROJECT_NAME는 CircleCI의 관리 화면에서 설정합니다.
또한 $FIREBASE_TOKENfirebase login:ci 명령 실행으로 얻을 수 있습니다.

CircleCI의 환경 변수 설정은 jobs->기어 마크의 클릭으로 거기에서 설정해 주세요.



사이고에게





그리고 github에서 develop 브랜치나 master 브랜치가 움직이면 태스크가 실행됩니다.
(멸차 고차 실패했다)

좋은 웹페이지 즐겨찾기