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

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

제이온 (Jayon) 2021. 7. 23.

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

 

오늘은 우기, 아론과 oauth2 로직을 추상화하였고, 개인적으로 self-hosted runner를 도커로 띄우기 위한 노력을 굉장히 많이 했습니다. 여기서 oauth2 관련 부분은 이미 우기와 아론이 추상화해 놓은 코드에 대해 여러 가지 인사이트를 제공한 것이 전부라서 기록할 것은 없는 듯합니다.

 

 

Self-hosted runner를 도커 컨테이너로 띄우기

self-hosted runner를 도커 컨테이너로 띄우는 것 자체는 굉장히 간단합니다. 해당 포스팅에서 docker-compose.yml을 잘 정의해 주셨기 때문이죠. 다만, 배포를 하기 위해서는 빌드된 프로젝트를 운영 서버로 보내야하는데 도커 컨테이너 안의 빌드된 프로젝트를 전송하는 방법을 제가 몰랐습니다. 이 부분은 제리가 도커의 volume 옵션을 참고해 보라고 키워드를 알려주었습니다.

 

volume은 쉽게 말해서 도커 컨테이너 내의 특정 디렉토리를 EC2 서버 내의 디렉토리와 연동하는 옵션을 말합니다. 예를 들어 'docker volume create --name runner' 명령어를 입력하면 runner라는 볼륨이 생기고, 도커 컨테이너를 띄울 때 'runner:/var/log' 와 같은 옵션을 추가로 주면 runner 볼륨이 있는 실제 EC2 내의 디렉토리와 도커 컨테이너 내부 /var/log 디렉토리가 연동됩니다.

 

저는 이 옵션을 docker-compose.yml에 추가했습니다.

 

 

version: "3.7"

services:
    runner:
      image: tcardonne/github-runner:latest
      environment:
        RUNNER_NAME: "darass-runner-with-docker"
        RUNNER_REPOSITORY_URL: "https://github.com/woowacourse-teams/2021-darass"
        RUNNER_LABELS: "docker"
        RUNNER_TOKEN: [토큰]
      volumes:
        - /var/run/docker.sock:/var/run/docker.sock
        - runner:/home/runner

volumes:
    runner: {}

 

 

'runner:/home/runner' 명령어가 바로 어떤 도커 컨테이너의 디렉토리를 연동시킬지 나타내는 것입니다. 하지만, 저 같은 경우에 그 아래에 있는 'volumes: runner: {}' 키워드 없이는 제대로 작동하지 않았습니다. 에러 내용은 아래 사진과 비슷했습니다. (비슷하다는 이유는 사진을 퍼온 것이기 때문입니다.)

 

 

https://www.programmersought.com/article/55526975247/

 

 

해당 사진의 출처에 따르면, volumes를 변수로 정의한 다음에 해당 변수를 이용해야 한다고 합니다. 위와 같은 yml을 정의하고 docker-compose up을 하면 volume이 생성됩니다.

 

docker volume ls를 통해 볼륨 목록을 확인할 수 있고, 특정 볼륨에 상세 정보를 알고 싶다면 docker volume inspect [볼륨명]을 입력하시면 됩니다.

 

 

 

 

저같은 경우에는 위와 같이 '/var/lib ~ ' 경로에 실제 디렉토리가 있다고 나와 있었고, 실제로 해당 디렉토리를 찾아가면 도커 컨테이너의 '/home/runner' 디렉토리 내용과 동일한 것을 확인하였습니다.

 

이제 이 상태에서 깃허브 액션 CI 요청을 보내 보았습니다.

 

 

 

 

그런데 우리 프로젝트에서 DB 생성 시간과 관련한 테스트를 통과하지 못 했습니다. 이유를 알아 보니, 제가 timezone을 EC2 서버 내부만 설정해 주었지, 도커 컨테이너의 timezone은 'Asia/Seoul'이 아니어서 생기는 문제였습니다.

 

 

version: "3.7"

services:
    runner:
      image: tcardonne/github-runner:latest
      environment:
        TZ: "Asia/Seoul"
        RUNNER_NAME: "darass-runner-with-docker"
        RUNNER_REPOSITORY_URL: "https://github.com/woowacourse-teams/2021-darass"
        RUNNER_LABELS: "docker"
        RUNNER_TOKEN: [토큰]
      volumes:
        - /var/run/docker.sock:/var/run/docker.sock
        - runner:/home/runner

volumes:
    runner: {}

 

 

그래서 위와 같이 TZ 라는 속성을 추가해 주었습니다.

 

 

이후에 모든 테스트가 성공적으로 통과하여 빌드가 되었습니다. 그러나.. 이번에는 scp 통신이 실패하였습니다. 저는 source의 경로를 '/var/lib/docker/volumes/ubuntu_runner/_data/_work/2021-darass/2021-darass'로 설정하였는데, 해당 경로를 못 찾는 것처럼 보였습니다.

 

 

 

 

그러다가 내린 결론이 하나 있습니다. 현재 이 깃허브 액션을 작동시키는 환경이 도커 컨테이너인데, 애초에 볼륨으로 설정한 경로는 도커 컨테이너 외부 디렉토리이므로 이 디렉토리에는 접근하지 못할 것이다.. 였죠. 얻은 개념이 많은 하루지만, scp 통신을 위한 해결책을 찾지 못했다는 점이 아쉬웠습니다.

 

 

 정리

위의 개발 내용은 조금 슬프지만, 이와 별개로 E사 입사에 합격했다는 소식을 받았습니다. 3개월 간은 계약직으로 근무해야 하지만, 늘 하던대로 열심히 개발에 임하여 꼭 정규직으로 전환되고 산업기능요원 신규 편입도 이뤄내려고 합니다. 아무쪼록 그동안 노력한 결과가 어느 정도 눈에 보이는 것 같아서 굉장히 뿌듯합니다.

 

하지만 입사 일자가 8월 17일이기 때문에 우테코를 조기에 나와야 한다는 점이 참 마음에 걸립니다. 많은 크루들이 축하해 주었지만, 코로나때문에 루터 회관에 가지도 못하고 이대로 회사로 가야할 것 같아서 아쉽습니다. 코로나가 줄어들어서 한 두번이라도 루터 회관을 가거나, 적어도 친하던 크루들이랑 만나서 밥이나 술 정도는 먹었으면 좋겠습니다.

댓글

추천 글