본문 바로가기
카테고리 없음

[Jenkins] 젠킨스

by Ahngyuho 2025. 6. 22.

여러대의 컴퓨터를 사용 -> 분산 환경?

젠킨스란?

커밋 범위를 줄이자.

여러 사람들이 같이 개발하는 환경에서는 자주 커밋하는게 좋다. -> 각 개발자들이 커밋을 할 때마다 빌드하는 등의 과정들이 중복 -> CI 자동으로 지속적으로 커밋된 것이 통합되도록 하는 것

 

 

 

우리 개발 환경이 젠킨스에 설치되어 있어야 한다?

모든 개발 팀의 개발 환경이 젠킨스에 설치되어 있어야 한다.

 

01. 젠킨스
  0) 젠킨스란? 
젠킨스는 소프트웨어 개발 시 지속적으로 통합 서비스를 제공하는 툴
CI(Continuous Integration) 툴 이라고 표현
다수의 개발자들이 하나의 프로그램을 개발할 때 버전 충돌을 방지하기 위해 
각자 작업한 내용을 공유영역에 있는 저장소에 빈번히 업로드함으로써 지속적 통합이 가능하도록 해준다.



  1) 젠킨스 설치
    (1) 레포지토리 추가
curl -fsSL https://pkg.jenkins.io/debian/jenkins.io-2023.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null

apt update

    (2) 자바 설치
apt install openjdk-17-jdk

    (3) 젠킨스 설치
apt install jenkins

    (4) 젠킨스 실행
systemctl restart jenkins


    (5) 대시보드 접속
cat /var/lib/jenkins/secrets/initialAdminPassword 으로 초기 패스워드 확인 및 대시보드에 접속해서 입력
 
Install Suggested plugins

 

 

 

 

설치 완료 및 계정 설정 완료

 

 

git hub push -> jenkins -> 알림

 

포트포워딩

 


  2) github 연동
    [1] github 웹훅 설정
github에 레포지토리 생성하고 setiings에서 webhook -> add webhook
Payload URL : http://183.109.119.189:100/github-webhook/
SSL Disable
Add webhook

 

 

포트포워딩

 

외부에서 포트 지정해서 공유기에 접속하면 특정 컴퓨터의 프로세스가 

 

 

payload url 

http://183.109.119.189:30083/github-webhook

183.109.119.189 공인 ip 주소

 

 

 

 

 

git hub push -> jenkins -> 특정 작업 수행( 파이프라인)

 

파이프라인 생성

item 생성

 


    [2] 파이프라인 생성
새로운 Item -> 이름 입력 -> Freestyle -> OK -> GitHub project 체크 -> 소스 코드 관리에서 Git 체크 -> 레포지토리 주소 입력
 -> Triggers에서 GitHub hook trigger for GITScm polling 체크 -> Build Steps에서 Add build step 클릭 후 Execute shell클릭 후 echo test 입력 -> 저장

 

그렇다면 이제 main 브랜치에 커밋된 코드가 머지되면 젠킨스에서 지정한 동작을 수행해야 한다.

 

 

 

 

 

 

아이템은 폴더로 만들어진다.

/var/lib/jenkins/workspace/test

 

Jenkins 아이템 실행 위치 (작업 디렉토리)

Jenkins에서 실행되는 아이템의 작업 디렉토리는 Jenkins의 워크스페이스 디렉토리에 위치합니다.

기본 작업 디렉토리

Jenkins에서 특정 아이템(프로젝트)이 실행되면, 해당 아이템의 **워크스페이스(workspace)**에서 작업이 진행됩니다.

  • 일반적으로 Jenkins의 워크스페이스 경로:
    swift
    복사편집
    /var/lib/jenkins/workspace/{JOB_NAME}/
     
     

빌드 -> 다른 컴퓨터에 이 빌드 파일 전송(scp)

ssh key 

 

 

 

 

대화형 명령어?

무한 대기 발생...

이거 안 나오게 해야함

 

password 를 넣어줘야함

 

jenkins 에서 ssh-key 생성

 

 

이 공개키를 접근하려는 컴퓨터에게 전달

jenkins@test:~$ ssh-copy-id -i ~/.ssh/id_rsa.pub test@192.0.3.10
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/var/lib/jenkins/.ssh/id_rsa.pub"
The authenticity of host '192.0.3.10 (192.0.3.10)' can't be established.
ED25519 key fingerprint is SHA256:CyNwDVbSeqCu9NLkPMKFWaAEtG2Q6D4Wg0PztqdpCMg.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
test@192.0.3.10's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'test@192.0.3.10'"
and check to make sure that only the key(s) you wanted were added.

 

 

특정 프로그램 설치

특정 프로그램의 계정이 생성됨

 

jenkins 의 계정 password

 

jenkins 가 다른 컴퓨터 계정의 password 에 접근할 수 있게 하는건가?

 

어디서 누구의 권한으로 어떤 파일을 실행?

 

 

echo "Move to project directory"
cd /var/lib/jenkins/workspace/test/jenkins-test

echo "Add Permission"
chmod +x /var/lib/jenkins/workspace/test/jenkins-test/gradlew

echo "Gradle Build"
/var/lib/jenkins/workspace/test/jenkins-test/gradlew bootJar

echo "Copy jar File"
scp /var/lib/jenkins/workspace/test/jenkins-test/build/libs/jenkins-test-0.0.1-SNAPSHOT.jar  test@10.10.10.209:/home/test/app.jar

echo "Execute jar"
ssh test@10.10.10.209 nohup java -jar /home/test/app.jar &

 

 

 

