EtoC

[NaverCloud]젠킨스 도커에 설치 본문

카테고리 없음

[NaverCloud]젠킨스 도커에 설치

게리드 2024. 7. 18. 14:30

IF ) 이전에 생성된 파일이 있다면 삭제하는 방법

CI/CD를 여러번 해보면서 파일들이 많이 생성되었는데 이 파일들때문에 에러가 나는것같았습니다.

파일들을 지워보고 생성했던 코드를 적어보았습니다. 

더보기
# 경로에서 지울경우 
rm -r 폴더명

# docker_projects/폴더명/project안에 있는 파일 강제 삭제
sudo rm -rf /docker_projects/폴더명/project

# docker_projects/폴더명/project 디렉토리 생성
sudo mkdir -p /docker_projects/폴더명/project

# docker_projects/폴더명/project로 이동
cd /docker_projects/폴더명/project​

1. 젠킨스를 도커에 설치 (CI/CD)

Jenkins의 기본 포트는 8080입니다.

한대의 pc에서 8080포트를 돌아가며 쓸 경우 젠킨스가 사용하기 어렵기때문에 8081포트를 8080 포트에 매핑하였습니다.  
아래의 명령어는 Docker를 사용하여 Jenkins의 LTS(Long Term Support) 버전을 실행하는 컨테이너를 시작합니다.

docker run \
--name jenkins_1 \
-p 8081:8080 \
-e TZ=Asia/Seoul \
-v /docker_projects/jenkins_1/var/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /docker_projects/jenkins_1/data:/data \
-u root \
-d \
--restart unless-stopped \
jenkins/jenkins:lts

위의 명령어를 입력하면 Unable to find image 'jenkins/jen

kins:lts' locally 뜨는데 잠시 기다리면 설치가 시작됩니다.

코드 설명

더보기
# 새로운 Docker 컨테이너를 시작하는 명령어
docker run

# 생성되는 컨테이너 이름을 jenkins_1 으로 지정
--name jenkins_1 \ 

# 호스트의 8081포트를 컨테이너의 8080포트에 매핑(jenkins의 기본 포트번호는 8080)
-p 8081:8080 \ 

# 컨테이너의 시간대를 Asia/Seoul로 설정
-e TZ=Asia/Seoul

# 호스트의 /docker_projects/jenkins_1/var/jenkins_home 디렉토리를 컨테이너의 /var/jenkins_home 디렉토리에 마운트
# Jenkins의 데이터는 이 디렉토리에 저장됩니다.
-v /docker_projects/jenkins_1/var/jenkins_home:/var/jenkins_home

# 호스트의 Docker 소켓을 컨테이너에 마운트하여 컨테이너 내에서 Docker 명령을 실행가능
-v /var/run/docker.sock:/var/run/docker.sock \

# 컨테이너 내의 명령을 루트 사용자로 실행
-u root

# 컨테이너를 백그라운드에서 실행
-d

  # 컨테이너가 중지되지 않는 한 항상 재시작하도록 설정. 시스템 재부팅시에도 자동으로 시작됩니다.
  # 하지만 수동으로 중지하면 재시작되지 않습니다.
  --restart unless-stopped \
  
  # 사용할 도커 이미지를 지정
  jenkins/jenkins:lts

2. 젠킨스 초기 비밀번호 확인

아래의 코드를 입력하면 jenkins에 접속할때 입력해야할 비밀번호가 나오는데 잘 기억해 둡시다.

docker exec jenkins_1 cat /var/jenkins_home/secrets/initialAdminPassword

 

cat: /var/jenkins_home/secrets/initialAdminPassword: No such file or directory 가 뜬다면..

더보기

지우고 다시 설치해보자.

docker stop jenkins_1

docker rm jenkins_1

sudo rm -rf /docker_projects/jenkins_1/var/jenkins_home

docker run \
  --name jenkins_1 \
  -p 8081:8080 \
  -e TZ=Asia/Seoul \
  -v /docker_projects/jenkins_1/var/jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /docker_projects/jenkins_1/data:/data \
  -u root \
  -d \
  --restart unless-stopped \
  jenkins/jenkins:lts
  
  # 초기비밀번호 확인
  docker exec jenkins_1 cat /var/jenkins_home/secrets/initialAdminPassword

 

 

