지난 시간에는 젠킨스에 호스트의 도커 소켓을 직접 공유하여 빌트 인 에이전트를 이용하였습니다.
빌트 인 에이전트 방식은 젠킨스에서 권장하지 않는 방식이기 때문에 이번 시간에는 도커 클라우드 에이전트를 사용해 보겠습니다.
도커 클라우드 에이전트는 도커가 설치되어 있는 내/외부 환경과 그곳에서 생성될 컨테이너의 템플릿을 등록해 두고
젠킨스 파이프라인에서 해당 라벨의 에이전트를 호출할 때 에이전트 생성 후 사용이 끝나면 자동으로 삭제하는 방식입니다.
이때 기본 에이전트 이미지로 템플릿을 등록할 경우,
컨테이너 내부에 도커가 없고 에이전트 호스트의 도커 소켓과도 공유되지 않으므로 도커 빌드 기능은 사용할 수 없습니다.
이번 시간에는 기본 에이전트 이미지 컨테이너 템플릿을 사용해 본 후, 파이썬 환경을 설치하여 봅니다.
추가적으로 기본 에이전트에 도커를 설치한 이미지를 컨테이너 레지스트리에 등록하여 에이전트 템플릿으로 사용합니다.
이렇게 하면 다양한 도커 이미지를 pull 하여 파이프라인에서 활용할 수 있게 됩니다.
또한 에이전트의 도커 소켓의 볼륨을 공유한 도커 이미지를 사용하여 빌트 인 에이전트와 유사한 방식으로 젠킨스 도커 파이프라인(Docker.build() 등)을 사용할 수 있습니다.
전반적인 구성과 설치는 https://github.com/devopsjourney1/jenkins-101 를 참고하였습니다.
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"
docker build -t myjenkins-blueocean:2.443 .
docker network create dev-net
# 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 등
# 권한 문제가 없는 상황이라면 생략하셔도 됩니다
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
docker exec jenkins-blueocean cat /var/jenkins_home/secrets/initialAdminPassword
http://<호스트 퍼블릭 IP>:8080
도커 빌더가 없는 기본 에이전트
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
로 교체하고 새로 라벨을 줍니다.
그리고 파이썬 잡에서 그 라밸을 지정하면 끝입니다.
도커 빌더가 있는 에이전트
# 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)
}
}
}
}
}
}
아까 젠킨스와 함께 설치한 블루오션입니다.
블루오션은 젠킨스 플러그인 중 하나로 빌드 기록을 단계별로 보기 쉽게 정리해 줍니다.
UI가 직관적이고 현지화가 잘 되어 있어서 별도 설명은 생략하겠습니다. :)