원래 배포는 클라우드타입으로 했다. 근데 아무리 봐도 너무 비싼 것... 그래서 다른 방법을 찾아보다가 포폴에라도 도움이 되게 직접 배포를 하기로 했다. aws, github actions, jenkins 모두 써보고 싶어서 aws+github actions+Jenkins 이렇게 하려 했는데 아무리 봐도 이건 좀 아닌 것 같아서 aws+gihub actions, aws+jenkins 이렇게 둘 다 해보기로 했다.
그리고 우선은 더 유명한 jenkins 먼저 써볼 것임. 이렇게 하면 안되겠지. jenkins 장단점 찾아봐야겠지. 근데 어디선가 봤다. jenkins는 플젝 단위가 커지면 커스텀하기 좋다고.(그렇게 규모 큰 회사 들어가면 좋겠다)
계획: GitHub → Jenkins 트리거 → Docker 이미지 빌드 → ECR 푸시 → ECS 배포
목표: GitHub에서 푸시하면 Jenkins가 알아서 실행되도록 만드는 것.
docker start jenkins
jenkins 접속
나는 localhost:8080으로 접속했다.
Dashboard에서 등록해둔 아이템(프로젝트)을 누르면 configure 페이지가 나온다.
여기서 설명 쓰고, GitHub project에 깃허브 레포 url을 넣는다.
Triggers에서 GitHub hook trigger for GITScm polling을 체크한다.
<여기서 드는 의문>
aws 시크릿 키 같은 건 어떻게 해야 하는가? 깃허브 액션스만 쓰면 거기에 키값을 넣어두면 되는데 젠킨스에선 어떻게 하지?
Jenkins 관리 - Credentials 에 키값 모두 저장. 나는 시크릿 텍스트 형식으로 했다.
-> 프로젝트에 들어가서 구성 -> Environment의 Binding에 저장한 키값 바인딩 -> 아래의 Build Steps의 Execute shell에 export 키값변수=$키값변수 추가해주면 된다.
어어

콘솔을 보니 뭔가 이상하다. 뭐가 뭔지 몰라도 저 두번째, 세번째 줄이 이상한 건 알겠다. 나는 master를 안 쓰는데..? 뭔가 브랜치가 제대로 설정이 안 되어 있는 것 같다.
16:14:22 Avoid second fetch
16:14:22 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
16:14:22 > git rev-parse origin/master^{commit} # timeout=10
16:14:22 ERROR: Couldn't find any revision to build. Verify the repository and branch configuration for this job.
16:14:23 Finished: FAILURE

아니나다를까 역시...우리는 main을 쓰고 있기 때문에 main으로 바꿔주었다.
어 그래도 안된다.
보니까 도커가 실행이 안된다..
16:38:31 + docker --version
16:38:31 /tmp/jenkins~~~~.sh: 10: docker: not found
16:38:31 Build step 'Execute shell' marked build as failure
16:38:31 Finished: FAILURE
왜 도커가 없는거지...?
나는 젠킨스를 도커 컨테이너로 실행하고 있는데.
찾아보니까 컨테이너 안에서 도커 명령을 쓰려면 다음과 같은 두 가지 조건이 충족되어야 한다고 한다.
1. Docker CLI가 Jenkins 컨테이너 안에 설치되어 있어야 한다.
2. 호스트의 Docker 데몬과 통신할 수 있어야 한다.(소켓 공유를 해야 한다)
좀 더 알아보아야겠지만 우선 해결 방안은 다음과 같다고 한다.
jenkins/jenkins:lts 이미지에는 docker CLI가 없기 때문에 docker CLI가 설치된 Jenkins 이미지를 써야 한다.
다음과 같이 하면 된다.
1. 지금 실행 중인 Jenkins 컨테이너를 멈추고 삭제한다.
docker stop jenkins
docker rm jenkins
docker run -d \
--name jenkins \
-p 8080:8080 -p 50000:50000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v jenkins_home:/var/jenkins_home \
jenkinsci/blueocean
젠킨스를 새롭게 실행하고 다시 8080에 접속해 주었더니

오... 뭔가 달라진 것 같다. 메뉴는 비슷한거 같은데 UI가 다르다. 이미지란 이런 것인가...
이제 Docker는 실행이 된다.
문제는 빌드를 또 실패한 것. 근데 이번에는 이유가 좀 확실하다.
Got permission denied while trying to connect to the Docker daemon socket at
오케이... 권한 없음.. 근데 무슨 권한..?
Jenkins가 도커 데몬에 접근할 권한이 없어서 그렇다고 한다.
내가 지금 Jenkins를 Docker 컨테이너로 실행하고 있는데 도커 빌드를 하려면 호스트 머신의 Docker 데몬에 접근해야 한다고 한다. 이거 때문에 -v /var/run/docker.sock:/var/run/docker.sock으로 소켓을 공유했지만, 컨테이너 안에서 도커 명령을 실행하는 사용자(jenkins user)가 그 소켓에 접근할 권한이 없어서 에러가 생긴다.
그러니까 컨테이너 안의 jenkins 유저가 도커 데몬에 접근하기 위해서는 docker 그룹에 넣어줘야 한다. 또 다시..도커를...
docker stop jenkins
docker rm jenkins
docker run -d ^
--name jenkins ^
-p 8080:8080 -p 50000:50000 ^
-v //var/run/docker.sock:/var/run/docker.sock ^
-v jenkins_home:/var/jenkins_home ^
jenkinsci/blueocean
아니 근데 또 실패했다. 권한 문제가 해결이 안된 것이다. 알아보니까 Window에서는 권한 조정이 어렵다고 한다. 그래서 보통 리눅스를 쓰는데 나는 윈도우를 쓰고 싶은걸...
결국은 우분투를 쓰기로 했다.
나 우분투 없는 줄 알았는데 있더라...?...
버추얼박스로 돌리니까 잘 됨. 버추얼박스로 젠킨스 돌려서 젠킨스 잡에 파이프라인 스크립트로 백엔드랑 인프라 레포 클론해와서 실행함.