Docker로 jenkins 설치하기

회사 쿠버네티스에는 다른 CI/CD가 있어서 개인적으로 CI/CD를 구성해보려고 한다. CI/CD 도구는 래퍼런스도 많고 널리 쓰이는 jenkins를 선택했다. 다들 약어로 ‘씨아이씨디’라고 말하지만 초보개발자를 위해 간단하게 CI/CD에 대해서도 알아보자

CI/CD

  • CI (Continuous Integration) : 지속적 통합이라고 하며, 새로운 코드변경이 있으면 빌드 및 테스트 과정이 자동으로 진행하고 공유된 저장소에 통합하는 것을 의미한다.
    쉽게 얘기하면 빌드/테스트 자동화
  • CD (Continuous Deployment / Continuous Deployment): 지속적인 서비스 제공/지속적인 배포이라고 하며, 이전의 CI 과정을 포함하여 제품을 배포 까지 이어지는 것이다. 제품에 이슈가 있거나 프로그램 버그가 있을때, 빠르게 복구하고 재반영하는 과정을 신속하고 정확하게 할 수 있도록 한다.

간단하게 CI커밋->빌드->테스트 , CD커밋->빌드->테스트->배포 라고 볼 수 있다. 나는 길게 얘기하는걸 잘못해서 이정도만 하겠다. 사실, 더 길게 써봤자 실제로 커밋->빌드->테스트->배포 과정을 수동으로 겪어보지 않으면 필요성을 못느낄지도 모른다.

설치

docker로 jenkins를 구동할 예정이기 때문에 docker가 기본적으로 구성된 linux 환경에서 진행한다.

나는 컨테이너의 볼륨을 설정할 위치에 docker-compose 구성을 할 생각이다.

docker-compose.yml

볼륨위치는 /home/jenkins/ 로 정했다. 해당 위치에 docker-compose.yml 을 생성하자

#file: 'docker-compose.yml'
version: '3.7'

services:
  jenkins:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: jenkins
    restart: always
    user: root
    ports:
      - 8080:8080
      - 50000:50000
    expose:
      - 8080
      - 50000
    volumes:
      - /home/jenkins:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      TZ: "Asia/Seoul"

services.jenkins 설정만 보자

  • container_name: 실행할 컨테이너명
  • dockerfile: 컨테이너를 실행할때 Dockerfile 을 실행시킨다.
  • user: 컨테이너를 실행할 계정
  • ports: 컨테이너 외부(호스트)에서 접근할 수 있는 포트 포워딩 설정 {호스트 포트}:{컨테이너 내부 포트}
  • expose: 외부에 공개할 포트를 지정한다. 위의 ports 옵션을 사용한다면 굳이 하지 않아도 된다.
  • volumes: 컨테이너 외부(호스트)와 컨테이너 내부의 데이터를 바인딩. {호스트 위치}/{컨테이너 내부 위치}

젠킨스는 컨테이너 내부에 /var/jenkins_home에 설치되므로 아까 컨테이너 외부에 생성한 /home/jenkins 디렉토리와 바인딩했다. 추가로, /var/run/docker.sock 를 바인딩한 이유를 말해보고자 한다.

그냥 jenkins만 설치하면 컨테이너 내부에선 docker가 없기 때문에 jenkins로 docker 명령어를 실행할 수 없다. 그래서 호스트의 docker를 볼륨 마운트로 연결한 것이다. 이를 Docker out of docker(DooD) 라고 하더라.. Docker in docker 방식도 있지만 DooD 방식을 권장하기 때문에 이대로 진행했다.

docker_install.sh

Dockerfile을 생성하기 앞서, 쉘파일을 하나 만든다. 쉘파일을 만드는 이유는 앞으로 컨테이너 내부에 설치가 필요한 패키지 들이 있을지도 모르는데 매번 Dockerfile에 복잡하게 명령어를 작성하지 않기 위해서다.

docker_install.sh 파일명을 보면 알겠지만 docker를 설치하기 위한 쉘이다. 아까 docker 볼륨을 마운트했지만 이는 docker 데몬만 연결한 것 뿐이고, 컨테이너 내부에 docker-cli 도 있어야 컨테이너의 Agent가 docker를 실행할 수 있다.

#file: 'docker_install.sh'
#!/bin/sh

apt-get update && \
apt-get -y install apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     zip \
     unzip \
     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

Dockerfile

이제 Dockerfile를 생성해보자. 마찬가지로 docker-compose.yml과 같은 위치로 /home/jenkins/에 생성한다.

#file: 'Dockerfile'
FROM jenkins/jenkins:lts

#root 계정으로 로그인
USER root

#Docker in Docker 를 위해 내부에 docker 설치
COPY docker_install.sh /docker_install.sh

RUN chmod +x /docker_install.sh

RUN /docker_install.sh


#docker 와jenkins 명어러를 수행하기 위한 계정 등록
RUN usermod -aG docker jenkins $USER
USER jenkins

마지막 줄에서 jenkins와 docker를 실행할 user를 등록해주지 않으면 권한 문제로 실행이 안된다.

실행

이제 설치는 끝났으니 컨테이너를 실행해보자

docker-compose up -d


자, 완료 되었다고 한다. 아까 포트포워딩한 8080 을 브라우저로 열어보겠다.

jenkins를 설치하면 Unlock을 해달라고 한다.
unlock 비밀번호는 jenkins 설치할때 로그에서 알려주는데 스샷을 찍어놓은게 없다.. 뭐 위치는 다 똑같다. /var/jenkins_home/secrets/initialAdminPassword 파일을 열어보면 비밀번호가 적혀있다. 아까 호스트에 바운드한 /home/jenkins 위치에도 똑같이 jenkins 파일들이 설치되므로 /home/jenkins/secrets/initialAdminPassword 파일이 있다.

아까 페이지에서 비밀번호를 입력하면 jenkins 가 정상적으로 접속되고, admin 계정을 생성해서 사용하도록 하자.

Git Credential 설정

CI/CD는 기본적으로 git 저장소를 기반으로 많이 쓰므로 기본설정으로 git 인증 설정을 해놓으면 편하다.


위와 같이 이동한 후에 adding some credentials 을 한다.


kind 항목에는 Username with password 를 선택하고 Scope 에는 Global 로 한다. Username 에는 Git 계정을 넣어주고 Passwordgit accessToken 을 넣어준다. accessToken발급은 사용하는 git에서 찾아보시길!

이제 git 인증서는 등록 되었고, jenkins item을 생성하면 Git 저장소 연동 항목에서 credentials를 적용하면 잘 된다.

credentials이 적용되지 않으면 아래와 같이 오류가 발생한다.

마무리

jenkins 설치와 git 인증서 등록까지 해보았다. 오늘도 한가지는 배워간다.


© 2021. All rights reserved.

Powered by Hydejack v9.1.6