Jenkins / DinD 1-2. DooD(Docker Cloud Agent) + Blueocean

Flexyz·2024년 1월 26일
0

Jenkins

목록 보기
4/11

지난 시간에는 젠킨스에 호스트의 도커 소켓을 직접 공유하여 빌트 인 에이전트를 이용하였습니다.
빌트 인 에이전트 방식은 젠킨스에서 권장하지 않는 방식이기 때문에 이번 시간에는 도커 클라우드 에이전트를 사용해 보겠습니다.

도커 클라우드 에이전트

도커 클라우드 에이전트는 도커가 설치되어 있는 내/외부 환경과 그곳에서 생성될 컨테이너의 템플릿을 등록해 두고
젠킨스 파이프라인에서 해당 라벨의 에이전트를 호출할 때 에이전트 생성 후 사용이 끝나면 자동으로 삭제하는 방식입니다.

이때 기본 에이전트 이미지로 템플릿을 등록할 경우,
컨테이너 내부에 도커가 없고 에이전트 호스트의 도커 소켓과도 공유되지 않으므로 도커 빌드 기능은 사용할 수 없습니다.
이번 시간에는 기본 에이전트 이미지 컨테이너 템플릿을 사용해 본 후, 파이썬 환경을 설치하여 봅니다.

추가적으로 기본 에이전트에 도커를 설치한 이미지를 컨테이너 레지스트리에 등록하여 에이전트 템플릿으로 사용합니다.
이렇게 하면 다양한 도커 이미지를 pull 하여 파이프라인에서 활용할 수 있게 됩니다.
또한 에이전트의 도커 소켓의 볼륨을 공유한 도커 이미지를 사용하여 빌트 인 에이전트와 유사한 방식으로 젠킨스 도커 파이프라인(Docker.build() 등)을 사용할 수 있습니다.

전반적인 구성과 설치는 https://github.com/devopsjourney1/jenkins-101 를 참고하였습니다.


Installation


Create Dockerfile

Dockerfile로 젠킨스 설치 및 권한설정을 합니다.
블루오션과 도커 파이프라인 플러그인도 함께 설치되도록 작성합니다.

