2021년 1월 10일 일요일

Jenkins in docker , 젠킨스 도커 이미지 커스터마이징 하기

 1.jenkins 기본 이미지를 가져오는 Dockerfile 을 만든다 

FROM jenkins/jenkins:lts

MAINTAINER amola@amola.co.kr

USER root



RUN apt-get update && \

    apt-get -y install apt-transport-https \

      ca-certificates \

      curl \

      gnupg2 \

      software-properties-common && \

    curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \

    add-apt-repository \

      "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \

      $(lsb_release -cs) \

      stable" && \

   apt-get update && \

   apt-get -y install docker-ce

VOLUME /var/android_sdk


# install jenkins plugins

COPY mydummyplugins.txt /usr/share/jenkins/ref/mydummyplugins.txt

RUN /usr/local/bin/install-plugins.sh  < /usr/share/jenkins/ref/mydummyplugins.txt


#Update the username and password

ENV JENKINS_USER admin

ENV JENKINS_PASS ThisIs@StrongP@ssword


2.jenkins plugin 을 컨테이너 만들때 마다  일일히 선택하기 싫으니까  mydummyplugins.txt라는 파일을 만들어서 컨테이너 생성시에 젠킨스의 install-plugins.sh 스크립트로 플러그인을 미리 설치한다. 이렇게 하면 처음 젠킨스 설정시에 플러그인이 설치과저이 빠르게 지나간다.
젠킨스 초기설정시에  따로 플러그인을 선택하고자 한다면 위의 두줄을 # 로 주석처리함.

mydummyplugins.txt 에 설치할 플러그인의 이름을 다 입력해놓아야 하는데, 그많은 플러그인을 알수가 없기에, 일단 젠킨스 기본이미지로 만든 젠킨스 컨테이너를 설치후 젠킨스플러그인화면에서 이런저런 플러그인을 설치후, groovy 스크립트로 플러그인 목록을 가져와서 mydummyplugins.txt에 넣어주면 된다.

설치된 젠킨스 컨테이너로 들어가서 젠킨스사이트에서 Manage Jenkins->Tools and Actions->Script Console 로 들어가서 

Jenkins.instance.pluginManager.plugins.each{ 
  plugin -> println("${plugin.getShortName()}") 
}

실행하면 

Result

ace-editor
ant
antisamy-markup-formatter
apache-httpcomponents-client-4-api
bootstrap4-api
bouncycastle-api
branch-api
build-timeout
checks-api
cloudbees-folder
command-launcher
config-file-provider
credentials-binding
...

이렇게 나오는데, 이걸 복사해서 로컬의 mydummyplugins.txt 에  복사해서 넣는다.

mydummyplugins
-------------------
ace-editor
ant
antisamy-markup-formatter
apache-httpcomponents-client-4-api
bootstrap4-api
bouncycastle-api
...........
-------------

참고사이트 : 
https://web.plus-idea.net/2019/07/plugin-pre-installed-jenkins-docker/
https://www.digitalocean.com/community/tutorials/how-to-automate-jenkins-setup-with-docker-and-jenkins-configuration-as-code

감사요!


3. dockerfile 을 빌드해서 이미지를 만들자.

docker build -t jenkinstest/myjenkins:1.0 .

-t 는 tag 옵션으로 생성할 이미지 이름이다. 클론 뒤에는 버젼을 쓴다. 맨 마지막에는 DockerFile이 있는 위치이다.
혹시 잘 안되면 빌드 캐시 삭제
docker builder prune


3-1. docker-compose.yml 파일로 빌드와 실행을 동시에.

version: '3'


services:

  jenkins:

    build:

      context: .

      dockerfile: Dockerfile

    container_name: 'jenkins_docker_myjenkins'

    restart: always

    ports:

      - '8200:8080'

      - '50200:50000'

    expose:

      - '8080'

      - '50000'

    volumes:

      - /var/jenkins_home

      - /var/android_sdk


build: 옵션에 의해 composer 를 기동하면 현재 폴더(.)의 Dockerfile을 읽어와서 빌드를 하고 'jenkins_docker_taehokim' 이름으로 컨테이너를 기동한다. 또한 기동시에 포트와 볼륨을 지정한다.일단 볼륨은 로컬사용자에 따라 다르게 지정하도록 정의만 해놓았지만, 
- ~/myjenkins_homedir:/var/jenkins_home
- /Library/android_sdk:/var/android_sdk
식으로 컴포저파일에 지정해도 된다.

4.빌드가 성공적으로 끝났다면,  jenkins기본이미지를 바탕으로 Dockerfile에 지정된 내용대로 나만의 jenkins이미지가 만들어져있을것이다. 생성된 이미지는 고유의 ID를 가지고있다.
jenkinstest/taehoandroid  | 1.0 | ac9b0dfd1d35

5.자 이미지가 있으니 몇개라도 젠킨스 컨테이너를 만들수 있다. docker run 으로 실행하자.

docker run -d \ 

-p 8082:8080 \ 

-v ~/docker_share:/var/jenkins_home \ 

-v ~/Library/Android/sdk:/var/android_sdk \ 

--name tesetdel2 \ 

jenkinstest/myjenkins:1.0


5-1. 저 명령어들을 매번 치자니 귀찮다.  도커컴포저를 만들어서 설정값을 넣어두면 간단하게 실행할수 있다.

sudo docker-compose up -d 



6.젠킨스 컨테이너가 8082로 떠 있을테니, localhost:8082 로 접속한다.
(초기 암호는 여기에.. cat /var/jenkins_home/secrets/initialAdminPassword)

7.젠킨스 플러그인 설치가 이미지 빌드시에 다 끝났기 때문에 , 초기 설정시간이 짧아졌다.


0 comments:

댓글 쓰기