name: CI/CD
on:
push:
branches: ['master', 'dev']
pull_request:
branches: ['master', 'dev']
jobs:
CI:
#...
CD:
needs: CI
runs-on: ubuntu-20.04
steps:
- name: Run scripts in server
uses: appleboy/ssh-action@master
with:
key: ${{ secrets.KEY }}
host: ${{ secrets.HOST }}
username: ${{ secrets.USER_NAME }}
port: ${{ secrets.PORT }}
script: |
cd thbnb
cd TaeHyeongBnb
git pull
npm ci
npm run build
pm2 restart 0
이전 에러 포스팅에 이어서 CI/CD를 위해 SSH접속을 한 후 동작할 스크립트를 추가해서 CD를 동작시켰더니,
npm: command not found
pm2: command not found
와 같이 두 가지 에러가 발생했다.
bash창에서는 SSH접속 후 동작하는 것을 다시한번 확인했지만, 정상적으로 동작하였다.
일단 npm도 못읽지만 pm2도 못읽고 여러 에러가 한번에 발생하기 때문에 문제가 발생했을 때 스크립트가 멈추는 내용을 추가했다.
CD:
needs: CI
runs-on: ubuntu-20.04
steps:
- name: Run scripts in server
#...
script_stop: true
script: |
cd thbnb
cd TaeHyeongBnb
git pull
npm ci
npm run build
pm2 restart 0
위와같이 script_stop: true
설정을 추가해주면 처음 오류가 발생하면 그 오류를 출력하고 다음 스크립트를 실행하지 않는다.
마찬가지로 이제는 npm: command not found
만 출력하고 있다.
처음에는 문제해결을 위해서 ssh-action@master의 사용방법이나 node로 서비스를 배포할 경우 사용한 사례에 대해서 검색을 했었는데 Akshay joshi 유튜브 동영상(인도 개발자 유튜버?)에서 첫번째 해결방법을 찾았다.
없으면? 당연히 설치해 주면 해결될 것이다.
그런데 이 방법을 따라하기 전에 고민이 생겼다. CD와 같은경우 매번 PR이나 push가 이루어 질 때마다 동작하게 될 것인데, 매 PR이나 push 때마다 설치를 해주는 것은 너무 비효율 적인게 아닌가? 설치하는 시간도 분명히 포함될 텐데 말이다..
따라서 나는 이유를 찾아보고자 했다.
그럼 왜? npm이나 pm2 커멘드를 읽지 못할까?
내 스크립트가 어디가 잘못된 걸까?
어떤 글에서는 bash창에서 ssh를 접속하였을 때는 바로 환경변수를 로드해 오지만, 원격 actions에 의한 접속에서는 로드해 오지 못하기 때문에 source ~/.bashrc
을 통한 alias 및 환경변수 로드가 필요하다고 해서, 스크립트에 똑같이 적용해 보았지만 동작하지 않았다.
다른 ssh-action@master 를 이용한 포스팅을을 쭉 훑어봤지만, 나와 크게 다른게 없었다. 그냥 폴더에 하나 더 들어가냐 마냐 정도의 차이점만 보일뿐! 다른 설정이나 스크립트의 차이는 없었다.
Dev 콩 블로그의 포스팅에서
PATH=$PATH:/home/ubuntu/.nvm/versions/node/v18.7.0/bin
와 같이 전역패스 설정을 해주어야 된다는 글을 보았다.
나는 먼저 적용하기 전에 이유를 생각해 보다가 에러에 대해서 찾다보니 나는 노드를 nvm(node version manager)를 이용해서 내 프로젝트에 맞는 버전을 그대로 설치하였다.
이럴경우 node나 npm에 대한 환경변수가 usr/local/bin과 같은 경로가 아닌 ~/.nvm의 경로로 저장되어 환경변수에 영향을 끼치지 못하게 되었기 때문이다.
따라서 일반적으로 node를 바로 설치하였을 경우에는 문제없이 동작하기 때문에 일부 포스팅에서는 나와같은 스크립트를 작성하였어도 에러가 발생하지 않았고, nvm을 통한 변경된 버전을 설치하는 경우 나와같은 에러가 발생하는 것이었다.
appleboy/ssh-action의 issue tap에는 나와 같은 에러를 마주한 사람이 생각보다 많이 있었고 이를 해결하기 위한 여러가지 방법이 존재했다.
첫번째 콩블로그에서 보았듯이 .nvm에 있는 node버전을 전역패스설정을 해주는방법
export NVM_DIR=~/.nvm
,source ~/.nvm/nvm.sh
를 이용하여 NVM환경을 로드하는 방법
大唐荣华 블로그에서 제시한 sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/node" "/usr/local/bin/node"
를 이용해 심볼릭 링크를 연결하는 방법
이렇게 세가지로 간추릴 수 있었다. 많은 사람들이 두번째 방법으로 이를 해결했다는 내용이 많아서 나 또한 두번째 방법인 export NVM_DIR=~/.nvm
,source ~/.nvm/nvm.sh
를 이용하여 NVM환경을 로드를 이용하여 적용시켜 보았다.
steps:
- name: Run scripts in server
#...
script: |
export NVM_DIR=~/.nvm
source ~/.nvm/nvm.sh
cd thbnb
cd TaeHyeongBnb
git pull
npm ci
npm run build
pm2 restart 0
다행히 정상적으로 동작하는 것을 확인했고, 아직 pm2를 꺼둔 상태라 0번째 프로세스가 존재하지 않아 pm2 커멘드를 실행할 수 없다는 결과가 출력되었다.
^^b