# Dockerfile (Ver. 2024.01.26)
FROM jenkins/jenkins:2.443-jdk17
USER root
RUN apt-get update && apt-get install -y lsb-release && \
   curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
   https://download.docker.com/linux/debian/gpg && \
   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 && \
   apt-get update && apt-get install -y docker.io && \
   apt-get clean && rm -rf /var/lib/apt/lists/* && \
   usermod -aG docker jenkins
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean:1.27.10 docker-workflow:572.v950f58993843"

Build the Jenkins BlueOcean Docker Image

docker build -t myjenkins-blueocean:2.443 .

Create the network

docker network create dev-net

Docker cloud container

# https://stackoverflow.com/questions/47709208/how-to-find-docker-host-uri-to-be-used-in-jenkins-docker-plugin

# 내부만 노출
docker run --name socat-docker -d --restart=always -p 127.0.0.1:2376:2375 \
--network dev-net -v /var/run/docker.sock:/var/run/docker.sock \
alpine/socat tcp-listen:2375,fork,reuseaddr unix-connect:/var/run/docker.sock  

# 외부접속 허용 (보안 위험 주의!)
# 외부접속 시 보안리스트에 2376 포트에 특정범위의 소스에서만 접속할 수 있도록 지정
docker run --name socat-docker -d --restart=always --publish 2376:2375 \
--network dev-net -v /var/run/docker.sock:/var/run/docker.sock \
alpine/socat tcp-listen:2375,fork,reuseaddr unix-connect:/var/run/docker.sock

# 컨테이너 IP 조회 (에이전트와 젠킨스의 호스트가 동일할 경우 사용)
docker inspect <container_id> | grep IPAddress # 172.18.0.4 등

Run the Container

MacOS / Linux

# 권한 문제가 없는 상황이라면 생략하셔도 됩니다
mkdir -v ./jenkins-data && sudo chmod -R 777 *

# 젠킨스 실행
# 단순화를 위해 DOCKER_TLS_VERIFY 설정 생략 (DOCKER_TLS은 별도 포스팅하였으니 참고하시기 바랍니다.)
docker run --name jenkins-blueocean --restart=on-failure --detach \
  --network dev-net --env DOCKER_HOST=tcp://172.18.0.4:2375 \
  --publish 8080:8080 --publish 50000:50000 \
  --volume ./jenkins-data:/var/jenkins_home \
  myjenkins-blueocean:2.443

Get the Password

docker exec jenkins-blueocean cat /var/jenkins_home/secrets/initialAdminPassword

Connect to the Jenkins

http://<호스트 퍼블릭 IP>:8080

Docker cloud

None Docker builder agent

도커 빌더가 없는 기본 에이전트

With Python

Job에서 파이썬을 실행시켜야 한다면?

현재 에이전트에는 파이썬 환경이 구성되어 있지 않기 때문에 해당 빌드는 실패합니다.
어떻게 해결할 수 있을까요?

에이전트에 파이썬을 설치하면 됩니다.
이미지를 pull해서 실행한 후 파이썬을 설치하고 다시 빌드해서 올리는 방법도 있겠지만
간단하게 도커 파일을 만들어서 해결해 봅시다.

# Dockerfile.agent.python
FROM jenkins/agent:latest-jdk17
USER root
RUN apt-get update && apt-get install -y lsb-release python3-pip
USER jenkins

빌드 & 푸시합니다.

docker build -t jenkins-agent-python -f Dockerfile.agent.python 
docker login
docker tag jenkins-agent-python:latest codelabmaster/jenkins-agent-python:latest
docker push codelabmaster/jenkins-agent-python:latest 

클라우드 > 도커 에이전트 > 템플릿 추가

아까 도커이미지를 codelabmaster/jenkins-agent-python:latest 로 교체하고 새로 라벨을 줍니다.
그리고 파이썬 잡에서 그 라밸을 지정하면 끝입니다.


With Docker builder agent

도커 빌더가 있는 에이전트

# Dockerfile
FROM jenkins/agent:latest-jdk17
USER root

RUN apt-get update && apt-get install -y lsb-release && \
   curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
   https://download.docker.com/linux/debian/gpg && \
   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 && \
   apt-get update && apt-get install -y docker.io && \
   apt-get clean && rm -rf /var/lib/apt/lists/* && \
   usermod -aG docker jenkins

USER jenkins

# docker build -t codelabmaster/jenkins-agent-docker . 
# docker push codelabmaster/jenkins-agent-docker

도커빌더 활용

Jenkinsfile

pipeline {
    agent { 
        docker {
            image 'docker:latest'
            args '--entrypoint="" --user root -v /var/run/docker.sock:/var/run/docker.sock'
        }
    }
    

    stages {
        stage('Clone repository') {
            steps {
                checkout scm
            }
        }

        stage('Build and push image') {
            steps {
                script {
                    // echo docker --version
                    def imageName = "ap-seoul-1.ocir.io/cnqphqevfxnp/${env.STAGE}-${env.SERVICE}"
                    def image = docker.build(imageName, "-f apps/${env.SERVICE}/Dockerfile --target ${env.STAGE} .")
                    env.IMAGE_ID = image.id
                }
            }
        }

        stage('Deliver') {
            steps {
                script {
                    def image = docker.image(env.IMAGE_ID)
                    docker.withRegistry('https://ap-seoul-1.ocir.io', 'ocir-seoul') {
                        image.push(env.TAG)
                    }
                }
            }
        }
    }
}

(+) Blueocean

아까 젠킨스와 함께 설치한 블루오션입니다.
블루오션은 젠킨스 플러그인 중 하나로 빌드 기록을 단계별로 보기 쉽게 정리해 줍니다.
UI가 직관적이고 현지화가 잘 되어 있어서 별도 설명은 생략하겠습니다. :)

profile
Think about a better architecture

0개의 댓글