Server

[서버] Github Actions: 다양한 명령 내리기

Sean 션 2023. 11. 29. 15:25

1. Github Actions 로 특정한 파일만 가져오기

기존 방식

기본적인 EC2 + Github Actions + Docker Hub 으로 배포환경 구축하시는 분들께서 쓰시는 방법:

주변에서도 많이들 사용하는 방식으로, docker-compose up을 위한 docker-compse.yaml 파일을 다음과 같은 방식으로 가져옵니다.

 

1. EC2에 접근하여 docker-compose.yaml을 직접 생성한 후 워크플로우 실행

2. (제가 기존에 사용했던 방식) docker-compose.yaml을 secret/variable 으로 등록한 후 github actions에서 ssh 접근 후 해당 파일을 쓰는 스크립트 실행

 

두가지 모두 불편한 점이 있습니다.

바로 docker-compose.yaml 파일이 수정될때마다 data sync를 수동으로 해야 한다는거죠.

1번 방식 : docker-compose.yaml 수정할때마다 EC2에 접속하여 docker-compose.yaml파일을 직접 수정

2번 방식 : docker-compose.yaml 수정할때마다 Repository Secrets / Variables 에서 값을 직접 수정

 

물론 docker-compose.yaml파일 자체가 수정이 자주 일어나는 파일은 아니긴 합니다만, 자동화를 하는 김에 이것도 자동화를 해봅시다.

(아이디어를 주신 동아리 부원님께 감사드립니다.)

 

      ## docker compose up
      - name: executing remote ssh commands using password
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST_DEVELOP }}
          username: ubuntu
          key: ${{ secrets.KEY_DEVELOP }}
          script: |
            cd /home/ubuntu/repick
            
            sudo touch .env
            echo "${{ secrets.ENV_DEV_VARS }}" | sudo tee .env > /dev/null
            
            sudo curl -o docker-compose.yml https://raw.githubusercontent.com/[조직/계정명]/[레포지토리명]/[브랜치명]/docker-compose.yaml
            
            sudo chmod 666 /var/run/docker.sock
            sudo docker rm -f $(docker ps -qa)
            sudo docker pull ${{ secrets.DOCKER_REPO }}/web-develop
            sudo docker pull ${{ secrets.DOCKER_REPO }}/nginx-develop
            docker-compose -f docker-compose.yaml --env-file ./.env up -d
            docker image prune -f

 

중간에 sudo curl -o docker-compsoe.yml.. 을 보시면 됩니다.

저 명령어 한 줄이면 docker-compose.yaml(yml)파일을 remote 환경으로 가져올 수 있습니다.

 

아주 쉽죠? 

 

2. 프론트엔드 S3버킷 배포 + CloudFront 무효화까지 자동화하기

저처럼 S3 + CloudFront 콤보로 배포하시는분들은 빌드마다 무효화하기 귀찮으실 수 있는데요, 그래서 자동화 스크립트를 가져왔습니다. 

 

name: Build React App
on:
  push:
    branches:
      - main
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [ 16.x ]

    steps:
      - uses: actions/checkout@v1
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node-version }}
      - name: Create env file
        run: |
          touch .env
          echo REACT_APP_API_SERVER=${{ secrets.REACT_APP_API_SERVER }} >> .env
          echo REACT_APP_KAKAO_REST_API_KEY=${{ secrets.REACT_APP_KAKAO_REST_API_KEY }} >> .env
          echo REACT_APP_KAKAO_REDIRECT_URI=${{ secrets.REACT_APP_KAKAO_REDIRECT_URI }} >> .env
      - name: Npm Install
        run: |
          npm install
      - name: Npm Build
        run: |
          npm run build
      - name: Deploy to S3
        uses: jakejarvis/s3-sync-action@master
        with:
          args: --acl public-read --delete
        env:
          AWS_S3_BUCKET: ${{ secrets.AWS_STAGING_BUCKET_NAME }}
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
          SOURCE_DIR: "build"

      - name: Configure AWS credentials and Invalidate CloudFront distribution
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_DEFAULT_REGION }}
          run: |
            aws cloudfront create-invalidation --distribution-id DISTRIBUTION_ID --paths "/*"

 

  • Create env file : 환경변수를 만듭니다. (.env)
  • Npm Install : npm run build 를 실행하기 위해 npm을 설치합니다.
  • Npm Build : 실제 Build를 수행합니다. ( 이 때 경고 메세지도 빌드 실패로 판정되더라구요.. )
  • Deploy to S3 : S3버킷에 파일을 업로드합니다.
  • Configure AWS credentials and Invalidate CloudFront distribution : CloudFront distribution을 무효화합니다.

Secrets :

  • AWS_STAGING_BUCKET_NAME : 버킷 이름입니다. (S3 버킷 이름은 모두 고유합니다. 엔드포인트 == 버킷이름)
  • AWS_ACCESS_KEY_ID : IAM 사용자를 만들고 access key를 만들면 발급 가능합니다.
  • AWS_SECRET_ACCESS_KEY : IAM 사용자를 만들고 access key를 만들면 발급 가능합니다.
  • AWS_DEFAULT_REGION : 리전을 선택하면 됩니다.

 

환경변수는 필요하면 알아서 등록하시면 됩니다.

 

이렇게 하면 프로젝트 푸시만 하면 알아서 프로덕션에 바로 반영이 됩니다. (무효화까지 진행되기 때문) 

 

즐거운 배포 되세용