Jenkins 설치 & 삭제

Violet_Evgadn·2023년 4월 24일
0

CI&CD 자동화

목록 보기
3/28

Windows

1. https://www.jenkins.io/download/ 에서 Windows 설치

2. 다운로드한 msi 파일 실행 후 Next 클릭

  • Destination Folder : Jenkins Project들을 설치할 위치

  • Service Logon Credentials : 만약 Server에 Jenkins를 설치하여 활용할 경우 서버에 대한 접속 정보 입력

    • 현재 우리는 Local에서 Jenkins를 사용할 것이므로 Run Service as LocalSystem을 선택하자
  • Port : 사용할 Port 번호

    • Default로 8080으로 되어있겠지만, 알다시피 8080은 Web 개발에서 가장 기본적으로 사용하는 Default Port이기 때문에 8088 등의 사용하지 않는 Port 번호로 변경하는 것을 추천한다.
    • Test Port를 클릭해 해당 Port가 사용 중이지 않음을 확인하고 넘어가자
  • Select Java home directory : jdk나 jre가 설치된 경로를 입력해줘야 한다.

    • Jenkins는 Java를 기반으로 만들어진 Tool이기 때문에 당연히 jdk나 jre가 설치되어 있어야지만 활용 가능하다
    • 만약 jdk나 jre가 설치되어 있다면 자동으로 설치된 Path를 잡아주고, 설치가 안되어 있을 경우에는 설치한 뒤 jdk나 jre가 설치된 경로를 직접 입력해줘야 한다
  • Custom Setup : 방화벽이나 서비스, 사용할 드라이브 등에 대한 설정을 할 수 있다.

    • Firewall Exception에서 "Will be installed on local hard drive"를 선택해주자.

3. "localhost:8088" 접속

이때 8088은 우리가 위에서 지정했던 Port Number를 의미한다.

만약 2번 과정에서 Port를 50000으로 설정했다면 localhost:50000으로 접속하면 된다.

4. Password 입력

Jenkins를 처음 설치할 경우 localhost:8088에 접속한다면 아래와 같은 창이 뜰 것이다.

위 사진에서 빨간색 Box안에 "initialAdminPassword"라는 파일의 경로가 입력되어 있다.

해당 파일을 메모장으로 열어 입력되어 있는 문자열을 복사한 이후 password 입력 칸에 붙여 넣어주면 된다.

5. Plugin 설치

Jenkins에 사용할 Plugin들을 설치하는 단계이다.

오른쪽 "Select plugins to install"을 통해 원하는 Plugin을 선택하여 설치할 수도 있지만, 웬만하면 왼쪽 "Install suggested pluings"를 클릭해 Jenkins 측에서 추천하는 Plugin들을 모두 설치하는 것을 추천한다.

6. Admin 계정 입력

생각보다 중요한 단계이다.

Plugin 설치 및 initialPassword 입력은 Jenkins 설치 후 한 번만 입력하면 된다.

그렇다면 한 번 설치한 이후에는 어떻게 Jenkins에 설치하게 될까?

바로 이번 단계에서 설정하는 계정 명 및 암호를 통해 로그인함으로써 Jenkins 서비스를 이용할 수 있다.

즉, Jenkins를 사용하기 위한 회원가입 단계라고 생각하면 된다.

7. URL 입력

Jenkins 접속을 위한 URL을 입력하는 과정이다. 입력했던 URL을 통해 접속하면 자동으로 localhost:8088, 즉 Jenkins 서버로 연결시켜준다.

문제는 Jenkins 서버로 설정했던 URL이 이미 사용 중인 경우에는 사용 중이던 URL Site에 우선권이 있어서 만약 이름이 겹칠 경우 Jenkins 서버에 접속하지 못할 가능성이 생긴다.

따라서 서버에 Jenkins를 설치하고 같이 활용하는 것이 아닌 로컬에서만 Jenkins를 사용할 경우 그대로 localhost:8088로 설정하는 것을 추천한다.


Docker Desktop

1. https://docs.docker.com/desktop/install/windows-install/에서 Docker Desktop 설치 & 실행

1-1. 필요한 패키지 설치

Docker Desktop을 실행시키면 위 사진과 같은 에러 창이 뜰 수도 있다. 안 뜨는 경우 이번 단계는 넘어가면 된다.

이 에러는 WSL 2라는 패키지가 로컬 환경에 설치가 되어 있지 않은 상황일 경우 발생한다. 따라서 이 패키지를 설치해줘야 할 필요가 있다.

