에러

https://github.com/strapi/strapi/issues/13975

  • 계속 빌드-배포 스크립트만 수정했는데 왜 에러가 발생했는지 잘 모르겠다.

캐시를 지우고 다시 빌드하니 또 성공적으로 수행되었는데, 에러로 인한 중단이 발생하지 않은 것을 보아 추가적인 처리가 필요할 것처럼 보인다.

 

 

빌드 최적화

빌드시 4분정도 걸린다.

 

action script → 빌드 → 실행 → SSH 연결 → 빌드 → 실행 순으로 이루어진다.

 

아무래도 컴퓨팅 성능이 좋지않다보니 시간을 많이 잡아먹기때문에 빌드를 한번으로 줄이거나 다른 패키지 캐싱을 통해 조절하는 것도 좋아보인다.

 

 

상태 비저장

배포를 간단하게 하기 위해 빌드를 action에서 한번만 수행하고 해당 파일을 전송하는 scp 스크립트를 구성했다. 하지만 이렇게 구성하니 디렉토리가 삭제되고 다시 만들어지며 상태가 초기화되는 문제가 발생했다.

 

찾아보니 action의 scp 커맨드는 기존의 파일과 동기화되는게 아닌 새로 생성해버린다.

 

이러한 문제로 admin을 계속 생성해서 저장해야하는 문제가 발생했고 고민한 결과 실제 배포하는 workflow와 테스트하는 workflow 자체를 구분해서 서로 다른 상황에서 실행될 수 있도록 수정하고자 했다

 

정리해보면

main 브랜치는 무조건 pr이 merge 됐을 때 배포되기 때문에 단순히 접속하여 배포작업만 하는 프로세스를 구성한다. 이 외 작업은 단순히 테스트만 하는 자체적인 workflow를 갖추도록 분리하는게 목표이다

name: strapi-ci

on:
  workflow_dispatch:
    inputs:
      logLevel:
        description: 'Log level'
        required: true
        default: 'warning'
      tags:
        description: 'Test scenario tags'
  push:
    branches:
      - main

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout 코드
        uses: actions/checkout@v3

      - name: Node.js 버전 설정
        uses: actions/setup-node@v3
        with:
          node-version: 18

      - name: 종속성 설치
        run: npm install

      - name: 빌드
        run: npm run build
        
      - name: 파일 전송
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.AWS_SSH_HOST }}
          username: ${{ secrets.AWS_SSH_USERNAME }}
          password: ${{ secrets.AWS_SSH_PASSWORD }}
          port: 22
          source: "./"
          target: "strapi-demo/"
          rm: true
          
       - name: 원격 접속 배포
         uses: appleboy/ssh-action@v0.1.6
         with:
           host: ${{ secrets.AWS_SSH_HOST }}
           username: ${{ secrets.AWS_SSH_USERNAME }}
           password: ${{ secrets.AWS_SSH_PASSWORD }}
           port: 22
           script: |
             cd strapi-demo
             git pull
             npm ci
             npm run build && pm2 reload ecosystem.config.js

workflow 분리

빌드

name: deploy

on:
  workflow_dispatch:
    inputs:
      logLevel:
        description: 'Log level'
        required: true
        default: 'warning'
      tags:
        description: 'Test scenario tags'
  push:
    branches:
      - main
    paths:
      - "src/**"
      - "config/**"
      - "database/**"
      - "public/**"
      - "ecosystem.config.js"
      - ".github/workflows/main.yml"

jobs:
  ssh-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: 원격 접속 배포
        uses: appleboy/ssh-action@v0.1.6
        with:
          host: ${{ secrets.AWS_SSH_HOST }}
          username: ${{ secrets.AWS_SSH_USERNAME }}
          password: ${{ secrets.AWS_SSH_PASSWORD }}
          port: 22
          script: |
            cd strapi-demo
            git pull
            npm ci
            npm run build && pm2 reload ecosystem.config.js

테스트

name: strapi build test

on:
  pull_request:
    branches:
      - main
    paths:
      - "src/**"
      - "config/**"
      - "database/**"
      - "public/**"
      - "ecosystem.config.js"
      - ".github/workflows/build-test.yml"
      
      
jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout 코드
        uses: actions/checkout@v3
        
      - name: Node.js 버전 설정
        uses: actions/setup-node@v3
        with:
          node-version: 18
          
      - name: 종속성 설치
        run: npm install
        
      - name: 빌드
        run: npm run build
        
      - name: 프로젝트 실행 테스트
        run: npm start & npx wait-on ${{ secrets.CHECK_URL }}
        env:
          ADMIN_JWT_SECRET: ${{ secrets.ADMIN_JWT_SECRET }}
          API_TOKEN_SALT: ${{ secrets.API_TOKEN_SALT }}
          APP_KEYS: ${{ secrets.APP_KEYS }}
          DATABASE_CLIENT: ${{ secrets.DATABASE_CLIENT }}
          DATABASE_FILENAME: ${{ secrets.DATABASE_FILENAME }}
          JWT_SECRET: ${{ secrets.JWT_SECRET }}
          TRANSFER_TOKEN_SALT: ${{ secrets.TRANSFER_TOKEN_SALT }}

빌드-테스트와 배포 과정을 분리했다 배포는 main 브랜치에 push 될 때(merge되는 경우 포함) 작동되도록 하였고, 빌드-테스트는 브랜치가 열렸을때 작동하게 했다.

 

이때 특정 path를 추가해 lint를 제외시키고 특정 디렉토리나 파일이 업데이트 됐을 때 동작하도록 작성하였다.

 

이를 통해 merge 되기전 해당 코드를 테스트하고 여러 작업을 수행하도록 에약할 수 있고 테스트 실패시 merge될 수 없도록 구성할 수도 있다.

 

다만 해당 기능은 개인 repo가 아닌 팀이나 조직단위 repo에서만 작동된다고 한다

복사했습니다!