앞에서 ci 편을 통해 테스트 이후 코드가 배포되는 workflow를 자동화 시켜보았다.
그럼 이제 드뎌, 내가 원래 ci/cd를 도입하고자 했던 목적!
바로 oracle에 배포하는 과정을 자동화해보려고 한다.
실제 production환경에 코드를 배포하는 일이기 때문에 cd(continuous deployment)라고 해도 될것 같다.
그럼 바로 코드를 보면서 알아보자.
deployment:
needs: test
runs-on: ubuntu-latest
if: ${{ !contains(github.event.head_commit.message, '[ci skip]') }}
steps:
- uses: actions/checkout@v3.3.0
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
key: ${{ secrets.KEY }}
script: |
cd chat-app-server/
git pull origin master
npm run build:prod
pm2 restart dist/bundle.js
echo "build compleleted✅"
위의 on,env,jobs context는 ci에서 다루었으니 생략하였다.
그럼 바로 살펴보자.
needs라는 context이다. 이름에서도 알 수 있듯이 test라는 jobs가 통과되어야만 실행이 된다는 뜻. 나중에 밑에 첨부한 ui 스샷에서도 볼 수 있지만, test ▶️ deployment 처럼 진행이 되게끔할때 필요한 context이다.
그리고 밑에를 보면 if문이 나온다. ci에서 언급했으므로 생략하겠다.
쭉쭉 내려가면 ssh-action이라는 액션이 나온다. 이 액션이 바로 ci/cd 서버에서 원격으로 ssh에접속할 수 있게 하는 액션이다.
ssh접속할때 host,username,port,key 에 대한 정보가 필요하다.(일종의 환경변수)
이 정보를 with에다가 입력하면 된다.
입력에 필요한 정보를 secrets에 저장하였고 with에서 사용하였다.
그럼 oracle vm에 접속을 할 수 있다.
그리고 나면 인제 깃헙 저장소의 코드를 다운받아서 빌드하고 빌드파일을 실행시켜야한다.
script context에서 그 명령들을 실행시킨다.
이렇게 하고 저장소에 코드를 푸쉬하면 아래와 같이 ui가 표시된다.
need context에 의해 test job뒤에 deployment job이 실행되는 것을 볼 수 있다.(즉 test가 실패하면 deloyment job이 실행되지 않는다)
이로써 나만의 꼬봉이 탄생했다.
알고보면 아무것도 아닌.
인생자체가 그런것이 아닌가? 여튼 이렇게 ci/cd 글을 마무리해본다.
끝!