macOS와 Jenkins
맥에서 Jenkins를 다양하게 실행할 수 있다. 설정의 경우 macOS에서 Jenkins 설정을 참고한다.
Homebrew
맥의 정말 강력한 패키지 매니저인 Homebrew를 사용하면, 단 몇 줄의 명령어만으로 Jenkins 서비스를 설치할 수 있다. 아래와 같이 https://www.jenkins.io/download/lts/macos/의 프로시저를 따르면 된다.
$ brew install jenkins-lts
$ brew services start jenkins-lts
그럼 호스트 시스템의 $HOME/.jenkins
경로에 Jenkins 애플리케이션이 설치된 것을 확인할 수 있다. 따라서 호스트 시스템의 리소스를 사용할 수 있다는 장점이 있다.
DinD(Docker in Docker)
DinD 방식은 Docker가 컨테이너에 설치 돼, 컨테이너 내부에서 Docker executor를 사용할 수 있는 방법이다. https://www.jenkins.io/doc/book/installing/docker/#on-macos-and-linux의 프로시저를 따라 실행할 수 있다.
docker:dind
이미지를 이용하여 다음과 같이 구성할 수 있다.
$ docker network create jenkins
$ docker run \
--name jenkins-docker \
--rm \
--detach \
--privileged \
--network jenkins \
--network-alias docker \
--env DOCKER_TLS_CERTDIR=/certs \
--volume jenkins-docker-certs:/certs/client \
--volume jenkins-data:/var/jenkins_home \
--publish 2376:2376 \
docker:dind \
--storage-driver overlay2
그런데 위 명령어에서 --privileged
로 privileged mode에서 실행이 되기 때문에, 몇 가지 이슈가 발생할 수 있다.
특히 매번 격리된 컨테이너로 실행되기 때문에, Docker의 Layer Caching이 되지 않는다. 그래서 아래와 같이 DooD 방식을 소개하기도 한다.
DooD(Docker outside of Docker)
Docker executor를 컨테이너 내부에서 실행할 수 있는 또 다른 방법이다. Docker 컨테이너 내부에 별도의 Docker 설치 없이 Docker 데몬이 호스트 시스템의 Docker 소켓 을 마운트해서 사용하는 방식이다.
DooD 방식을 통해 Jenkins 컨테이너 내부의 pipeline에서 docker
명령어를 사용할 수 있게 된다.
$ docker pull jenkins/jenkins:lts
$ docker run -d \
--name jenkins-dind \
-p 8080:8080 -p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkins/jenkins:lts
하지만 DooD 방식 또한 몇 가지 이슈가 존재한다.
AWS에서는 그러지말고 다른 빌드툴들을 사용해보라고 추천했는데(ex. Kaniko, Buildah, ...), 이를 잘 비교한 블로그 글이 있었다.