Github Actions 으로 자동테스팅/ 자동배포

이진희·2022년 12월 2일
1

트러블

목록 보기
5/11


결론이미지 : actions 의 흐름 이해

CI ??

쉽게 말해 푸쉬나 PR 할때마다 자동으로 테스트코드를 실행해보는 것이다. 만약 테스트를 통과하지 못한다면 빨간불이 들어오고 PR 시에는 에러가 나온다!
푸쉬할때마다 run 이라는 명령어로 정의해둔 작업을 실행한다.
예를 들어 package.json script 에 "test": "jest로 유닛테스팅" 이라는 스크립트가 있다면 아래와 같이 액션파일을 설정할 수 있다.

name: codeTest

on:
  // main 브렌치에 푸쉬될때마다
  push: 
    branches: [ "main" ]
  // main 브렌치에 PR 이 생길때마다.
  pull_request:
    branches: [ "main" ]
// 무슨 일을 시킬거냐?
jobs:
  connect:
	// 런-온 은 어떤 기계로 액션할 것인가 이다. 
    // 필자는 우분투 최신버전을 이용 
    runs-on: ubuntu-latest
    // 무슨일을 할건가 이다.
    steps:
    // npm 처럼 깃액션에도 여러 패키지가 있다 
    // 현재 레포지토리로 checkout 하는 패키지를 사용(사실무관)
    - uses: actions/checkout@v3
    // 노드를 설치하고 아래 run 을 실행시킬 행동의 이름
    - name: Setup node.js@16.x
   	  // 노드를 깔아주는 패키지
      uses: actions/setup-node@v3
      // 버전을 정하고, 캐싱하여 다른 액션을 취할때 속도향상
      with:
        node-version: 16.x
        cache: 'npm'
      // 이제부터 커맨드 입력임
    - run: npm ci  // ci는 npm i 랑 비슷한거라고 한다..
    - run: npm run test // npm run test 진행

그럼 깃액션에서 설정해둔 버츄얼 머신으로 위 동작을 수행하는데, test 코드에 오류가 있다면 적색을 스티커를 뱉어낸다.

사진 예시는 test 상황이 아니고 깃액션으로 실행한 VM 에서 서비스 배포중인 EC2로 접근하는 것을 시연중이다..
그냥 실패하면 빨간 불이 들어오는 것을 확인시켜주고 싶어서 올림

자 엄청난 길이의 서론은 마무리!

본격적으로 CD(자동배포) 해보자

나는 CD를 이미 배포중인 서비스를 레포지토리에서 푸쉬 될때마다 업데이트 하려는 의미로 사용할 것이다.

어떻게 main 레포에 푸쉬될때마다 EC2환경에서 배포되고 있는 서비스를 업데이트 시킬 것이냐 ??
1. 액션하는 VM 에서 EC2 SSH 연결
2. 해당 프로젝트로 이동 (cd ...)
3. pm2 stop 해당프로젝트
4. git pull origin main (main 브렌치에 푸쉬 or PR 되었으므로)
5. pm2 start 해당프로젝트
6. pm2 save

이러한 흐름으로 진행할 것이다.
~~준비물은 EC2에 연결하기 위해 필요한 .pem 파일이다.
필자는 이 파일을 private repository 에 저장해두고 아래 코드로 EC2 컴퓨터에 접근하려고 했다..
코드는 다음과 같음.
참고로 repo secrets 에 두개의 환경변수가 있다
1. PRIVATE_REPO_URL : private 레포지토리 를 클론하는 URL
2. PRIVATE_REPO : private 레포지토리 이름 (cd 에 사용될 것)

name: Test
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
jobs:
  Auto_Deploy:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    - name: Clone and Connect EC2
      run: |
      	# 바로 아래에서 환경변수 사용
        git clone ${{secrets.PRIVATE_REPO_URL}} &&
        # cd로 클론한 폴더에 접근 컴퓨터에는 ***로 표기됨
        cd ${{secrets.PRIVATE_REPO}} &&
        ls &&
        # chmod 400 을 주어서 pem 파일에 권한을 줬음
        chmod 400 jinytree_aws.pem &&
        # EC2 에 SSH 연결 시도!
        ssh -i jinytree_aws.pem ubuntu@54.180.24.185 &&
        pwd

위 코드를 통해 보고자 했던것은 EC2 컴퓨터에 접속된것+pwd 로 현재위치 파악하여 /home/ubuntu 가 나온다면 성공!

잘 모르겠지만 이미 VM 환경으로 접속한 상태에서 또다시 SSH 접속을 시도해서 생긴 에러같다.
찾아보니 -o StrictHostKeyChecking=no 커맨드를 ssh 바로 뒤에 추가해주면 hostkey 를 체크하지 않고 접속을 시도하는 듯 하다.

수정후 다시 시도

확실히 EC2에 접근은 했는데 pwd 가 깃액션vm 으로 되어있다..
ec2 ssh 커맨드이후 직후 pwd 입력했더니

/home/ubuntu 가 출력된다!!

아마 접속후 바로바로 커맨드를 이어가야 하는 듯 하다
구글링을 통해 ''안에 && 로 연결하여 커맨드를 연결할 수 있다.
이제 init 으로 실행되고있는 pm2 를 멈추는 커맨드를 입력하겠다

        git clone ${{secrets.PRIVATE_REPO_URL}} &&
        cd ${{secrets.PRIVATE_REPO}} &&
        ls &&
        chmod 400 jinytree_aws.pem &&
        ssh -o StrictHostKeyChecking=no -i jinytree_aws.pem ubuntu@54.180.24.185 '
          cd wetube-clone &&
          node -v
        '

대체 에러가 몇번이 나오는건지!!
node -v 에서 node라는 커맨드를 못찾는다...
이것도 구글링으로 답을 찾았다. 아래 두 커맨드를 추가해준다면 ec2 환경에 있는 nvm 을 사용한다는 뜻이 아닐까?!

          export NVM_DIR=~/.nvm &&
          source ~/.nvm/nvm.sh &&

완성 코드

        ssh -o StrictHostKeyChecking=no -i jinytree_aws.pem ubuntu@54.180.24.185 '
          export NVM_DIR=~/.nvm &&
          source ~/.nvm/nvm.sh &&
          cd wetube-clone &&
          pm2 stop init &&
          git pull origin main &&
          pm2 start init &&
          pm2 save
        '

0개의 댓글