지금까지는 도커 컨테이너를 이용해 수동으로 배포하였으나, 매번 수동으로 배포하는 것이 시간을 많이 잡아먹고 불편하다고 생각하여 Jenkins 와 Github를 이용하여 자동 배포를 하려 한다.
🔔 STEP 1. Jenkins LTS를 자신의 기기에 맞게 다운로드
Jenkins download and deployment
🔔 STEP 2. Jenkins 설치 시, 유저 로그인 권한 주기
Window 11 사용자는 두번째 선택 ) 제어판 > 관리 도구 > 로컬 정책 > 사용자 권한 할당 > 서비스로 로그온 > 사용자 또는 그룹 추가에서 입력할 사용자 추가
Window 10 사용자는 첫번째 선택
설치 완료!!
🔔 STEP 3. http://localhost:{설정한 포트 번호} 검색
해당 주소로 가서 InitailAdminPassword 입력
install suggested plugin 선택하면 다음과 같이 플러그인이 설치 된다.
다운로드 완료 후, jenkins start 해준다.
🔔 STEP 4. Jenkins 새로운 Item 만들기
maven 파일이 아닌 jar 파일을 배포하려 하므로, Freestyle project를 선택했다.
대시보드에 해당 프로젝트가 생성되면, 해당 프로젝트를 선택하고, 구성을 눌러 git, gradle, jdk에 관한 설정을 해준다.
이번 프로젝트는 main 브랜치가 아닌 develop 브랜치로 배포하려 한다.
따라서, Jenkins Dashboard 에서 git parameter 플러그인을 다운받고, 다시 해당 프로젝트의 구성으로 돌아와
밑의 그림과 같이 설정해 주었다.
🔔 STEP 5. Pipeline 진행 과정 시각화
연속적인 아이템 빌드 시, 진행 상황을 편리하게 파악하기 위해 Delivery pipeline 플러그인을 설치해
새 View를 생성해주었다.
🔔 STEP 6. 첫 빌드
모든 설정을 마친 후, 파라미터와 함께 빌드를 선택하여 develop 브랜치로 빌드를 시도해보았다.
하지만 실패하였다는 결과를 받아, 콘솔 출력을 확인해 보았다.
Caused by: java.lang.IllegalStateException at YamlProcessor.java:222
Caused by: java.io.FileNotFoundException at ClassPathResource.java:211
실패 원인은 배포시에 gitignore로 git에 올려놓지 않은 secretfile이 없어서 였다.
이제, secretfile.yml을 배포 파일에 포함시키기 위해 pipeline을 이용해야 한다.
🔔 STEP 7. Jenkins Pipeline 구성하기
secretfile.yml의 내용을 저장하기 위해 먼저 Jenkins 관리 > Credentials에 secretfile.yml을 업로드해주었다.
secretfile을 빌드해줄 새 아이템을 만들었다. Jenkins Pipeline Script를 이용해 아이템의 구성중 pipeline을 다음과 같이 설정해주었다.
git clone을 한 후, credentials에 등록한 secretfile.yml의 id인 secretfile-id-1을 다운로드 하고, 순서대로 ./gradlew clean bootJar 해주었다.
pipeline {
agent any
stages{
stage('git clone'){
steps{
git branch :'develop' ,url: 'https://github.com/{깃허브 주소}'
}
}
stage('secretfile.yml download') {
steps {
withCredentials([file(credentialsId: '{설정한 credential 아이디}', variable: 'ConfigFile')]) {
script {
sh 'cp -f $ConfigFile src/main/resources/secretfile.yml'
}
}
}
}
stage('build'){
steps{
sh "chmod +x gradlew"
sh "./gradlew clean bootJar"
}
}
}
}
생성한 pipeline 아이템을 실행한다.
🔔 STEP 8. tomcat 서버에 배포하기 (war 파일만!!)
jar와 달리 war는 WEB-INF 및 META-INF 디렉토리로 사전 정의된 구조를 사용하며, WAR 파일을 실행하려면 Tomcat, Weblogic, Websphere 등의 웹서버(WEB) 또는 웹컨테이너(WAS)가 필요합니다.
즉, jenkins의 jar파일을 tomcat에도 생성하는 것이다. 먼저, tomcat을 실행시킨다.
jenkins에서 Deploy to container 플러그인을 설치한다.
visual studio Code에서 conf > tomcat-user.xml에서 설정한 deployer 이름과 패스워드를 확인한 후,
아이템의 구성 > Containers > Credentials에 정보를 입력한다.
이때, tomcat의 Tomcat URL은 https://[WINDOWS의 IP]:8088
stage('deploy'){
steps{
deploy adapters: [tomcat9(credentialsId: 'deployer_user', path: '', url: 'https://[WINDOW IP주소]:8088')], contextPath: null, war: '**/*.war'
}
}
🔔 STEP 9. 상용 클라우드 AWS에 배포하기
기존에 생성한 ec2 인스턴스에 jdk 17을 설치하기 위해 putty로 해당 ec2 인스턴스를 열어주었다.
sudo apt install openjdk-17-jre-headless # jdk 17 다운로드
jdk가 설치된 인스턴스를 잠시 중지시키고, 이 인스턴스를 활용해 AMI 이미지를 만든다.
인스턴스를 선택한 후, 작업 > 이미지 및 템플릿 > 이미지 생성
생성된 이미지는 AMI에서 확인할 수 있다.
🔔 STEP 10. 생성한 이미지로 같은 정보의 인스턴스 여러개 만들기
sonarQube나 Docker 등 여러개의 서버를 가동시키기 위해 인스턴스를 여러개 생성했다.
🔔 STEP 11. 보안 그룹 추가
생성한 인스턴스 사이에서는 private IP 주소로도 서로 연결이 가능하도록 인바운드 규칙에서 규칙을 추가해준다.
해당 보안그룹에게 IPV4가 허용되도록 설정한다.
🔔 STEP 12. PollSCM 설정하기
모니터링 서비스를 위해 한시간 마다 빌드되도록 PollSCM 을 설정했다.
🔔 STEP 13. git push시 자동 배포를 위해 GitHub WebHook 연동하기
젠킨스(Jenkins) GitHub Webhooks 연동 - Junhyunny’s Devlogs
다음 블로그를 참고했다.
stage('Checkout') {
steps {
git branch: 'develop',
credentialsId: '[token Credential ID]',
url: '[깃허브 주소]'
}
}
파이프라인에도 다음과 같이 추가해주었다.
+) 아파치 vs 톰캣 vs 엔진엑스의 차이를 찾아보았다.
[Infra] 아파치(Apache), 톰캣(Tomcat), 엔진엑스(Nginx) 차이 - 로스카츠의 AI 머신러닝 (losskatsu.github.io)
'Jenkins' 카테고리의 다른 글
DevOps와 CI/CD의 이해 (0) | 2023.09.28 |
---|
댓글