WSL 2라는 추가적인 패키지가 필요한 이유는 Docker가 Linux Kernel Base로 운영되고 있는 가상화 시스템이기 때문에 Windows에서는 바로 활용이 불가능하다. 따라서 WSL 2라는 리눅스 커널을 위한 패키지를 따로 설치하는 것이다.

설치 방법은 위 사진에서 파란색으로 명시되어 있는 https://aka.ms/wsl2kernel 사이트로 접속한 뒤 아래 사진에서 빨간색 버튼 안에 있는 링크를 클릭해 패키지를 다운로드하여 실행시키면 끝이다.

이후 컴퓨터를 재시작시킨 뒤 다시 Docker Desktop을 실행시키면 정상 동작이 가능하다.

2. Docker Desktop 실행 잘 되는지 확인

3. 명령 프롬프트(cmd)에 아래 3개 명령어 입력 후 확인

docker image ls(= docker images)
docker container ls(= docker ps)
docker network ls

Docker에서는 3가지 Network(bridge, host, none)가 지원이 되는데 이 중 bridge Network를 활용할 것이다

만약 3가지 명령어가 Output을 잘 출력한다면 Docker Desktop의 Setting은 완료된 것이다.

4. https://www.jenkins.io/download/ 에서 Docker 클릭

5. https://hub.docker.com/r/jenkins/jenkins 접속 후 회원가입

Docker Hub에서 회원 가입하는 것이 현재 필수적인 단계는 아니다.

하지만 프로젝트를 진행하면서 Docker Hub에 많은 Container Image를 저장하게 될 것이며 이 과정에서 Docker Hub에 대한 ID와 Password가 존재해야 하므로 이왕 Docker Hub에 접속했으니 회원가입까지 한 번에 처리하는 것을 추천한다.

위 사진은 Jenkins Docker Image를 나타낸 것이다.

Docker Container Image의 이름은 {Image를 배포한 사람이나 팀}/{배포한 Image 이름}으로 구성되어 있다.

예를 들어 내가 Lostark라는 Container Image를 Docker Hub에 배포할 경우 해당 Image는 violetto/Lostark라는 이름을 가지게 될 것이다.

6. cmd에서 순서대로 명령어 입력

아래 명령어들은 https://github.com/jenkinsci/docker 사이트에 자세히 나와 있다.

위 사이트는 Jenkins Container Image에 대한 정보를 저장한 깃허브 사이트로써 README.md에 Jenkins Image의 사용법에 대해서도 나와 있다.

메서드에 대해 조금 더 자세히 알고 싶다면 위 사이트의 README.md를 직접 번역하면서 설치해보는 것을 권장한다.

docker pull jenkins/jenkins

  • jenkins Image 설치 메서드
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins-server --restart=on-failure -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-jdk11

docker run jenkins/jenkins : (jenkins/jenkins라는) Docker Image를 기반으로 Container를 생성하는 명령어

  • Docker Image가 가진 Service를 실제로 제공하는 환경을 구축하는 명령어
  • -d : Back단에서 명령어를 실행시킴

-p : Publisher Option

  • Container 내부에 있는 Port를 Container 외부에서 어떻게 접속하는지 정해주는 Option
  • {Container 외부에서 접속할 Port}:{Container 내부에서 응답하는 Port}
    • (ex) 2000:5000일 경우 브라우저(유저)에서 localhost:2000을 입력하면 Container에서는 localhost:5000으로 접속하여 서비스를 제공할 것이다.
  • 8080과 50000이 있는 이유 : 8080은 Master Port로써 주요 서비스를 제공하기 위한 Port이고 50000은 Slave Port로써 혹시 8080 Port에 문제가 생겼을 경우 50000 Port를 통해 접속할 수 있게 하는 것이다. 최대한 안정성 있는 서비스를 제공하기 위하여 위와 같은 방식으로 Port를 2개 사용했다.

--restart=on-failure : Container 생성에 실패(fail)했을 경우 재시작시킴

--name : 만들고자 하는 Container에 이름을 부여

  • 만약 이 옵션이 없을 경우 Docker 측에서 Container 이름을 랜덤 하게 생성한다. 이 경우 Container가 어떤 Docker Image로부터 만들어졌고 어떤 역할을 수행하는지 직관적이지 않아 이름을 부여하는 것을 추천한다.

