여러대의 컴퓨터를 사용 -> 분산 환경?
젠킨스란?
커밋 범위를 줄이자.
여러 사람들이 같이 개발하는 환경에서는 자주 커밋하는게 좋다. -> 각 개발자들이 커밋을 할 때마다 빌드하는 등의 과정들이 중복 -> 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 &
컨피그 맵 활용으로 컨테이너에 들어갈 서비스가 사용할 설정 파일을 컨피그 맵을 만들어서 활용ㄴ