이제 젠킨스는 호스트의 8081 포트에도 접근 할 수 있습니다.

브라우저를 켜고 생성했던 서버의 공인 IP 주소 : 8081로 접속하면 아래와같은 창이 나타납니다.

관리자 비밀번호에 출력된 jenkins 초기 비밀번호를 입력합니다.

 

관리자계정을 생성하고  Jenkins URL 은 설정된 그대로 둡니다.

 

 

여기까지 왔다면 다시 docker를 실행하던 터미널창으로 이동합니다.


3. 도커에 설치된 젠킨스 실행

docker exec -it jenkins_1 bash

실행중인 jenkins_1 컨테이너에 접속해 bash쉘 시작 -> 컨테이너 내부에서 직접 명령어 실행 가능


4. mlocate 설치

apt update

apt install mlocate

 

Do you want to continue? [Y/n]  y 시 Abort. 가 뜬다면 다시 update하고 apt install mlocate를 입력하세요

아래 이미지처럼 실행이 되어야합니다.


5. Docker에 Debian 계열의 리눅스 시스템 설치

apt-get update -y

apt-get install -y ca-certificates curl gnupg lsb-release

mkdir -p /etc/apt/keyrings

rm /etc/apt/keyrings/docker.gpg   # 설치되어있나 확인용. No such directory가 나오는게 맞습니다.

curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \

$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

apt-get update

apt-get install -y docker-ce docker-ce-cli docker-compose-plugin

exit

코드 설명

# 시스템의 패키지 목록을 최신상태로 업데이트
apt-get update -y   

# 필요한 패키지(ca-certificates, curl, gnupg, lsb-release) 설치 
apt-get install -y ca-certificates curl gnupg lsb-release

# Docker의 GPG 키를 저장할 디렉토리를 생성
mkdir -p /etc/apt/keyrings

# 기존에 Docker GPG 키 파일이 있을경우 삭제
# rm /etc/apt/keyrings/docker.gpg 

# Docker의 GPG 키를 다운로드 받아서 /etc/apt/keyrings/docker.gpg 파일에 저장
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg


echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

# Docker의 APT 저장소를 설정 파일에 추가
# echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
# 현재 시스템의 아키텍처 정보를 가져온다.
# $(dpkg --print-architecture)

# $(lsb_release -cs): 현재 Debian 배포판의 코드명을 가져온다.

# Docker 저장소를 추가한 후 다시 패키지 목록을 업데이트
apt-get update

# Docker CE 및 관련 패키지들을 설치
apt-get install -y docker-ce docker-ce-cli docker-compose-plugin

6. 프로젝트 디렉토리 생성 || 초기화 및 이동  

1) 디렉토리 생성

# docker_projects/"프로젝트명" : /project 디렉토리 생성
sudo mkdir -p /docker_projects/프로젝트명/project

# bash: sudo: command not found
mkdir -p /docker_projects/프로젝트명/project

1-1) 이미 있을경우 project안의 파일 강제 삭제

# docker_projects/"프로젝트명" : /project 안의 파일삭제
sudo rm -rf /docker_projects/프로젝트명/project

 

2) 생성한 디렉토리 project로 이동

# docker_projects/"프로젝트명" : /project로 이동 
cd /docker_projects/프로젝트명/project

 

여기까지했다면 배포할 프로젝트를 생성하거나 열어줍니다.


7.  특정 사용자에게 소유권 부여

1). 프로젝트 디렉토리에 Dockerfile 생성하고 docker plugin을 설치

# 사용할 도커 이미지 설정
FROM openjdk:17-slim

# 필수 도구를 apt-get을 통해 설치
USER root
RUN apt-get update && apt-get install -y default-mysql-client
# 추후 mysql 설정을 하면서 위에 추가함

# JAR 파일 위치에 대한 인수를 설정 
ARG JAR_FILE=build/libs/IDE프로젝트명-0.0.1-SNAPSHOT.jar

# 변수에 지정된 경로에 있는 JAR 파일을 Docker 이미지의 루트 디렉토리에 app.jar라는 이름으로 복사
COPY ${JAR_FILE} app.jar

# 컨테이너가 시작될 때 복사된 jar 파일을 실행할 명령어를 정의 
ENTRYPOINT ["java", "-jar", "/app.jar"]

 

⛔️ 주의 : github에 push 하기전에 .gitignore에 build폴더가 없어야합니다. 

