각종 후기/우아한테크코스

[우아한 테크코스 3기] LEVEL 3 회고 (184일차)

제이온 (J.ON) 2021. 8. 3.

안녕하세요? 제이온입니다.

 

어제는 JPA 정렬 기능 구현 이후 CommentService의 테스트 코드를 하나도 작성하지 않아서 하루 종일 이 부분을 구현하느라 시간을 보냈습니다. 오늘은 저번에 포기했었던 self-hosted-runner를 도커로 띄우고 CI / CD 하는 과정을 우기와 함께 재시도하였습니다.

 

 

Self-hosted runner with docker

이 소제목이 몇 번이나 올라오는 지 모르겠습니다. 그만큼 시간 투자를 꽤 하였고, 그 과정에서 새로운 지식을 많이 얻을 수 있었습니다. 그럼에도.. 당초 원했던 CI / CD까지는 되지 않았습니다. 이것이 실패한 가장 큰 이유는 빌드된 프로젝트를 도커 컨테이너에서 운영 서버로 scp 통신을 통해 옮기는 것이었습니다.

 

저는 이것만이 배포를 위한 방법이라고 생각했으나, 우기 덕분에 새로운 인사이트를 얻을 수 있었습니다. 바로, scp로 빌드된 프로젝트를 운영 서버로 넘기는 것이 아니라 도커 파일로 생성한 이미지를 도커 레지스트리에 올리고, 운영 서버에서 도커 레지스트리에 올라간 이미지를 내려받아 실행하는 것이었습니다. 도커 레지스트리는 쉽게 말해서 도커 이미지의 버전을 관리하는 깃허브라고 생각하면 됩니다. 이 부분은 제가 구현하지는 않았고, 우기가 잘 구현한 도커 레지스트리를 이용했습니다.

 

workflows에서 작성한 문법은 다음과 같습니다.

 

 

    - name: Push Docker Registry
      if: success()
      run: |
        docker build -t darass/springboot-prod-server:latest .
        docker tag darass/springboot-prod-server:latest [도커 레지스트리 주소]/darass/springboot-prod-server:latest
        docker push [도커 레지스트리 주소]/darass/springboot-prod-server:latest
      working-directory: ./backend

 

 

도커 파일을 활용하여 도커 이미지를 만들어 주고, 해당 이미지에 태그를 붙입니다. 그리고 도커 레지스트리 주소에 해당 태그를 이어서 만든 명령어에 대해 push를 하면 도커 레지스트리에 이미지가 올라갑니다.

 

 

    - name: AWS EC2에 ssh로 접속해서 scripts 실행시키기
      if: success()
      uses: appleboy/ssh-action@master
      env:
        GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
        GIT_PASSWORD: ${{ secrets.GIT_PASSWORD }}
      with:
        host: ${{ secrets.EC2_HOST_TEST }}
        username: ${{ secrets.EC2_USERNAME }}
        key: ${{ secrets.EC2_PRIVATE_KEY }}
        envs: GIT_USERNAME, GIT_PASSWORD
        script: |
          docker pull [도커 레지스트리 주소]/darass/springboot-prod-server:latest
          docker stop springboot-prod-server
          docker rm springboot-prod-server
          docker run -d --name springboot-prod-server -p 8080:8080 [도커 레지스트리 주소]/darass/springboot-prod-server

 

 

그리고 위와 같이 이미 올라가 있던 스프링 부트 관련 컨테이너를 종료 및 삭제하고, 방금 pull 땡긴 이미지로 도커 컨테이너를 띄우면 끝입니다. 다만, docker run을 할 때 volume 속성이 빠져 있는데 이 부분은 추후 추가할 예정입니다.

 

이로써 그렇게 고생하였던 도커를 이용한 self-hosted-runner 구축에 성공했습니다. 기존에 사용하던 CI / CD 서버를 지금 구현한 서버로 대체하는 과정에서 몇가지 자질구레 고칠 부분이 있긴한데 그 내용은 내일 다시 기록하도록 하겠습니다.

 

 

정리

오전에 스프린트 3 회의를 하고, 오후에 혼자 몇몇 버그를 고치고 나서는 집중이 잘 되지 않았습니다. 이 상황에서 우기와 함께 self-hosted-runner 작업을 하니까 집중도 잘 되고 기능 구현도 어려움이 있었지만 나름 성공적으로 완수했다고 생각합니다. 바쁜 상황에도 저를 위해 도와준 우기에게 감사 인사를 표합니다 ㅎㅎ

추천 글