FunChat의 서버코드를 원격저장소에 push할 경우 oracle vm에 ssh로 접속하여 저장소 코드를 pull받아서 서버를 다시 켜줘야한다.
처음에는 ssh접속하여 명령어를 입력하는 나의 모습이 꽤나 괜찮은 개발자처럼 느껴져서 좋았지만 이와 같은 반복적인 작업을 10번 20번을 하다보니깐 이거 완전 노가다잖아!
라고 느껴졌다.
그래서 자동화를 결심하게 되었다.
반복적인것을 자동화 하는것은 무척이나 즐거운 일이고, 나에게 꼬봉하나가 생기는 느낌이다.
자동화 툴은 무엇을 사용할 것이냐? 나는 꼬꼬마 주니어라서 jenkins는 어른들이 사용하는 툴이라고 느껴졌다.
평소 깃헙과 꽤나 친하기 때문에 깃헙에서 제공하는 github action을(이하, ga ==> 이런식으로 단어를 줄이는 것도 자동화다 ㅋㅋㅋ) 사용하기로 했다.
사용해보니 ga가 생각보다 쉬웠다. 그럼 도입과정 스타또!
우선 action에서 workflow 생성 버튼을 눌러도 되고 .github/workflows/[이름].yml
파일을 만들고 안에 스크립트를 입력해도 된다.
먼저 test 코드를 실행후 통과하면 deployment(오라클에 배포)를 하려고 한다.
간단하게 워밍업 삼아서 test를 일단 자동화해보도록 하자(ci).
name: ci / cd
on:
push:
branches: ["master"]
pull_request:
branches: ["master"]
env:
SCRETE_ACCESS: ${{ vars.SCRETE_ACCESS }}
SCRETE_REFRESH: ${{ vars.SCRETE_REFRESH }}
PORT: ${{ vars.PORT }}
jobs:
test:
runs-on: ubuntu-latest
if: ${{ !contains(github.event.head_commit.message, '[ci skip]') }}
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: "npm"
- name: npm install and test
run: |
npm install
npm test
자 그럼 하나씩 코드를 해석해보도록하자.
on에 해당되는 것은 ci를 trigger하는 조건을 의미한다. 즉 마스터 브랜치에 push되거나 pr되면 아래 ci를 진행한다는 소리이다.
env는 말그대로 환경변수이다. npm run test를 통해 테스트 코드를 실행하면 테스트 코드 내에서 익스프레스 서버 port랑 jwt토큰에 필요한 secret 변수를 불러오게 된다.
이 변수들은 로컬에서 .env에 보관을 해놨다. ci환경에서도 동일하게 환경변수를 불러올 수 있게끔 세팅을 해줘야한다.
그때 env
를 설정한다. (참고로 action에서 on, env, jobs를 context
라고 한다)
바로 text를 써줄 수 있지만 노출이 안되는게 좋으므로(그래서 env니깐) 깃헙 액션에서 제공하는 repository variables를 사용하려고 한다.
세팅하는 방법은 아래와 같다.
해당 리포의 settings ▶️ secrets and variabels - actions ▶️ variables ▶️ repository variables 에 변수를 선언한다.
그럼, ${{vars.[변수이름]}}
처럼 변수들을 사용할 수 있다.
(참고로 deployment에서는 ${{secrets.[변수이름]}}
라고 사용하였다. secrets 는 variables옆의 secrets 에서 설정하면 됨!)
그럼 세팅이 끝났다. 이후 jobs context에 test라는 이름의 작업을 적어주면 된다.
runs-on은 ci가 돌아가는 환경이다. if는 ci가 돌아가는 조건을 의미한다.
나같은 경우 [ci skip]
이라는 키워드가 커밋에 들어가면 ci가 스킵되도록했다.
이후 steps을 통해서 명령어를 입력하여 터미널에서 명령어를 실행하듯이 작업가능하다. actions/checkout@v3
같은경우 ci서버에 특정 리포의 코드를 다운받은다음 브랜치를 전환하기 위한 명령어 꾸러미(action)라고 보면된다.
이게 없으면 일일이 명령어를 입력하여 리포의 코드와 싱크를 맞추어주어야하므로 꼭 필요한 action이다.
그렇게 최신코드로 업데이트하고 npm install and test라는 이름하에 실제 test에 필요한 명령어를 입력하면 끝!
그렇게 하고 코드를 푸쉬하면 아래와 같이 action 탭에 yml파일에 입력한 ci가 ui로 표시되는 것을 볼 수 있다.
참고로 host와 username에 무엇을 입력해야하느냐?
ssh에 접속할때 , ubuntu@ec2-3-...
라고 되어있을것이다. 이때 host가 'ubuntu' 이고 username이 'ec2-3...'이다
https://docs.github.com/en/actions/learn-github-actions/contexts
https://aodtns.tistory.com/128