-v : Volume Option

  • 필수적이지는 않은 Option
  • Container 내부 절대 경로를 Container 실행 환경(Window, MacOS 등의 Container를 생성시키고 활용하는 컴퓨터)의 절대 경로와 연결시켜주는 Mount 관련 Option
  • {Container 실행 환경 절대 경로} : {Container 내부 절대 경로}
    • (ex) jenkins_home:/var/jenkins_home : Container에서 /var/jenkins_home에 생성되는 디렉터리, 데이터 등 모든 파일들을 Container 실행 환경의 jenkins_home 경로에 저장한다.
  • 사용 이유 : Container 내부에서 발생된 데이터는 Container 내부에만 저장된다. 따라서 Container가 삭제될 경우 그 안에 저장된 데이터나 로그 등도 같이 삭제된다. 이런 문제를 해결하기 위해 Mount를 사용한다. Mount를 통해 Container 실행 환경과 내부 경로를 연결시켜준다면 Container에서 발생한 데이터를 외부에도 같이 저장시키기 때문에 Container가 삭제되어도 Container 실행 환경에서는 여전히 생성된 데이터나 로그 등을 확인할 수 있게 되는 것이다.

docker ps

  • 모든 과정이 성공적으로 수행되었다면 위 명령어를 쳤을 때 jenkins-server라는 이름을 가진 Container 하나가 실행 중이어야 한다.
  • Ports : 8080->8080, 50000->50000으로 보았을 때 우리가 원하는 대로 Port 연결이 설정되었음을 알 수 있다.

7. http://localhost:8080/ 접속

위에서 했던 Window 설치 과정과 똑같은 창이 나온다. 단지 위에서 Port를 8080, 50000으로 설정했기 때문에 localhost:8080으로 접속한 것이다. 그런데 initialAdminPassword의 경로가 조금 이상하다.

Docker Desktop을 활용하면 Docker Desktop이 실행되는 Linux 상에 initialAdminPassword가 저장되야하므로 Docker Container에 접속하여 위 경로로 접근해야 한다.

8. Docker Desktop 접속

Containers에 들어가면 우리가 만든 Container가 실행되고 있음을 볼 수 있다.

해당 Container를 클릭하면 된다. 우리는 여기서 3가지 방법으로 Password를 찾을 수 있다.

방법 1: Logs 확인

노란색 부분이 Password이다.

방법 2: Path 직접 접근

우측 상단의 CLI를 클릭하면 Docker Container를 CLI를 통해 제어할 수 있다. 여기에서 "/var/jenkins_home/secrets" 디렉터리로 들어가 initialAdminPassword 파일 내용을 직접 확인함으로써 Password를 볼 할 수 있다.

Linux를 배웠다면 아마 쉽게 접근 가능하겠지만 혹시 모르니 필요한 Command를 순서대로 입력해놓겠다.

cd /var/jenkins_home/secrets
cat initialAdminPassword

방법 3: Docker Container를 터널링으로 접속

터널링이란 한 네트워크를 다른 네트워크의 접속을 거쳐 데이터를 송신할 수 있게 하는 기술을 의미한다.

이는 CS 지식을 공부할 때 자세히 다루기로 하고, 일단 지금은 Docker Desktop의 CLI 창을 Windows의 CMD 창에서 볼 수 있게 하는 과정이라고 생각하면 된다.

(Docker Desktop의 네트워크에 Windows Network의 접속을 거쳐 데이터를 처리할 수 있게 만듦)

방법은 아래 명령어들을 cmd 창에 순서대로 입력하면 된다

docker container exec -it jenkins-server bash

  • Jenkins 컨테이너 Console 창에 터널링을 통해 접속
    cd /var/jenkins_home/secrets
    cat initialAdminPassword

위 사진에서 볼 수 있는 것처럼 터널링을 통해 Container에 접속하면 jenkins@~로 주소가 바뀌는 것을 볼 수 있다.

사실 ~ 부분을 삭제하지 않아도 괜찮을 것 같긴 하지만 혹시 모르니 지워놨다.

9. Password 입력 후 Install suggested Plugins & URL 입력

Windows 설치 방법과 동일하다


Docker Desktop에 대한 여러 설정들

Docker Desktop에서 실행시킨 Jenkins Container 접속 Port 변경

위에서 우린 docker run -p 8080:8080 jenkins/jenkins:lts-jdk11 명령어를 통해 외부에서 8080 Port Number를 통해 Container에 접근할 수 있도록 만들었다.

하지만 알다시피 8080 Port Number는 웹 개발에서 가장 많이 활용되는 사실상 Default Port Number이다.

따라서 우리는 Jenkins에 8088 같은 다른 Port Number를 줘서 조금 더 편하게 Web Application을 실행시키고 싶었고, Windows에서 Jenkins를 설치할 때는 이를 GUI 과정에서 지원해주었다.

그렇다면 Docker Desktop을 활용할 때는 외부에서 접근하는 Port Number를 어떻게 수정해줄 수 있을까?

필자는 1차원적으로 docker run -p 8088:8088 jenkins/~로 명령어를 입력하였다. 그리고 실패하였다. 왜일까?

