티스토리 뷰

반응형

1 서론
2 프로젝트 설정
3 브랜치 설정
4
파이어베이스 프로젝트 별칭을 로컬 .firebaserc에서 등록
5
github action을 리모트서 직접 테스트하지말고 act 툴을 활용해보기
6
ci 배포를 위해 firebase 인증 토큰 이용하기
7 action 예제

# 서론

오랜만에 외부 프로젝트를 진행하다, 여러 스테이징을 나눠개발할 필요성이 있다고 생각하였다. 여러 명이서 작업하고, 여러 명이 각자의 기능이 제대로 되는지 확인이 필요하기 때문이다.

- 이거 내 로컬 PC에서는 되고, 푸시하고 파베에 배포했을 때도 됐거든? 근데 너꺼 머지하고 배포한뒤 파이어베이스 들어가보니 왜 안되지?

이런 상황을 피하고 싶기 때문이다. 이전 사람이 푸시했을 때 되었다는 걸 (빌드를 뛰어넘어 기능적인 의미도 있겠지만) 로컬로 브랜치를 체크아웃 하여 로컬 PC에서 도 돌려보고 또 그걸 파이어베이스에 배포를 해야하는데 그럼 운영 하는 파베를 잠시 내려야하겠고 ..

여튼 짧게 말해서 브랜치를 나눈 만큼 운영/개발/테스트 환경도 분리하는게 편리하기에 세팅을 했다.

# 프로젝트 설정

파이어베이스는 각 프로젝트가 각 인스턴스 같이 동작하는데 그래서 프로젝트를 세 개를 만들었다. (seoulnpo)

# 브랜치 설정

깃헙에도 feature/*, develop, main 브랜치가 있다.

# 파이어베이스 프로젝트 별칭을 로컬 .firebaserc에서 등록

로컬 PC에서 파이어베이스 프로젝트를 Init하게되면 firebase.json, .firebaserc가 생성된다. 둘다 파이어베이스 프로젝트 설정파일인데, .firebaserc 에서 프로젝트별 alias를 설정할 수 있다.

.firebaserc를 직접 수정하여 하는 방법도 있겠지만, 아래 명령어로 firebaserc를 업데이트할 수 있다. (interactive 모드이다)

firebase use --add

위 선택을 수행하게 되면, .firebaserc가 업데이트 된다

좌측은 alias, 우측은 프로젝트의 고유 ID

이렇게 설정하게 되면 cli에서 firebase use test 명령어로 프로젝트를 설정한 후 firebase deploy를 하게 되면 배포가 가능하다.

firebase use test
firebase deploy // or
firebase deploy --token &token // ci 환경

firebase target:apply도 유사한 기능을 지원했는데, 내부동작이 다르기 때문에, functions를 지원을 안하고 있다. 그래서 firebase use를 사용하였다. 이게 내가 원하는 기능이기도 했다.

# github action을 리모트서 직접 테스트하지말고 act 툴을 활용해보기

https://github.com/nektos/act

나는 mac os 라서 mac os 설치하라는 데로 설치했다. docker는 이미 깔았었기에. 만약 docker가 없다면 설치하도록하자.

act가 돌아가는 도중의 로그 스크린샷

- 가끔 act 실행시 container가 생성되지 않고 멈출 때가 있는데, 그땐 이전 container가 좀비처럼 살아있는 것이다. docker ps로 확인이 가능한데 rm -f 로도 삭제되지 않았다. '활성 상태 보기' 서 과감하게 docker를 종료하고 다시 docker를 킨다음 실행하면 잘된다.

# ci 배포를 위해 firebase 인증 토큰 이용하기

고립된 환경, 컨테이너에서 인증을 진행하기 사전 작업이 필요하다. 터미널에서 firebase login:ci 를 수행한 후 터미널에 보여지는 token을 저장해서 사용하면 된다. 터미널에 뜨는 내용을 봐서는 추후에 deprecated 될듯하다

Authenticating with a `login:ci` token is deprecated and will be removed in a future major version of `firebase-tools`. Instead, use a service account key with `GOOGLE_APPLICATION_CREDENTIALS`:
https://cloud.google.com/docs/authentication/getting-started

https://firebase.google.com/docs/cli

당장 사용에 이슈는 없으니 일단은 이 정도로 DONE 처리 함

 

# 액션 예제

문법과 관련된 내용은 https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions 참고 
필요한 것 부터 보자!

env:
  branch: ${{ github.ref_name }}
  token: ^^__;;; 여러분들은 토큰을 여기에 넣으면 안되어요! 레포지터리의 settings > secret에 등록해서 사용!!!!

name: deploy-firebase
run-name: deploying firebase by ${{ github.actor }} 
on: [push]
jobs:
  build-and-deploy-functions:
    runs-on: ubuntu-latest
    steps: 
      - uses: actions/checkout@master
      - uses: actions/setup-node@master
        with: 
          node-version: 16.18.0
      - name: install dependencies
        run: | 
          npm install -g firebase-tools
          cd server && npm install 
      - name: environment-set-test
        if: ${{ contains(env.branch, 'feature') }}
        run: |
          echo ${{ secrets.TEST_ENV }} | base64 -d > server/functions/.env
          cd server && firebase use test --token $token
      - name: environment-set-develop
        if: env.branch == 'develop'
        run: |
          echo ${{ secrets.DEV_ENV }} | base64 -d > server/functions/.env
          cd server && firebase use develop --token $token
      - name: environment-set-master
        if: env.branch == 'main'
        run: |
          echo ${{ secrets.MASTER_ENV }} | base64 -d > server/functions/.env
          cd server && firebase use master --token $token
      - name: deploy
        run:  cd server && firebase deploy --only=functions --token $token
  build-and-deploy-hosting:
    runs-on: ubuntu-latest
    steps: 
      - uses: actions/checkout@master
      - uses: actions/setup-node@master
        with: 
          node-version: 16.18.0
      - name: build
        run: |
          npm install -g firebase-tools
          npm install -g yarn
          yarn 
          yarn build
      - name: environment-set-test
        if: ${{ contains(env.branch, 'feature') }}
        run: firebase use test --token $token
      - name: environment-set-develop
        if: env.branch == 'develop'
        run: firebase use develop --token $token
      - name: environment-set-master
        if: env.branch == 'main'
        run: firebase use master --token $token
      - name: deploy
        run: firebase deploy --only hosting --token $token

조건 분기에 따라 firebase의 develop 프로젝트로 세팅과 environemt 로드 (js/ts dotenv)

내용 끝!

반응형