ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Jenkins] Docker 컨테이너 구축
    관리 배포/jenkins 2020. 11. 3. 16:29

     

    이번 시간에는 docker 컨테이너를 이용해서 Jenkins를 구축하는 방법에 대해서 알아보도록 하겠습니다.

     

    구성은 아래 그림과 같이 구성하도록 하겠습니다.

    master 노드가 있고 하위에 2개의 slave를 두도록 하겠습니다.

     

    master 노드 생성

    docker-compose.yml 파일을 아래와 같이 작성합니다.

    version: "3"
    services:
      master:
        container_name: master
        image: jenkins/jenkins:latest
        ports:
          - "80:8080"
        volumes:
          - ./volumns/jenkins:/var/jenkins_home
        environment:
          - TZ=Asia/Seoul
    • environment의 TZ의 경우 타임존 설정 시 사용 됩니다.
    • 해당 옵션이 없는 경우 디폴트 시간 설정이 UTC +0 이기 때문에 배치 잡을 구동 시킨 후 배치 작업 히스토리에 시간 정보를 남길 때 원하는 시간 정보를 얻지 못할 수도 있습니다.

     

     

    다음 명령어를 통해서 master jenkins를 동작 시킵니다.

    필요 설정 후 slave 서비스를 추가할 예정이므로 -d (백그라운드 실행) 옵션을 적용하지 않습니다.

    $ docker-compose up

     

     

    master jenkins 구동 후 위에 설정대로 80번포트로 jenkins 웹 사이트에 접근합니다.

    가장 먼저 초기 어드민 패스워드 입력하는 부분이 있는데 해당 부분은 jenkins 컨테이너 실행 로그에서 확인 가능합니다.

     

     

    jenkins에서 사용 할 플러그인을 설치하는 화면입니다.

    편의성을 위해서 추천하는 모든 플러그인을 설치합니다.

     

     

    플러그인 설치 시 실패가 뜨더라도 추후 다시 설치 가능하니 [Continue] 버튼을 클릭해서 넘어갑니다.

     

     

    jenkins에서 사용 할 어드민 유저를 생성합니다.

     

     

    jenkins 접속 URL을 설정합니다.

     

     

    jenkins 초기화가 완료되고 [Start using Jenkins] 버튼을 누르면 jenkins dashboard로 이동합니다.

     

     

    jenkins dashboard에서 [Jenkins 관리] 메뉴를 클릭하면 Dependency errors 항목을 확인 할 수 있습니다.

     

     

    [Jenkins 관리] 탭에서 [플러그인 관리]를 클릭하고 위에서 missing된 플러그인 목록을 설치합니다.

    위 그림에서 파란색 박스에 있는 것 처럼 Plugin is missing 뒤에 있는 이름으로 검색하면 됩니다.

     

    [설치 가능] 탭에서 설치하려는 플러그인을 검색 한뒤 해당 플러그인을 체크 후 [지금 다운로드하고 재시작 후 설치하기] 버튼을 클릭합니다.

     

    slave 노드 생성

    master 노드에서 slave 노드에 SSH로 접속 할 수 있도록 SSH 키를 생성합니다. (설정 없이 enter만 눌러서 생성)

    $ docker exec -it master ssh-keygen
    Created directory '/var/jenkins_home/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /var/jenkins_home/.ssh/id_rsa.
    Your public key has been saved in /var/jenkins_home/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:4X3F/isMl6fWkdkVdMT8NgZYhWLut3VIx8LS+/q2muk jenkins@2fbd2587df12
    The key's randomart image is:
    +---[RSA 2048]----+
    |            o.+*o|
    |           + + .+|
    |        . o .o+.o|
    |       . o ..o=o*|
    |        S o .o+**|
    |           + +oBo|
    |            = *.+|
    |             *o.+|
    |            oE+*o|
    +----[SHA256]-----+
    # 생성 된 public 키 값을 복사
    $ docker exec -it master cat /var/jenkins_home/.ssh/id_rsa.pub
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCdZUwGGtkXr984apajzoW4WRz1SA644diuGHBk+JH9HTf5iw9p4BvMfaGvI5AWv0bgKtzeFsbzok5j2NQeWKHjM/2wDdI4xx6W37PQTHgItKteneBpY33K2i93SPFX83o077Z+B/xJ85r1RwbFgRjWJ/36kP3viCYKY5jOMhK+R4skVFX5Z0HQMyyyWYX608Ay/D9lPd4bPoVZWdoQ/defMWQM7AzKGrsoKGmyzWz7Ye9lqhydUDU6bKv/AeQMVdIBAlSoFoNsqWJqDmXgRZQB8fzPKZRoPk9o+9sH7RUUuilhYHW7qTVYEy4y2nH1Cym5ZCJw9/7qSA3Zomn40K+3

     

    docker-compose.yml 파일에 slave 노드 2개를 추가합니다.

    slave 노드 추가 시 environment의 JENKINS_SLAVE_SSH_KEY 값에 위에서 생성한 master 노드의 public 키 값을 입력합니다.

    version: "3"
    services:
      master:
        container_name: master
        image: jenkins/jenkins:latest
        ports:
          - "80:8080"
        volumes:
          - ./volumns/jenkins:/var/jenkins_home
        environment:
          - TZ=Asia/Seoul
      slave01:
        container_name: slave01
        image: jenkins/ssh-slave
        environment:
          - TZ=Asia/Seoul
          - JENKINS_SLAVE_SSH_KEY=ssh-rsa AAAAB3NzaC1yc2
      slave02:
        container_name: slave02
        image: jenkins/ssh-slave
        environment:
          - TZ=Asia/Seoul
          - JENKINS_SLAVE_SSH_KEY=ssh-rsa AAAAB3NzaC1yc2

     

    docker 컨테이너를 재시작합니다.

    기존 컨테이너의 경우 Foreground로 실행 시켰기 때문에 Ctrl + C로 종료 시킵니다.

    다시 docker-compose를 통해서 컨테이너를 실행 시킬 때 위에서 추가된 2개의 slave 컨테이너들도 같이 동작하게 됩니다.

    # 백그라운드에서 동작 할 수 있도록 -d 옵션을 추가해서 사용합니다.
    $ docker-compose up -d

     

    master 노드에서 각각의 slave 노드에 SSH를 통해서 접근할 수 있도록 설정을 합니다.

    # slave 컨테이너에 bash로 접속
    $ docker exec -it slave02 /bin/bash
    
    # .ssh 디렉토리 생성 및 하위에 authorized_keys 파일 생성
    $ mkdir .ssh
    $ touch .ssh/authorized_keys
    
    # authorized_keys에 master의 public 키(id_rsa.pub) 입력
    $ echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQ' >> .ssh/authorized_keys
    
    # authorized_keys 파일까지의 경로까지 접근 권한 설정
    $ chown -R jenkins /home/jenkins/.ssh
    $ chmod 600 /home/jenkins/.ssh/authorized_keys
    $ chmod 700 /home/jenkins/.ssh
    
    # 노드 추가 시 필요한 java path 확인
    $ which java
    /usr/local/openjdk-8/bin/java
    

     

    노드 관리

    새로 생성 한 slave 노드들을 master 노드와 연결 시키는 작업을 진행합니다.

     

    [Jenkins 관리] 탭에서 [노드 관리] 메뉴를 선택합니다.

     

    [신규 노드]를 클릭합니다.

     

    노드명을 입력하고 [Permanent Agent] 버튼을 체크한 후 OK 버튼을 클릭합니다.

     

    노드 정보를 입력합니다.

    • Remote root directory : slave에서 작업이 진행되는 디렉토리 정보 입력 (임의의 path 입력)
    • Launch method : Launch agents via SSH (SSH를 통해서 작업 진행 호출)
    • Host Key Verification Strategy : Non verifying Verification Strategy 선택
    • Credentials 설정을 위해서 [Add] 버튼을 클릭합니다.

     

     

    jenkins slave 접속을 위한 Credentials를 추가 합니다.

    Private Key는 위 master 노드에서 생성 한 SSH 키 중에서 private key(id_rsa) 값을 입력합니다.

     

    slave 노드에서 Java가 설치 된 Path를 입력하고 [Save] 버튼을 눌러서 master 노드에 slave 노드를 연결 시킵니다.

     

    정상적으로 연결 완료 시 아래와 같이 출력됩니다.

     

     

    댓글

Designed by Tistory.