본문 바로가기

프론트엔드

package.json의 version을 환경 변수로 설정하기

  • 키워드: package.json, yarn version, $npm_package_version, .env(dotenv), bitbucket pipeline, grep/awk/sed/tr
  • 상황
    1. 웹페이지에 현재 package.json의 version field 값을 string으로 표시하고자 한다. (ex> 'v2.4.2')
    2. npm scripts의 package.json vars를 사용하면 $npm_package_version이라는 값으로 쉽게 version을 가져올 수 있다.
      https://www.npmjs.cn/misc/scripts/#packagejson-vars
    3. 또는 'yarn version' command를 사용하여 현재 package.json의 version을 확인할 수 있다.
      https://classic.yarnpkg.com/en/docs/cli/version
    4. .env에
        REACT_APP_VERSION=$npm_package_version​
       을 추가하고, 개발환경에서 version이 올바르게 불러와지는 것을 확인했다.('v2.4.2')
    5. 이후 같은 방식으로 bitbucket deployments의 환경 변수(github secrets와 유사함)에 $npm_package_version을 추가했지만, 파이프라인에서는 이를 문자열 그대로 인식하여 'v$npm_package_version'으로 나타나는 버그가 발생했다.
      환경 변수를 설정해도 $npm_package_version을 문자열 그대로 인식한다.
  • 해결 과정
    1. 먼저 bitbucket deployments 환경 변수는 문자열을 그대로 인식한다는 점을 파악했으니, pipeline 스크립트 파일 내에서 스크립트를 통해 해결하고자 했다.
    2. pipeline에서 build하기 직전, .env 파일에 echo를 이용하여 환경변수를 추가하면 가능한지 시험해보았다.
        // bitbucket-pipelines.yml
      image: node:14.17.0
      ... 생략 ...
      - echo REACT_APP_VERSION=$npm_package_version >> .env
      - yarn build
    3. 하지만 pipeline이 실행되는 환경은 pakcage.json과 관련없는 일반적인 node 환경이었기 때문에 $npm_package_version의 값은 빈 문자열이 되었다. ('v ')
    4. 상황 2의 방법을 사용할 수 없으니 상황 3의 방법으로 해결하고자 했다. terminal에 'yarn node'를 실행하면
        yarn version v1.22.4
      info Current version: 2.4.2
      와 같은 결과가 출력된다. 여기서 '2.4.2'라는 문자열을 파싱하면 문제를 해결할 수 있다.
    5. 먼저 pipeline에서 yarn version을 실행해본 결과, 'vyarn version v1.22.4...생략...: 2.4.2'라는 값이 배포되는 것을 확인했다.
        // bitbucket-pipelines.yml
      - echo REACT_APP_VERSION=$(yarn version) >> .env
      - yarn build
       그렇다면 이제 yarn version의 결과물을 적절히 parsing하면 된다.
        yarn version | grep version | awk -F: '{ print $2 }' | sed '/^$/d' | tr -d ' '
      위의 명령어를 통해 '2.4.2'라는 version만 추출할 수 있다.
    6. 이제 .env나 bitbucket 환경 변수를 따로 추가하지 않고 pipeline을 통해 자동 배포해도 version이 업데이트 된다!
        - echo REACT_APP_VERSION=$(yarn version | grep version | awk -F":" '{ print $2 }' | sed '/^$/d' | tr -d ' ') >> .env
      - yarn build​