gitignore까지 확인했다면 github 페이지로 이동합니다.

2) 깃 레포지토리 생성 및 연결

2- 1) 새로운 git repository 생성 후  클론 또는 원격저장소와 연결

2 -2) 프로젝트와 연결괸 git repository가 있다면 원격저장소와 연결

 

git remote add origin '복제한 깃 레포지토리 주소'

# 원격저장소와 잘 연결되었는지 확인
git remote -v

원격저장소와 연결이 되지않는다면 git에서 추적이 되지않는것일 수도 있습니다.

# 경로에 .git 폴더가 있는지 확인
ls -al

# 경로에 .git이 없는 경우
git init

 

2 -3 ) 프로젝트 레포지토리에 push 하기

git add .
git commit -m '커밋명'
git push origin '브랜치명'

push 가 성공하였다면 git 레포지토리에서 반영이 되었는지 확인합니다.

성공적으로 반영이 되었다면 다시 docker가 실행중인 터미널로 돌아옵니다.

2 - 4) docker 실행중인 터미널에서 git 주소 복제

git clone '복사한 레포지토리 주소'

 

복제가 완료되었으면 ls 명령어를 입력하여 git repository 명의 프로젝트 폴더가 생성되었는지 확인합니다.

생성된 폴더를 확인하였다면 폴더 경로로 이동합니다.

cd 'gitrepository이름'

3 .  권한 설정하기

ls 명령어를 입력하여 경로안에 build와 gradlew 이 있는지 확인합니다.

있는것이 확인되면 소유권 변경 명령어를 입력하여 소유권을 744로 변경합니다.

 

1) gradlew 권한 설정

chmod 744 ./gradlew

 

2 - 1) java 권한 설정

아래의 명령어를 입력하면 java가 설치되어 있지 않다고 뜰 것입니다.

java -version

2 - 2) java 설치하기

sudo apt update

sudo apt install openjdk-17-jdk

 

3) gradle project clean build

./gradlew clean build

 

4) docker build 하기

# git repository 경로로 이동 및 경로 확인하기
# 경로가 맞다면 build/libs로 들어가기
cd build/libs

# ls -l 또는 ll 을 입력하여 SNAPSHOT.jar이 있는지 확인
ll

# 확인후 다시 git repository 경로로 이동
/docker_projects/폴더명/project/깃레포지토리명

# github에 변경사항이있다면 
git pull

# docker build (주의!! 띄어쓰기와 .)
docker build -t IDE의 프로젝트명 .

 

4.  Jenkins Pipeline  설정

브라우저를 열고 공인IP:8081 또는 http://공인IP:8081/view/all/newJob 로 이동합니다.

1) jenkins 로그인

 

2-1) 파이프라인 생성

공인IP:8080 으로 접속한경우 새로운 Item을 클릭해줍니다.

아래의 오른쪽과 같은 화면이 나오면 파이프라인의 이름을 지정하고 pipeline을 클릭합니다.

2-2) 파이프 라인 설정

1. github project를 클릭하고 project url에 깃허브 레포지토리 주소를 입력합니다. 

2. github hook trigger for GITScm polling을 체크합니다.

3) Pipeline 스크립트 작성

 

파이프라인 스크립트 확인하기

