너만 끝내면...
Docker 부터 Jenkins까지...
너무 귀찮고 쓸거 많고 한데 블로그 이전보다도 이것들부터 끝내는 이유는...
자잘하게 이슈들 해결한거 기록으로 남기고 싶은데 홈서버 제작 순서 짜맞추느라 다른걸 못 씀;;;
너어는 내가 오늘 다 끝낸다 진짜
홈서버 사양
제품명 : Beelink S12 Pro
OS : window 10 pro & Ubuntu 22.04
CPU : Intel(R) N100
RAM : 16GB (3200 MHz)
SSD : 512GB (NVMe)
HDD : 500GB (Hitachi)
Jenkins 설치
1) 요약
1) Docker Compose를 사용하여 Nginx와 Jenkins 컨테이너를 설정하고 실행
2) Jenkins에서 GitHub 프로젝트 빌드를 설정하고 자동화
3) 빌드 결과를 Nginx로 배포하여 웹사이트로 배포
위 과정으로 진행할 것이다
2) 기본 세팅
Jenkins는 웹 브라우저에서 http://<서버 IP>:8080으로 접속하여 초기 설정을 진행할 수 있다
접속하면 비밀번호 입력하라고 하는데, 초기 비밀번호는 Jenkins 컨테이너에서 다음 명령을 통해 확인할 수 있다
# 대충 Jenkins Container 내부에 있는 initialAdminPassword 키를 텍스트로 출력하라는 의미
docker exec jenkins-container cat /var/jenkins_home/secrets/initialAdminPassword
초기 비밀번호를 입력한 후, 기본적인 Jenkins의 플러그인을 설치한다
기본적으로 필요한 것들을 설치하고 나면 로그인 페이지가 뜨는데 관리자 계정을 생성합니다.
아이디, 비번은 너무 쉬운걸로 하지말고.. 적당한걸로 만든 다음 로그인 하면 된다
생각보다 넘 쉽자나! 두근!! 이제 깃이랑 연결만하면!!!
3) Jenkins, GitHub 연결하기
(1) Git Token 발급하기
Settings - Developer settings - Personal access tokens - Tokens (classic) 순으로 이동 후 새 토큰 발급 시작
repo, admin:org, admin:repo_hook 세 가지를 선택하고 저장
토큰 한번 발급하면 재확인 불가!!! 반드시 기록해둘 것!!
(2) Webhook 등록하기
웹훅도 등록해야한다 (setting - Webhooks - Add webhook)
내 서버 젠킨스의 URL을 연결해준다 (보통은 <ip>:port 번호 형태)
그리고 맨 끝에 github-webhook을 추가해줌
# 예시
http://100.100.100.100:8080/github-webhook
그러고 나면 이제 젠킨스가 github의 통신을 받을 수 있게 플러그인을 설치해줘야한다
(3) Jenkins 플러그인 설치
필수 플러그인 3가지 설치하자 (Dashboard - Jenkins 관리 - Plugins - Available plugins)
- Generic Webhook Trigger Plugin
- GitHub Integration Plugin
- GitHub API Plugin
각각 검색해서 설치하고 docker restart [젠킨스 컨테이너 명] 해가지고 재실행하자
(4) Jenkins Credential 설정하기
Github에 접근할 수 있도록 세팅해줘야한다
Kind : Username with password 선택
Username : 나의 깃허브 아이디 작성
Password : 아까 발급받은 Github Token 값 입력
ID : Jenkins에서 쓸 자격증명의 ID로, git이 jenkins에게 Credential을 줄 때 인식함
(5) Jenkins 파이프라인 설정하기
pipeline {
agent any
tools {
jdk ("JDK_21")
}
stages {
stage('GitHub Clone') {
steps {
git branch: 'main', credentialsId: 'nakji_lab', url: 'https://github.com/Ratatou2/Nakji_Lab.git'
}
}
stage('Set Permissions') {
steps {
// lab_backend 디렉토리 내 gradlew 파일에 실행 권한 부여
sh 'chmod +x lab_backend/gradlew'
}
}
stage('Build lab_backend') {
steps {
dir('lab_backend') {
// Gradle 빌드 명령어 실행
sh './gradlew build'
}
}
}
stage('Copy JAR to Volume') {
steps {
// JAR 파일 복사
script {
// 복사할 경로
def jarFile = '/var/jenkins_home/workspace/nakji_lab/lab_backend/build/libs/lab-0.0.1-SNAPSHOT.jar'
def targetDir = '/var/jenkins_home/data' // 볼륨 경로
// 대상 디렉토리가 존재하는지 확인하고 없으면 생성
sh "mkdir -p ${targetDir}"
// JAR 파일 복사
sh "cp ${jarFile} ${targetDir}/lab-0.0.1-SNAPSHOT.jar"
}
}
}
}
}
위 코드의 stage('Copy JAR to Volume') 파트는 앞서 설정해뒀던 docker-compose.yml의 volume과 연관되어 있다
볼륨 경로에 넣어둔 .jar 파일을 가져오기 위함임
위 파이프라인에 대한 설명
1. stages 안에 여러 stage가 들어가고, 각각의 단계로 구분된다고 생각하면 편하다 (그냥 직독직해 수준으로 이해하시면 됨)
2. 물론 한 stage안에 다 때려넣어도 되지만, 그러면 에러가 터져도 어느 단계인지 구분하기 어려우니 이런식으로 모듈화해서 진행하면 추후 관리가 편하다
3. git clone을 할 땐 브랜치 명을 잘 봐야 한다. (내가 고생했던 지점) 기본적으로 내 프로젝트는 Master 브랜치가 없고, main이었는데, Jenkins는 디폴트가 Master라서 main 브랜치를 명시해줬어야 했다. 나중에 backend 브랜치, frontend 브랜치 따로 빌드해줄 때도 이런 식으로 하면 된다
4. gradlew가 권한이 있어야 실행할 수 있다. 그래서 권한을 따로 주는 stage가 있는데 이부분은 각자의 디렉토리에 맞춰 진행하면 될듯하다
5. 다음은 아까 연결해둔 jenkins volumn으로 빌드파일을 복사한다. 이렇게 진행하는 이유는 일단 volumn을 써보고 싶었음.
6. [추가 필요] 이후엔 복사해둔 파일을 기반으로 컨테이너를 하나 띄워서 실행해야 함 (.sh 파일 만들어서 실행하도록 셋팅 필요)
성...공...
원래 같으면 여기다가 과정에서 있었던 이슈들 정리하려고 했는데 분량이 미어터질 정도로 많아서 나눠서 포스팅 하겠다 ㅠ
'Linux' 카테고리의 다른 글
Ubuntu 기본 언어 변경 방법 (feat. 영어 vs 한글) (1) | 2024.11.26 |
---|---|
홈서버 만들기 (5) - MySQL 세팅하기 (feat. Docker & DBeaver) (0) | 2024.11.25 |
홈서버 만들기 (3) - CI/CD 구축 (feat. Docker) (0) | 2024.11.25 |
홈서버 만들기 (2) - 서버 설정 (feat. 포트포워딩 & DDNS) (0) | 2024.11.25 |
홈서버 만들기 (1) - 듀얼 부팅 설정 (Window & Ubuntu) (0) | 2024.11.25 |