-p Option의 인자에 대해 다시 한번 생각해보자. -p Option은 {Container 외부에서 접근하는 Port}:{Container 내부 Port} 쌍으로 되어 있다.

우리는 localhost:8088, 즉 8088 Port Number로 Container 내부 서비스에 접근하고 싶기 때문에 8088:X까지는 맞다.

문제는 Jenkins Container에서는 서비스를 8080 Port Number를 통해 전달해준다는 것이다.

-p 8080:8080 Option에서 볼 수 있듯이 Jenkins는 Container 내부에서 8080 Port Number를 통해 서비스를 제공한다. 즉, 우리가 Docker Container에 직접 접속하여 내부 Port Number를 변경해주지 않을 경우 여전히 Container는 8080 Port Number를 통해 외부 User에게 서비스를 제공한다.

결국 우리는 "외부 8088 Port Number"를 통해 "내부 Container의 8080 Port Number"에서 제공하는 서비스를 활용하고 싶은 것이고 아래와 같이 적어야 할 것이다.

docker run -p 8088:8080 jenkins/jenkins:lts-jdk11

The container name ~ is already in use 에러 처리

Docker Container를 실행시키다 보면 가끔 The container name ~ is already in use라는 에러가 발생할 때가 있다.

그런데 위 사진처럼 "docker ps" 명령어를 통해 Container를 찾아보면 해당 이름을 가진 Container가 존재하지 않는다.

에러를 처리하기 이전 왜 이런 상황이 발생하는지부터 알아보자.

이유는 생각보다 심플한데, 바로 docker ps라는 명령어가 현재 실행 중인 Container들만 결과창에 띄워주기 때문이다.

즉, 에러로 인해 Container 실행이 중지되었든 User가 직접 Container 실행을 중지시켰든 현재 동작하지는 않지만 메모리 상에는 남아 있는 Container와 실행시키고 싶은 Container 이름이 겹쳤을 경우 이런 문제가 발생하는 것이다

이런 문제를 해결하기 위해선 아래에 기입한 3개 명령어를 순서대로 입력하면 된다.

docker ps -a

  • 실행 중인 Container 뿐만 아닌 메모리 상에 존재하는 모든 Container를 출력

docker stop <Container 이름>

  • 이런 문제의 대부분 에러를 발생시킨 Container가 실행이 중지되어 있는 상태이므로 사실 이 과정이 필수적이지는 않으나, 혹시 다른 상황이 발생했을 수도 있으니 안전하게 중지 명령어를 한 번 더 입력해주자
    docker rm <Container 이름>
  • 에러를 발생시킨 Container를 메모리 상에 삭제시킴

이후 다시 Container 실행 명령어를 입력하면 정상 수행되는 것을 확인할 수 있다.


Windows Jenkins 삭제

제어판을 통해 Jenkins를 삭제한 이후 다시 설치하면 위에서 설명했던 Plugin 설치, Admin 계정 설정에 대한 과정 없이 바로 Admin 계정 로그인 창이 뜸을 알 수 있다.

하지만 처음에 설치했던 Plugin을 변경하거나 Admin 계정을 아예 바꾸고 싶은 경우 Jenkins를 깨끗하게 삭제한 이후 위에서 설명했던 방법 그대로 재설치를 수행하고 싶을 수 있다.

Jenkins를 깨끗하게 삭제하는 방법은 아래와 같다.

  1. "C:\ProgramData" 디렉터리 접속(숨김 폴더임을 주의하자)
  2. Jenkins 디렉터리 삭제
  3. "C:\Program Files" 디렉터리 접속
  4. Jenkins 디렉터리가 존재할 경우 삭제

이렇게 삭제하면 Jenkins와 같이 설치된 Plugin 및 Admin 계정에 대한 설정도 같이 삭제되어 깨끗하게 Jenkins를 삭제할 수 있다. 이후 Jenkins를 다시 설치할 때는 위에서 설명한 모든 과정을 거치게 된다.


듣고 있는 "Jenkins를 이용한 CI/CD Pipeline 구축" 인프런 강의는 Docker Desktop에 Jenkins를 설치하였으나 필자는 Windows를 활용해보려 한다.

개인적으로 Docker Desktop 환경보다 Windows 환경에서 개발을 진행하고 CI/CD를 적용시키는 경우가 많지 않을까라고 생각했기 때문인데, 만약 강의를 듣다 Docker Desktop의 유용성에 대해 느낄 경우 Docker Desktop에서 활용하는 방식으로 넘어갈 수도 있을 것 같다.

profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!

0개의 댓글