ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Github] Github Action으로 테스트자동화 및 npm에 자동배포하기
    ETC 2021. 3. 28. 21:51
    반응형

    작년 이맘때 npm 배포를 익혀볼 겸 만들었던 nodeJS 기반 CLI 툴이 있었다. "shellcut" 이란 이름을 가진 tool이며 0.0.2 버전을 끝으로 사실상 관리는 안하고 있었다.

     

    그러다 Github Action으로 배포자동화를 경험해볼 겸 끄집어 내었다. 기존 프로젝트는 테스트환경과 사용환경 구분 없이 npm global 설치위치에 shellcut 파일을 생성하고 있었다. 따라서 jest를 이용한 단위 테스트시 실제 사용하는 영역을 건드리는 불상사(?)가 있었다.

     

    0.0.3은 이 불상사를 제거한 버전이며, cross-env 패키지를 추가 적용했다.

    1. npm 로그인 및 access token 생성

    npm 사이트에 로그인 후 계정 아이콘을 눌러 Access Tokens 메뉴를 선택한다.

    선택하면 Access Tokens 메뉴가 표시된다. Generate New Token 을 선택한다.

    테스트 및 배포 자동화 목적이므로 Automation 을 선택하고, Generate 한다.

    생성하면 새로운 Token이 화면에 표시된다. 이 Token은 최초 한번만 화면에 표시되므로 별도의 위치에 잘 보관해둬야 한다.

    2. 템플릿 선택

    Github 리포지토리 페이지에서 Actions 탭을 누르면 아래와 같이 제안된 Workflows가 표시된다. shellcut 리포지토리에 nodeJS 소스 및 배포관련 파일들이 보관되어 있기 때문에 자동으로 제안해준다.

    만약 제안되지 않을 경우, 직접 리포지토리로 찾아가 복사해와야 한다.

    (모든 코드를 직접 짜는건 힘들다. 😅)

     

    github.com/actions/starter-workflows/blob/2ab72ee4035908e06638636193e10ee0cc1c4199/ci/npm-publish.yml

     

    actions/starter-workflows

    Accelerating new GitHub Actions workflows . Contribute to actions/starter-workflows development by creating an account on GitHub.

    github.com

    선택하고 나면 텍스트 에디터가 표시된다. 에디터에는 아래와 같은 내용이 자동추가된다.

    * 2021년 03월 기준이기 때문에 향후에 내용이 다를 수도 있음

    # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
    # For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
    
    name: Node.js Package
    
    on:
      release:
        types: [created] 
    
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v2
          - uses: actions/setup-node@v1
            with:
              node-version: 12
          - run: npm ci
          - run: npm test
    
      publish-npm:
        needs: build
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v2
          - uses: actions/setup-node@v1
            with:
              node-version: 12
              registry-url: https://registry.npmjs.org/
          - run: npm ci
          - run: npm publish
            env:
              NODE_AUTH_TOKEN: ${{secrets.npm_token}}
    
      publish-gpr:
        needs: build
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v2
          - uses: actions/setup-node@v1
            with:
              node-version: 12
              registry-url: https://npm.pkg.github.com/
          - run: npm ci
          - run: npm publish
            env:
              NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
    

     

    publish-npm job 영역에 registry-url을 사전에 배포한 패키지의 url로 변경해준다.

    registry-url: https://registry.npmjs.org/shellcut

     

    npm과 gpr(GitHub Packages)에 배포하는 workflow가 존재하는데, npm에만 배포할 예정이므로 publish gpr은 주석처리한다.

    #  publish-gpr:
    #    needs: build
    #    runs-on: ubuntu-latest
    #    steps:
    #      - uses: actions/checkout@v2
    #      - uses: actions/setup-node@v1
    #        with:
    #          node-version: 12
    #          registry-url: https://npm.pkg.github.com/
    #      - run: npm ci
    #      - run: npm publish
    #        env:
    #          NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
    

    env 영역에 NODE_AUTH_TOKEN : ${{secrets.npm_token}} 를 보면 고정된 텍스트가 아닌 변수를 사용함을 알 수 있다.

    이 변수명을 잘 기억해두자. 다음 단계에서 사용해야한다.

     

    Start commit을 눌러 파일 추가를 완료한다.

     

    3. 리포지토리에 Secret 적용

    리포지토리의 Settings 탭으로 이동한 뒤, Secrets 메뉴에서 New repository secret을 눌러준다.

    이전 단계에서 생성했던 npm token을 "npm_token"이란 이름의 Secret 값으로 추가한다.

    4. Release 시켜 배포자동화 테스트 확인

    템플릿을 통해 만든 Github Action의 실행조건이 Release create 이기 때문에 Release 를 생성해줘야 한다.

    on:
      release:
        types: [created]

    리포지토리의 code 탭에 가면 오른쪽에 Release 메뉴가 보일 것이다. 해당 영역을 선택한다.
    * 배포 이후에 스크린샷을 남기는 바람에 이미 태그가 존재한다. 

    추가버튼을 누르면 태그 입력과 릴리즈에 대한 설명을 작성하는란이 표시된다. 필요한 내용을 작성한 후, "Publish release"를 누른다.

    생성하고 나면 소스코드 압축본이 담긴 Release 가 기록된다.

    Actions로 돌아가보면 package 배포 액션이 동작한 것을 확인할 수 있다.

    * 스크린샷의 실패사유는 gpr을 제대로 안지워서 생긴 이슈이다. 😅

    npm 사이트로 돌아가보면 신규 버전으로 배포된 패키지를 확인할 수 있다.

    * 태그명이 0.0.3이라고해서 0.0.3으로 기록되어 배포된게 아니다. 해당 과정을 수행하기전에 package.json 에서 버전 값을 0.0.3으로 바꿨기 때문이다.

     

    이것으로 배포 뻘짓을 진행해보았다.

     

    유의사항

    배포과정을 진행하면서 npm ci 명령어를 위해 package-lock.json이 필요하다는 것을 깨닫게 되었다.

    반응형

    댓글

Designed by Tistory.