더보기
pipeline {
    agent any

    tools {
        jdk 'openjdk-17-jdk'
    }

    stages {
        stage('Prepare') {
            steps {
                git branch: 'main', # 브랜치가 main인지 master인지 확인
                    credentialsId: 'jenkins credentials 이름', # credential 생성 후 변경하기
                    url: 'https://github.com/...' # git repo url로 변경하기
            }

            post {
                success { 
                    sh 'echo "Successfully Cloned Repository"'
                }
                failure {
                    sh 'echo "Fail Cloned Repository"'
                }
            }    
        }

        stage('Build Gradle Test') {

            steps {
                sh (script:'''
                    echo "Build Gradle Test Start"
                ''')

                dir('.') {
                    sh """
                    chmod +x gradlew
                    """
                }

                dir('.') {
                    sh """
                    ./gradlew clean build
                    """
                }
            }

            post {
                success { 
                    sh 'echo "Successfully Build Gradle Test"'
                }
                 failure {
                    sh 'echo "Fail Build Gradle Test"'
                }
            }    
        }

        stage('Docker Rm') {
            steps {
                sh 'echo "Docker Run Start"'
                sh """
                docker stop timecapsule
                docker rm -f timecapsule
                docker rmi -f timecapsule
                """
            }

            post {
                success { 
                    sh 'echo "Docker Rm Success"'
                }
                failure {
                    sh 'echo "Docker Rm Fail"'
                }
            }
        }

        stage('Bulid Docker Image') {
            steps {
                sh 'echo " Image Bulid Start"'
                sh """
                docker build -t timecapsule .
                """
            }

            post {
                success {
                    sh 'echo "Bulid Docker Image Success"'
                }

                failure {
                    sh 'echo "Bulid Docker Image Fail"'
                }
            }
        }

        stage('Docker Run') {
            steps {
                sh 'echo "Docker Run Start"'
                sh """
                docker run \
                  --name=timecapsule \
                  -p 80:8080 \
                  -v /docker_projects/폴더명/volumes/gen:/gen \ 
                  --restart unless-stopped \
                  -e TZ=Asia/Seoul \
                  -d \
                  timecapsule
                """
            }

            post {
                success {
                    sh 'echo "Docker Run Success"'
                }

                failure {
                    sh 'echo "Docker Run Fail"'
                }
            }
        }
    }
}

 

 

github hook과 jenkins를 연결하기위해 github Token을생성합니다.

4) github Token 생성하기

1. 오른쪽 내 계정 프로필 클릭시 나오는 setting 클릭

2. 프로필 페이지 왼쪽 최하단 카테고리의 Developer Settings 클릭

3. Personal access token의  token(classic) 클릭

4. Generate token에서 generate new token(classic) 클릭

4-2) 생성할 토큰의 권한을 아래와 같이 설정합니다.

5. 생성된토큰의 값을 메모장 같은곳에 적어둡니다.

 

4) github hook 생성하기

다시 jenkins 페이지로 돌아와서 마저 설정합니다.

5) Jenkins JDK 설정

 

 

6) docker 터미널에 timecapsule 설치

1.  타임캡슐 설치 명령어 입력

# 조심!! timecapsule 띄어쓰고 . 
docker build -t timecapsule .

 

2. 타임캡슐이 잘 설치되었는지 확인

docker images

 

3. docker run 하기

docker에서 run을 해줘야지 jenkins에서 사용 가능합니다.

docker run \
  --name=timecapsule \
  -p 8080:8080 \
  -v /docker_projects/프로젝트명/volumes/gen:/gen \
  --restart unless-stopped \
  -e TZ=Asia/Seoul \
  -d \
  timecapsule

 

만약 위의 명령어에서 프로젝트 명을 잘못 입력했다면..

더보기
docker ps

docker stop timecapsule

docker rm timecapsule

타임캡슐을 종료하고  지운뒤 다시 올바른 경로로 바꾼뒤 컨테이너를 실행하면 됩니다.

 

 

Connection refuese가 뜬다면..(잠시보류)

더보기

 어제밤에 학원에서 겪은에러이다.

동기들이 해결하기 어렵다고 놀려서 그냥 집에 왔는데, 확인해보니 다행히 쉬운 문제였다.

port번호 8080이 연결 거부라고해서 jenkins이 사용중이어서 인가했는데 docker ps를 입력해보니 원인을 알 수 있었다.

docker ps

port번호가 비어있었다. timecapsule을 지우고 재설치하니 port 번호가 매핑되었다. 이제되겠지?

응 안돼~ 쉬운문제 아니였다..

혹시나싶어 8081로는 되는데 8080은 안된다고..음..흠...😟

docker ps를 다시 입력해보니 timecapsule의 port가 나타나자마자 사라진것을 확인

몇번 더 지웠다 깔아보니 port가 자꾸 사라졌다.

log를 보니 에러가 나서 계속 무한 반복 시도를 하는게 아무래도 clean build할때 에러가 났던것이 마음에 걸렸다.

인텔리제이에서 문제의 코드를 해결하고 pull 한뒤 다시 클린빌드를 함

다시 curl http://localhost:8080을 하니 제대로 떴다!

위의 이미지처럼뜨면 8080 포트로 포워딩이 성공한것이다.

 


7) Github Webhook 과  Jnkins 연동하기


빌드하기

 

ACG에서 80포트번호 설정