nginx 가상 머신에 jenkins 로 자동빌드

 

jenkins 에서 npm 을 실행할 수 있는지 확인

]

su - jenkins -c "npm -v"

10.8.2

 

 

 

  • 젠킨스 계정이 docker 를 실행하는 것이므로 jenkins 가 docker 명령어를 사용할 수 있는지 확인
    • su - jenkins
    • docker -v
    • 결과
      Docker version 28.0.1, build 068a01e

젠킨스 계정으로 docker hub 에 접근하려면? 이 파일을 고쳐야 한다?

docker 명령어(도커 서버에 접근하는 클라이언트) 가 docker 데몬(서버) 에 접근하려면 docker 명령어를 작성하는 주체의 계정이 /var/run/docker.sock 이 파일에 등록이 되어 있어야 합니다.

 

ls -l /var/run/docker.sock 
srw-rw---- 1 root docker 0 Mar 18 05:12 /var/run/docker.sock

 

root@test:/var/lib/jenkins/workspace# sudo chmod 4777 /var/run/docker.sock

or

sudo usermod -aG docker jenkins

 groups jenkins
jenkins : jenkins docker

/var/run/docker.sock 이란?

/var/run/docker.sock은 Docker 데몬(dockerd)과 클라이언트(docker 명령어 등)가 통신하는 Unix 소켓 파일

 

젠킨스 사용자를 여기에 넣어줘야 함

 

dokcer in docker

 

docker 로 jenkins 를 올려두었는데

jenkins 에 docker 를 설치해야 한다면 docker in docker 문제 발생

jenkins 에는 개발 환경을 모두 설치해야 한다.

 

 

ansible

 

현재 위치를 기반으로 파일을 찾는거 같다.. 

echo "Move to project directory"
cd /var/lib/jenkins/workspace/test/jenkins-test

echo "Add Permission"
chmod +x /var/lib/jenkins/workspace/test/jenkins-test/gradlew

echo "Gradle Build"
/var/lib/jenkins/workspace/test/jenkins-test/gradlew bootJar

echo "Docker Build"
docker build --tag gyuho0897/backend:$BUILD_ID  /var/lib/jenkins/workspace/test/jenkins-test

echo "Docker Login"
docker login -u 도커 사이트 아이디  -p 비밀번호

echo "Docker Push"
docker push gyuho0897/backend:$BUILD_ID

echo "Copy jar File"
scp /var/lib/jenkins/workspace/test/jenkins-test/build/libs/jenkins-test-0.0.1-SNAPSHOT.jar  test@10.10.10.209:/home/test/app.jar

ssh test@10.10.10.209 << 'EOF'
PID=$(lsof -ti:8080)  # 8080 포트를 사용하는 프로세스 ID 찾기
if [ ! -z "$PID" ]; then
    echo "Process running on port 8080 (PID: $PID), stopping it..."
    kill -9 $PID
    sleep 5  # 프로세스 종료 대기
else
    echo "No process running on port 8080."
fi
EOF

echo "Execute jar"
ssh test@10.10.10.209 nohup java -jar /home/test/app.jar &

 

 

 

kubenets 로 접근

 

ssh-copy-id -i ~/.ssh/id_rsa.pub test@192.0.3.10

이거로 패스워드 안치게 해주고

 

main push -> 빌드(boojJar) -> docker 이미지 생성 -> 이미지 push -> 쿠버네티스에서 이 이미지로 디플로이먼트 생성 -> ...

 

echo "Move to project directory"
cd /var/lib/jenkins/workspace/test/jenkins-test

echo "Add Permission"
chmod +x /var/lib/jenkins/workspace/test/jenkins-test/gradlew

echo "Gradle Build"
/var/lib/jenkins/workspace/test/jenkins-test/gradlew bootJar

echo "Docker Build"
docker build --tag gyuho0897/backend:$BUILD_ID  /var/lib/jenkins/workspace/test/jenkins-test

echo "Docker Login"
docker login -u 도커 사이트 아이디  -p 비밀번호

echo "Docker Push"
docker push gyuho0897/backend:$BUILD_ID

ssh test@192.0.3.10 kubectl apply -f - << 'EOF'


apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-app
  namespace: agh  # 네임스페이스 지정
  labels:
    app: spring-app
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0  # 기존 Pod가 제거되기 전에 새로운 Pod가 준비됨
      maxSurge: 1        # 한 번에 추가할 최대 Pod 
  selector:
    matchLabels:
      type: backend
  template:
    metadata:
      labels:
        type: backend
    spec:
      containers:
        - name: spring-app
          image: gyuho0897/backend:$BUILD_ID
          ports:
            - containerPort: 8080


EOF


echo "Copy jar File"
scp /var/lib/jenkins/workspace/test/jenkins-test/build/libs/jenkins-test-0.0.1-SNAPSHOT.jar  test@10.10.10.209:/home/test/app.jar

ssh test@10.10.10.209 << 'EOF'
PID=$(lsof -ti:8080)  # 8080 포트를 사용하는 프로세스 ID 찾기
if [ ! -z "$PID" ]; then
    echo "Process running on port 8080 (PID: $PID), stopping it..."
    kill -9 $PID
    sleep 5  # 프로세스 종료 대기
else
    echo "No process running on port 8080."
fi
EOF

echo "Execute jar"
ssh test@10.10.10.209 nohup java -jar /home/test/app.jar &

 

 

 

컨피그 맵 활용으로 컨테이너에 들어갈 서비스가 사용할 설정 파일을 컨피그 맵을 만들어서 활용ㄴ