로컬환경에 Jenkins를 설치하고 GitHub과의 CI/CD환경을 구축하는 예제다.
기본적으로 공식문서 에서 소개하는 방식을 따라하면 DinD(Docker-in-Docker) 방식으로 구성하게 된다.
DinD의 경우, privileged 권한부여에 의해 컨테이너가 호스트 전체 권한을 가지기 때문에 권장하지 않는다고 한다. 출처
따라서, DooD(Docker-outside-of-Docker) 방식을 통해 Jenkins를 구성할 것이다.
여기서 DinD, DooD 이야기가 나오는 이유는 Jenkins 내부에서 Docker 명령어를 사용하기 위함이다.
DooD 방법은 호스트의 docker.sock 파일을 컨테이너에 마운트하면 된다.
docker volume create jenkins
우선 Jenkins 컨테이너의 설정과 히스토리를 저장하기 위해 볼륨을 생성한다.
FROM jenkins/jenkins:2.462.1-jdk17
USER root
RUN apt-get update && apt-get install -y lsb-release
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
https://download.docker.com/linux/debian/gpg
RUN echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"
이미지 생성을 위한 Dockerfile은 jenkins 공식문서를 참고했다.
docker build -t my-jenkins:0.1 .
빌드 명령어를 통해 이미지를 생성하자.

docker run -d --name test-jenkins \
-v /var/run/docker.sock:/var/run/docker.sock \
-v jenkins:/var/jenkins_home \
--env JENKINS_OPTS=--httpPort=9090 \
-p 9090:9090 \
-p 50000:50000 \
my-jenkins:0.1
my-jenkins:0.1 이미지를 이용해서 Jenkins 컨테이너를 띄운다.
이때 -v 옵션을 이용하여 호스트의 파일/디렉토리를 컨테이너 내의 파일/디렉토리와 마운트한다
이렇게 되면 컨테이너 내부에서 호스트의 파일에 접근할 수 있다.
즉, 호스트 docker의docker.sock를 사용할 수 있다.
또한, 컨테이너에서 설정된/var/jenkins_home이 호스트의jenkins에 저장된다
Jenkins의 기본포트는 8080이지만, Spring도 보통 8080을 사용하기에 변경하고 싶다면 --env JENKINS_OPTS=--httpPort=9090 의 httpPort 부분을 변경하면 된다.

컨테이너 목록에서 제대로 띄워진걸 확인할 수 있다.

또한, 컨테이너 내부에서 도커 명령어가 동작한다.

Jenkins 초기화면이다. 관리자 비밀번호를 입력해주자.
컨테이너에 접속해서 위에 표시해주는 경로로 향하면 된다.

Install suggested plugins 을 선택해서 플러그인을 설치하자.

설치되는 목록은 이미지와 같다.


어드민 유저 정보를 입력하고 Jenkins URL을 설정해주자
Jenkins URL의 경우, 우선 기본설정을 따라간다

여기까지 하면 Jenkins 메인화면에 접속할 수 있다.

CI/CD 테스트를 할 레포지토리를 생성해준다.

보통 Jenkins를 활용한 CI/CD 구축에는 두 방법이 있다.
이 외에 Blue Ocean을 사용할 수도 있는데 일단 FreeStyle과 Pipeline만 알아보자

우선 Jenkins에서 Git Repository에 접근하기 위한 인증정보가 필요하다.

선택가능한 옵션은 위와 같으며, 여기선 GitHub App를 사용할 것이다.
GitHub - Settings - Developer settings 에서
이곳을 참고하여 GitHub APP을 생성하고, Credential을 등록하자

이후, 레포지토리 설정에서 WebHook을 등록해주면 완료다.

소스코드 관리에서 레포지토리를 연동해주자.

빌드 유발에는 GitHub hook trigger for GITScm polling를 선택해준다.

빌드 시, 동작할 명령어를 작성하자.


해당 레포지토리의 branch에 Push를 하고 확인해보면, 아까 입력했던 명령어가 수행된 것을 확인할 수 있다.
빌드트리거는 Freestyle과 동일하게 GitHub hook trigger for GITScm polling를 선택해준다.

이후, Pipeline script from SCM을 선택해주고 Git관련 정보를 입력하여 연결해준다.
참고
이제 Jenkinsfile이라는 파일을 작성해줘야 한다.
pipeline {
agent any
stages {
stage('Example') {
steps {
echo "Hello World"
}
}
}
}
공식문서를 바탕으로 간단한 예제를 작성했다.
이 파일을 레포지토리에 넣고 push를 하면 Jenkins에서 해당 파일을 읽으며 작업을 수행한다.
