원하는 디렉토리에서 Github Actions 실행하기

Sunghwan Shin·2020년 4월 13일
8
post-thumbnail

무슨 글인가요?

Github Actions로 배포 자동화 등을 진행하다 보면 cli 명령어를 루트 디렉토리가 아닌 하위 디렉토리에서 수행해야 하는 경우가 있습니다. 본 글에서는 레포지토리의 루트가 아닌 하위 폴더에서 패키지를 설치하고 빌드하여 배포하는 과정을 소개합니다.

본 글은 S3 설정에 대해서 다루지는 않습니다 🦔
Github Actions와 S3를 이용한 배포 자동화가 궁금하다면 Github Actions으로 배포 자동화하기 글을 참고하세요!

레포지토리 구조

작업한 레포지토리 구조는 yarn installyarn build를 프로젝트 루트가 아닌 내부 디렉토리에서 실행해야 하는 형태였습니다.

Action file

작성한 전체 코드는 아래와 같습니다.

    name: Auto Deployment to S3 bucket
    
    on:
      push:
        branches: [ master ]
    
    jobs:
      deploy:
        name: Build, Deploy to S3 Bucket
        runs-on: [ubuntu-latest]
        env:
          working-directory: ./website
    
        strategy:
          matrix:
            node-version: [12.16.x]
    
        steps:
          - uses: actions/checkout@v2
    
          - name: Use Node.js ${{ matrix.node-version }}
            uses: actions/setup-node@v1
            with:
              node-version: ${{ matrix.node-version }}
    
          - name: yarn install
            run: yarn install
            working-directory: ${{ env.working-directory }}
    
          - name: Build
            run: yarn build
            working-directory: ${{ env.working-directory }}
    
          - name: Transfer to S3 for serving static
            uses: jakejarvis/s3-sync-action@master
            with:
              args: --acl public-read --follow-symlinks --delete
            env:
              AWS_S3_BUCKET: !!YOUR_BUCKET!!
              AWS_ACCESS_KEY_ID: ${{ secrets.AWS_IAM_KEY_ID }}
              AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }}
              AWS_REGION: 'us-west-1'
              SOURCE_DIR: 'website/build/' + !!YOUR_PROJECT!!

코드의 구조를 간단하게 설명하면 아래와 같습니다.

  1. master 브랜치에 push가 일어났을 때 액션을 트리거합니다. (on)
  2. 아래의 환경설정으로 작업을 수행합니다. (jobs)
    1. env를 선언하여 working directory를 상수로 저장해 둡니다.
    2. 외부의 모듈을 사용하는 uses 구문의 경우 디렉토리를 지정할 필요가 없으므로 기존과 같이 작성합니다.
    3. 직접 cli 명령어를 사용하는 yarn 구문의 경우 working-directory 프로퍼티를 작성해 줍니다.
    4. Deployment에 사용할 마지막 블록에서는 루트로부터의 디렉토리를 작성합니다.

AWS_IAM_KEY_ID 등의 설정에 관해서는 Github Actions으로 배포 자동화하기 를 참고하세용 🥁
두 번 보신 것 같다면 기분탓입니다.

working-directory 프로퍼티 작성

working-directory 프로퍼티는 명령을 실행할 때 마다 수행해 주어야 합니다. 터미널처럼 한번 경로를 이동한다고 상태가 남는 것이 아니라 매번 새로 실행하기 때문입니다.

번거로운 경우, 리눅스 명령어 && 등을 통해서 단축하는 것은 가능합니다.

Build 파일 디렉토리 잡기

로그를 살펴보면 따로 바인딩하지 않았음에도 jakejarvis(S3 deploy) 단계에서 env.working-directory가 설정되어 있는 것을 확인할 수 있습니다. 하지만 기대한 것 처럼 동작하지 않습니다. 즉, working-directory가 하위 폴더로 설정 된 경우라 하더라도 맨 마지막 SOURCE_DIR 디렉토리에는 루트로부터의 전체 주소를 작성하여야 합니다.

마무리

이외에는 위에 링크한 이전 글의 방식(S3에 IAM으로 배포하기)과 완전히 동일합니다. 디렉토리 설정 이외의 코드들에 대해서는 해당 포스트를 참고하세요!

profile
디자인하는 프론트엔드 개발자입니다. 우아한형제들에서 일하고 있습니다.

3개의 댓글

comment-user-thumbnail
2020년 12월 14일

좋은 글 감사합니다.
참고로 필요한 경우 jobs의 기본경로를 설정하여 경로설정의 중복을 줄일 수 있는 방법이 doc에 안내되어 링크 첨부합니다.
https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#jobsjob_iddefaultsrun

1개의 답글