jenkins docker pipeline

728x90

install_docker.sh 도커 설치 스크립트이다. 공식문서를 참조했다. 스크립트를 실행하기 전에 sudo chmod +x install_docker.sh 를 해준 후에 ./install_docker.sh 를 실행해준다.

sudo apt update
sudo apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] <https://download.docker.com/linux/ubuntu> \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

sudo usermod -aG docker ubuntu

jenkins.sh jenkins 설치하는 스크립트이다.

#!bin/bash
# run jenkins
mkdir -p /tmp/docker/jenkins_home
chown -R 1000:1000 /tmp/docker/jenkins_home
docker run -d -p 8080:8080 -p 50000:50000 -v /tmp/docker/jenkins_home:/var/jenkins_home -d --name myjenkins jenkins/jenkins

echo "여기로 접속하세요 <http://$>(curl ifconfig.me):8080"

사이트에 접속을 하면 위 사진처럼 초기 관리자 패스워드가 필요하다고 나온다.

 

마운트 지점 여기서는 /tmp/docker/jenkins_home 이 된다.

 

cat /tmp/docker/jenkins_home/secrets/initialAdminPassword 에 나오는 비밀번호를 입력해서 젠킨스 락을 풀 수 있다.

 

컨티뉴를 누르면 초기 플러그인을 다운로드 받을 수 있는데 추천 플러그인을 다운로드 받으면 된다.

설치가 완료되면 위 사진처럼 계정을 만드는 화면이 나온다. 사용자를 생성해야 젠킨스를 사용할 수 있기 때문에 계정을 만들어주면 된다.

사용자 계정까지 모두 만들고 나면 위와 같이 젠킨스 콘솔로 들어올 수 있게 된다.

nodejs example app

플러그인에서 nodejs 플러그인을 설치한다.

global tool configuration 에서 nodejs 를 사용할 수 있도록 어떤 nodejs 버전을 사용할 것인지 설정하여 추가해준다.

이름과 Freestyle project 를 선택하여 ok 를 클릭

깃허브에서 코드를 가져와서 사용할 것이기 때문에 레포지토리 주소를 적는다.

ssh 로 가져오지 않고 https 로 가져올 것이다.

빌드 환경으로 global tool configuration 에서 추가해준 nodejs 를 사용한다.

nodejs 환경에서 빌드할 때 사용할 명령어를 작성한다.

여기서는 간단하게 npm install 만 사용한다.

'지금 빌드' 를 클릭하여 젠킨스 워킹 디렉토리에 깃허브에서 파일들을 빌드해서 가져온다.

 

cd /tmp/docker/jenkins_home/workspace/nodejs example app 으로 이동하면 npm install 이 실행된 채로 깃허브에 올라온 모든 파일들이 다운로드 된 것을 확인할 수 있다.

 

이렇게 다운로드 된 파일들을 모두 도커를 사용해서 이미지로 말 것이다.

 

일단 nodejs 플러그인을 설치할 때와 동일하게 docker 플러그인을 설치한다.

 

이제 새로 이미지를 빌드해줘야 한다.

 

아래 코드를 작성하면 된다.

 

Dockerfile

FROM jenkins/jenkins

USER root

# install linux packages
COPY configuration.sh /root/configuration.sh
RUN chmod +x /root/configuration.sh && /root/configuration.sh

EXPOSE 8080/tcp
EXPOSE 50000/tcp

configuration.sh

#!/bin/sh
# jenkins 컨테이너에 도커 설치하기
# install docker
apt update
apt install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

curl -fsSL <https://download.docker.com/linux/debian/gpg|> apt-key add -

add-apt-repository \
   "deb [arch=amd64] <https://download.docker.com/linux/debian> \
   $(lsb_release -cs) \
   stable"

apt update
apt install -y docker-ce docker-ce-cli containerd.io
usermod -aG docker jenkins

docke run 명령어를 실행하기 전에 mkdir -p /docker/jenkins_home 로 마운트 할 디렉토리를 생성해준다.

docker build -t jenkins . 로 이미지를 빌드한다.

 

아래 처럼 도커 run 명령어를 실행하여 컨테이너를 띄운다. /var/run/docker.sock 는 도커 호스트와 도커 컨테이너가 통신을 할 수 있게 해주는 소켓 파일이라고 보면될 것 같다. 즉, 도커 컨테이너에서 도 호스트 시스템에 접근할 수 있다.

 

docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -v /home/ubuntu/docker/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock --env "TZ=Asia/Seoul" jenkins

 

