[Jenkins] - docker / docker-compose를 사용하여 설치

작업 순서

  1. Dockerfile 생성
  2. docker-compose 파일 생성
  3. shell 파일 생성
  4. 실행

1. Dockerfile 생성

#Dockerfile

FROM jenkins/jenkins:lts
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

#---- docker-ce-cli
RUN apt-get update && apt-get install -y docker-ce-cli

#---- sshpass
RUN apt-get -y install sshpass

#---- locale
RUN apt-get install -y locales git \
    && localedef -f UTF-8 -i ko_KR ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8

USER jenkins

# image 생성 단계에서 에러 발생하여 주석처리 
# RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"

2. docker-compose 파일 생성

아래의 값들은 .env 파일을 통해 전달

  • UID/GID - volume 폴더를 읽기/쓰기 위한 권한 사용자의 정보 / id -u / id -g
  • $VOLUME_JENKINS_HOME - jenkins 설치 volume 경로
  • ${DOCKER_GROUP} - docker 실행 그룹 / stat -c '%g' /var/run/docker.sock
  • file: docker-compose.yml
version: "3" 
services:

  my-jenkins:
    container_name: my-jenkins
    user: "${UID}:${GID}"                 # volume 폴더 젒근 권한 설정
    image: my-jenkins
    build: .
    volumes:
      - $VOLUME_JENKINS_HOME:/var/jenkins_home # jenkins 설치 폴더
      - /var/run:/var/run:ro              # docker 실행 폴더 공유
    environment:
      - TZ=Asia/Seoul                     # jenkins 시간
    ports:
      - "18080:8080"                      # jenkins 접속 port
      - "50000:50000"                     # jenkins agent를 통해 통신 할때 
    group_add:
      - ${DOCKER_GROUP}                   # docker 실행을 위한 그룹 추가 

3. shell 파일 생성

  • jenkins 실행에 필요한 .env 및 volume directory 생성하기 위한 용도
  • .env / volume 디렉토리를 수동으로 설정한다면 필요 없음 - docker-compose 명령어를 직접 사용
  • file: docker-compose-run.sh
#! /bin/bash
# docker image를 사용하여 jenkins를 사용하기위한 스크립트
# docker-compose 실행을 위한 환경 변수 및 폴더 생성
# ./docker-compose-run.sh build - jenkins 실행에 필요한 volume 및 .env파일 생성
# ./docker-compose-run.sh up - jenkins 실행
# ./docker-compose-run.sh down - jenkins 컨테이너 down
# ./docker-compose-run.sh remove - jenkins 컨테이너 /이미지/네트워크 /.env 삭제
#                                - volume용 directory는 삭제하지 않음

readonly JENKINS_HOME_DIR="/home/asd/doc/jenkins"
readonly RUN_COMMAND=$1

#-------------- functions ---------------------------------------------

# https://stackoverflow.com/questions/3685970/check-if-a-bash-array-contains-a-value
containsElement () {
  local e match="$1"
  shift
  for e; do [[ "$e" == "$match" ]] && return 0; done
  return 1
}

check_run_command() {
    local commands=("build" "up" "down" "remove")
    if ! containsElement "$RUN_COMMAND" "${commands[@]}" ; then
        echo "Please select run command(build/up/down/remove): ex) ./docker-compose-run.sh up"
        exit 1
    fi
}

create_dir() {    
    mkdir -p $JENKINS_HOME_DIR
    echo "----------------- Create directory -----------------"
    echo "jenkins_home volume: $JENKINS_HOME_DIR"
}

create_env() {
    echo "----------------- Create environment file: .env -----------------"
    cat >.env <<EOF
GID=$(id -g)
UID=$(id -u)
DOCKER_GROUP=$(stat -c '%g' /var/run/docker.sock)
VOLUME_JENKINS_HOME=$JENKINS_HOME_DIR
EOF

    # print .env file
    cat .env
}

execute_docker_compose() {
    echo "----------------- Execute docker-compose -----------------"
    if [ "$RUN_COMMAND" == "up" ]; then
        docker-compose -f docker-compose.yml up -d
    elif [ "$RUN_COMMAND" == "remove" ]; then
        docker-compose -f docker-compose.yml down --rmi all
        rm .env
    else 
        docker-compose -f docker-compose.yml "$RUN_COMMAND"
    fi

    echo "-----------------------------------------------"
    docker ps -f "name=my-jenkins"
    echo "-----------------------------------------------"
    docker images --filter=reference='my-jenkins'
}

execute_command() {    
    # env $(cat docker-compose.env) docker-compose -f docker-compose.yml -f docker-compose-build.yml up -d
    if [ "$RUN_COMMAND" == "build" ]; then
        create_dir
        create_env
    elif [ "$RUN_COMMAND" == "up" ]; then
        if [ ! -f ".env" ]; then
            echo "Please execute the build command before executing the up command"
            exit 1
        fi
    fi

    execute_docker_compose
}

#----------------------- start -------------------------------------
check_run_command
execute_command

4. 실행

  1. docker-compose-run.sh 파일에서 아래 항목은 본인 설치 환경에 따라 수정 필요
# jenkins_home volume 경로 수정 필요 
readonly JENKINS_HOME_DIR="/home/asd/doc/jenkins"
  1. shell을 실행하여 jenkins에 실행에 필요한 volume 및 .env 파일 생성
// 실행 권한이 없는 경우 
chmod u+x docker-compose-run.sh

./docker-compose-run.sh build
  1. jenkins 이미지 실행
docker-compose-run.sh up
  1. 터미널에서 아래 명령어 실행 후 초기 관리자 패스워드를 복사
    $ docker logs -f my-jenkins

    Jenkins initial setup is required. An admin user has been created and a password generated.
    Please use the following password to proceed to installation:

    175b613d63a947e291fac83228fc627e

    This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

    *************************************************************
  1. 웹브라우저에서 [jenkins설치 서버 IP]:18080으로 jenkins 접속 후 초기 관리자 패스워드 키를 입력하여 설치 진행한다.
  2. 설치 과정 중 플러그인은 jenkins 관리 페이지에서 설치가능하니 install suggested plugins으로 선택 진행
  3. 관리자 정보 설정 후 설치 완료

'기타' 카테고리의 다른 글

[Jenkins] pipeline jdk 설정  (1) 2022.02.01
[Jenkins] SSH 사용 - pipeline SSH Agent  (0) 2022.02.01
[Git] revert - 특정 시점으로 원복  (0) 2021.05.15
[Tool] vscode-python 환경 설정  (0) 2019.05.30
[Java] POI SXSSF  (0) 2019.05.30

+ Recent posts