혹시나 해서 미리 적어두자면 나는 이 배포를 실패하였다.
제목을 보고 정보를 가져가려고 오신 것이라면 뒤로가기를 하시는 것이 시간을 절약할 수 있는 방법일 것이다. 이 글은 그저 나의 기록일 뿐이다.
저번 포스팅에 이어서 나는 이제 react 모듈을 얹어서 배포하면 끝이라고 생각했다. node.js를 설치하고 빌드해주고 배포하면 끝아닌가? 그래서 deploy.yml 을 아래처럼 실행했다. 물론 아래는 여러번 수정수정 수정끝에 만든것이다.
name: ski-project
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-18.04
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
- name: Cache node modules # node modules 캐싱
run: |
curl -sL https://deb.nodesource.com/setup_18.x | sudo bash -
sudo apt install nodejs
sudo apt-get update
sudo apt-get install nodejs
- name: Install Dependencies # 의존 파일 설치
run: |
cd frontend
yarn install --force
- name: Build with yarn # React Build
run: |
cd frontend
yarn run build
ls -al
cd build
ls -al
env:
CI: false
- name: Grant execute permission for gradlew - backend
run: |
cd ski-backend
chmod +x ./gradlew
shell: bash
- name: Build with Gradle - backend
run: |
cd ski-backend
./gradlew clean build
shell: bash
- name: Grant execute permission for gradlew - sse
run: |
cd sse-server
chmod +x ./gradlew
shell: bash
- name: Build with Gradle - sse
run: |
cd sse-server
./gradlew clean build
shell: bash
- name: Get current time
uses: 1466587594/get-current-time@v2
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
- name: Show Current Time
run: echo "CurrentTime=${{steps.current-time.outputs.formattedTime}}"
shell: bash
- name: Generate deployment package
run: |
mkdir -p deploy
cp ski-backend/build/libs/*.jar deploy/ski-backend.jar
cp sse-server/build/libs/*.jar deploy/sse-server.jar
cp setupnode.sh deploy/setupnode.sh
cp Procfile deploy/Procfile
cp -r frontend deploy/frontend
cp -r .ebextensions deploy/.ebextensions
ls -al
cd deploy && zip -r deploy.zip .
ls -al
- name: Deploy to EB
uses: einaregilsson/beanstalk-deploy@v20
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY }}
aws_secret_key: ${{ secrets.AWS_SECRET_KEY }}
application_name: ski-project
environment_name: Skiproject-env-1
version_label: ski-project-${{steps.current-time.outputs.formattedTime}}
region: ap-northeast-2
deployment_package: deploy/deploy.zip
이것은 잘 작동하였다. 그러니까 이것은 CI서버에서 테스트를 하고 빌드파일을 elasticbeanstalk에 전송하는 것이다. 그렇기 때문에 CI서버에서는 잘 설치가 되었지만, 엘라스틱 빈스톡에는 node가 설치되지 않은 것이다. 그러므로 프론트 앤드(react module)쪽이 실행되지 않았던 것이다.
그래서 했던 삽질은 proc파일을 건드는 것이었다. 이것은 엘라스틱 빈스톡 내부에 코드를 올린후 할 행동들이 기술되어 있는 파일이다. 그러니까 얘가 node.js나 yarn같은 것들을 설치하고 실행하도록 기술하면 프론트 모듈이 실행되지 않겠는가?가 나의 생각이었다. 아래는 proc파일이다.
backend: java -jar /var/app/current/ski-backend.jar
sse-sserver: java -jar /var/app/current/sse-server.jar
frontend: appstart
그리고 이것은 이 proc파일의 appstart 명령을 기술해 놓은 파일이다.
files:
"/sbin/appstart":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
# install node
curl --silent --location https://rpm.nodesource.com/setup_14.x | bash -;
# install yarn
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo;
yum -y install yarn;
# install node_modules with yarn
cd /var/app/current/frontend;
yarn --production;
yarn start;
이 부분에서 나는 포기를 했다. 거의 2일을 밤새서 했던거 같은데 도저히 답이 없었다. 노드가 설치되지도 않았고, 심지어 엘라스틱 빈스톡은 아마존 리눅스2를 써서 ubuntu와는 너무 달랐다. 이것저것 찾다보니 aws linux2는 너무 달라서 절레절레 하는 외국인의 댓글도 몇번 보고 나서는 이렇게하다간 배포를 못해서 앱 서비스를 못하겠다 하는 생각이 들어서 메타코딩 선생님께 질문을 드리고 ec2에 수동배포하는 쪽으로 방향을 틀게 되었다.
선생님께서는 이것은 Docker로 배포하는 것이 편하다 라고 하셨다.
내 스크립트를 어떻게 수정할 것인지에 대해서는 알려주시진 않았다. 그런데 나도 배포를 하면서 계속 했던 생각이 그것이었다. 솔직히 저런 proc파일을 쓸 이유가 없지 않은가? - Proc 명령을 쓸 필요가 없다는것이 아니라 node를 저 방식으로 설치할 이유가 없다는 것 - 그냥 애초에 엘라스틱 빈스톡의 플랫폼을 Docker로 하고 node와 jdk를 까는 명령어 같은걸 입력해주기만 하면 끝인데 뭐한다고 이렇게 개고생을 하고있지? 하는 생각을 했다. 아 물론 Docker를 못하니까 그렇긴한데 너무 서러웠던 시간이었다는 것을 말하고 싶다. 선생님께서 수업 중에 그런말을 하셨다. Docker를 그냥 첨부터 배우면 되지 왜 이렇게 어렵고 복잡하게 수동배포를 하고 그러나요? 라고 한다면 원초적인 방법으로 다 할줄 아는데 얘네가(docker) 이걸 해주니까 그냥 쓰는거라고 이렇게 말할수 있어야 된다고 말이다. 나도 동의한다. 그리고 이번에 이렇게 부딪혀보면서 도커는 왜 필요한가? 에 대해 충분히 배웠다고 생각한다.
다음 포스팅은 ec2에 노가다로 배포했던 시간을 쓸 것이다.