docker exec -it <컨테이너> bash 명령어로 컨테이너에 접속한 후 docker ps 명령어를 입력하면 도커 명령어가 잘 실행되는 것을 확인할 수 있고, 컨테이너 내부에서 도커 명령어를 사용해서 컨테이너를 만들 수 있다.

 

이 컨테이너 내부에서 만들어진 컨테이너는 도커 호스트에 컨테이너가 띄워지게 된다.

 

즉, 컨테이너 내부에서 컨테이너를 띄웠다고 컨테이너 내부에 컨테이너가 있는 것이 아니라 도커 호스트에 컨테이너가 띄워지는 것이다.

 

이해가 잘 되지 않는다면 https://www.youtube.com/watch?v=CLCLIV3IBrk 영상을 참조하자.

도움이 많이 됐다.

 

깃 레포지토리에서 도커 파일과 젠킨스 파일을 클론하여 가져온 후 도커 파일로 이미지를 만들고 만든 이미지를 내 도커 레지스트리에 푸시해서 올린다.

 

이 과정을 jenkins pipeline 을 사용하여 한 번에 동작하도록 할 것이다.

빌드 환경 구성

Jenkins에서 Docker 이미지를 빌드하기 위해선 별도의 플러그인이 필요하다. Jenkins 플러그인 설치 페이지로 이동 후 "Docker Pipeline" 플러그인을 설치한다.

다음으론 Docker Registry의 인증 정보를 등록해 줄 차례이다.

 

Jenkins 관리 → Manage Credentials → Stores scoped to Jenkins 카테코리에 있는 Jenkins 클릭 → Global credentials 클릭 → Add credentials 클릭

도커 허브 아이디와 비밀번호를 입력하고 젠킨스 파일에서 사용하는 credentials id 에 입력할 값을 ID 란에 적어준다.

본인은 ID 를 docker 로 지정했다.

다음은 git을 이용하기 위한 설정이다. 먼저 Jenkins가 설치된 서버에 git이 없다면 설치한다.

$ sudo apt-get install git

그 후 git exe 경로를 확인한다.

$ git --exec-path

Jenkins의 Global tool configuration 페이지로 이동해 Git 항목을 확인한 경로로 수정해 준다.

다음은 도커 사용 권한을 변경한다.

기본적으로 Jenkins에서 바로 docker.sock를 사용할 순 없다. 다음 명령어로 권한을 부여해야 한다.

$ sudo chmod 666 /var/run/docker.sock

Jenkins 아이템 생성

이제 Jenkins Pipeline을 사용해 실제 빌드를 진행힌다.

"새로운 Item"을 클릭해 "Pipeline"을 선택하고 새로운 아이템을 만든다.

node {
  stage('========== Clone repository ==========') {
    checkout scm
  }
  stage('========== Build image ==========') {
    app = docker.build("jenkins-docker-pipeline/my-image")
  }
  stage('========== Push image ==========') {
    docker.withRegistry('YOUR_REGISTRY', 'YOUR_CREDENTIAL') {
      app.push("${env.BUILD_NUMBER}")
      app.push("latest")
    }
  }
}

저장소를 확인해 봤다면 초기 코드가 위와 같다는 것을 알 수있다. 또한, 내부에서 ${env.BUILD_NUMBER}를 사용하고 있는 것을 확인할 수 있다. 이 값을 태그로 이용할 것이며 해당 값은 빌드할 때 함께 넘겨준다. 이를 위해 매개변수를 정의한다.

여기서 your credential 부분에 맨 처음에 credential 추가할 때 입력한 ID 값을 넣어주면 된다.

최종적으로는 아래와 비슷하게 될 것이다.

docker.build(”<도커 허브 계정명>/<사용하고자 하는 도커 저장소 이름>”) 으로 작성해준다.

내부에서 ${env.BUILD_NUMBER}를 사용하기 때문에 매개변수의 디폴트 값과 사용하는 매개변수 명을 작성한다.

다음은 파이프 라인 관련 설정이다. 파이프라인 설정은 다음과 같이 설정하면 된다.

"Pipeline script from SCM"을 선택한 뒤 SCM은 git을 고르고 리포지토리 주소를 입력하면 된다. 해당 리포지토리 내의 "Jenkinsfile"을 파이프라인 스크립트로 사용하겠다는 의미를 갖는다.

 

"Build with parameter"를 클릭해 BUILD_NUMBER를 입력한 뒤 빌드하면 파이프라인을 통해 빌드되는 것을 확인할 수 있다.

실제로 도커 레지스트리에 아래 사진처럼 이미지가 올라온 것을 확인할 수 있다.

728x90