폐쇄망 Jenkins 구축기
상황
- 클라우드 환경에서 타 클라우드로 옮겨야함.
- 기존 배포 환경은 로컬에서 war, jar로 말은 후 수동으로 옮겨 배포하는 환경이었다.
- 방화벽 신청(인터넷, 80 & 443)을하고 작업하면 편하지만 한두번 그냥 ftp, sftp로 파일 옮겨서 설치하다보니 오기가 생겨 모두 폐쇄망에서 작업을 진행.
- 배포할 서버, jenkins서버, gitlab서버가 모두 다르게 구성되어있음.
환경
- jenkins
- gitlab
- maven, gradle
- centos
- jdk 1.8, jdk 11
1. jdk 설치
- 프로젝트마다 jdk를 여러개 써야하기 때문에 프로젝트에 맞는 각 jdk들을 로컬에서 다운로드한다. (https://github.com/AdoptOpenJDK) openjdk
- 클라우드로 다운로드 받은 jdk를 옮겨준뒤 압축을 풀어준다.
ex.
1. 경로 설정
cd /usr/lib
mkdir java
cd java
2. 압축 풀기
tar -zxvf [다운로드받은경로]/OpenJDK8U-jdk_x64_linux_8u292b10.tar.gz
- 환경변수 설정
어차피 jenkins에서 프로젝트마다 버전별로 jdk 경로를 다시 잡아줄것이긴 하지만 기본으로 쓸 java home 설정을 해준다.
1. 환경변수 설정
vim /etc/profile
2. 가장 아래에 내용 추가
export JAVA_HOME=/usr/lib/java/openjdk-8u292-b10
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$CLASSPATH:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
3. 적용
source /etc/profile
이후 java -version
을 입력해 잘 설정되었는지 확인한다.
2. gitlab 설치
- OS에 맞는 설치파일 다운로드 (https://packages.gitlab.com/gitlab/gitlab-ce/)
나는 gitlab-ce-15.8.0-ce.0.el7.x86_64.rpm를 받았다. 자신의 클라우드 os에 맞는 버전을 다운로드하면된다. - 클라우드로 옮겨준뒤 터미널에서 설치를 시작한다.
- 설치
sudo yum localinstall -y gitlab-ce-15.8.0-ce.0.el7.x86_64.rpm
설정파일 수정
cd /etc/gitlab/
vi gitlab.rb
여기서 두가지를 보통 수정해줘야한다.
- 접속 IP 및 PORT 설정.
vi에서/
입력후external_url
입력해 찾으면 편하다.(다음 찾기n
)
추후 gitlab사용자들이 clone시 접속할 url을 작성해주면된다. localhost라고 적으면 안되며 클라우드 서버 접속하는 IP와 gitlab을 띄울 포트를 적어주면된다.
external_url 'http://10.999.999.999:9999'
- 저장 디렉토리 변경.
vi에서/
입력후git_data_dirs
입력해 찾으면 편하다.(다음 찾기n
)
깃 데이터들이 저장될 곳을 설정해준다.
git_data_dirs({
"default" => {
"path" => "/home/gitlab/git-data"
}
})
- 변경 내용 적용
sudo gitlab-ctl reconfigure
- 확인 및 로그인
- 같은 망의 로컬pc에서 자신이 설정한 주소(http://10.999.999.999:9999)로 들어가 정상적으로 작동하는지 확인한다.
- 초기 비밀번호의 경우
cat /etc/gitlab/initial_root_password | grep Password:
로 확인가능하다. 아이디는 root이다.
3. jenkins 설치
파일 다운로드.
젠킨스 공식 홈페이지(https://www.jenkins.io/download/)에서 war파일을 다운로드한다.클라우드로 옮겨 준뒤 원하는 위치에서 실행시켜준다.
나는 /home/jenkins를 만들어 준뒤 이곳에 jenkins.war를 넣고 스크립트를 만들어 실행해주었다.- jenkins 폴더 생성
cd /home mkdir jenkins
- 실행 스크립트 생성
원하는 포트와 로그 파일 경로를 설정해 주고 실행했다.
vi startup.sh #! /bin/sh nohup java -jar jenkins.war --httpPort=12345 >> /home/jenkins/log/jenkins_$(date +\%m\%d).log 2>&1 &
- 실행
./startup.sh
- 실행 후 url로 접속하게되면 초기에 이것저것 설치되는데 설치되는 기본 경로는
/root/.jenkins
에 위치한다.
4. maven & gradle 등 빌드도구 설치
- maven 설치
https://archive.apache.org/dist/maven/maven-3/3.9.0/binaries/
에서apache-maven-3.9.0-bin.tar.gz
파일을 다운로드 받고 클라우드로 옮겨준다.(아직 maven4 버전은 alpha 버전이다.)/usr/local
로 파일을 옮겨준뒤 압축을 해제한다.tar xvfz apache-maven-3.9.0-bin.tar.gz
- 환경변수 등록
vi /etc/profile
#maven
export MAVEN_HOME=/usr/local/apache-maven-3.9.0
#common
export PATH=$PATH:$MAVEN_HOME/bin
- 적용
source /etc/profile
- 잘 적용되었는지 확인
mvn -v
- gradle 설치
https://gradle.org/releases/
에서 zip 파일 다운로드 후 클라우드서버로 파일 이동- 폴더 생성 및 압축해제
폴더생성
mkdir /opt/gradle
압축해제
unzip -d /opt/gradle /tmp/gradle-${VERSION}-bin.zip
- 환경변수 등록
vi vi /etc/profile.d/gradle.sh
export GRADLE_HOME=/opt/gradle/gradle-${VERSION}
export PATH=${GRADLE_HOME}/bin:${PATH}
- 실행권한 부여
chmod +x /etc/profile.d/gradle.sh
- 변경사항 적용
source /etc/profile.d/gradle.sh
- 확인
gradel -v
5. jenkins 플러그인 설치
기본 설치되는 플러그인들 외 gitlab, maven, ssh 등 연동하기 위해 필요한 플러그인들이 있다.
젠킨스 홈 화면 - 젠킨스 관리 - 플러그인 관리에서 다운로드하는걸 추천한다.
플러그인들을 설치한지 좀 지나... 어떤것들이 기본으로 설치된 플러그인들인지 정확하게 기억이 나지 않지만 필요한것들 위주로 적어본다.
이 플러그인들을 모두 '로컬'에 젠킨스를 한 번 더 설치하고 다운받아야한다.
물론 플러그인 파일만 받을 수도 있지만 로컬에 젠킨스 설치하고 받는게 더 편하다.(플러그인 하나 설치시 함께 설치되는 플러그인들도 있음.)
설치 완료 후 나의경우 로컬은 OS 윈도우C:\ProgramData\Jenkins\.jenkins\plugins
에서 설치된 파일들 확인이 가능하다.
경로에 가보면 확장자가 .jpi
인 확장자 파일들이 있는데 이걸 모두 복사 후 클라우드 서버의 /root/.jenkins/plugins/
로 옮겨주고 확장자를 .hpi
로 바꿔줘야한다. 그 후 젠킨스를 재시작하면 자동으로 플러그인들이 설치될 것이다.
- gitlab연동을 위해 추가로 설치해야할 플러그인
- Generic Webhook Trigger Plugin
- GitLab Authentication plugin
- GitLab Branch Source Plugin
- Gitlab Merge Request Builder
- GitLab Plugin
- maven을 위해 추가로 설치해야할 플러그인
- Maven Info Plugin
- Maven Invoker plugin
- Maven Release Plug-in Plug-in
- Maven Repository Server Plugin
- gradle을 위해 추가로 설치해야할 플러그인
- Gradle
- Gradle RepoVersion
- ArtifactoryVersion
- SSH배포를 위해 설치해야할 플러그인
- Publish Over SSH
- SSH Build Agents plugin
- SSH server
- 기타 플러그인
- Ant Plugin
- Build Timeout
- Command Agent Launcher Plugin
- LDAP Plugin
- PAM Authentication plugin
- Pipeline
- Timestamper
- Workspace Cleanup Plugin
젠킨스 재실행
젠킨스 실행중인 pid 확인
ps -ef | grep jenkins
젠킨스 kill
kill -9 {확인한젠킨스pid}
젠킨스 실행
./startup.sh
6. jenkins Maven(또는 Gradle), jdk, gitlab 접속정보, ssh 등... 설정
젠킨스 홈 - Jenkins 관리 - Global Tool Configuration에서 한 번 설정해 두면 프로젝트 마다 쉽게 불러와서 설정이 가능하다.
- Maven 설정 및 Gradle 설정
- Maven(또는 Gradle) 항목으로 이동
- Add Maven(또는 Add Gradle) 클릭
- name에 설치한 maven(또는 Gradle) 버전으로 이름 입력(추후 구분 편하게 하기 위함)
- MAVEN_HOME(또는 GRADLE_HOME)에 실제 클라우드 서버에 설치한 경로 입력
etc. Add Maven(또는 Add Gradle)를 눌러 여러 버전 입력
- JDK 설정
- jdk 항목으로 이동
- Add jdk 클릭
- name에 설치한 jdk 버전으로 이름 입력(추후 구분 편하게 하기 위함)
- JAVA_HOME에 실제 클라우드 서버에 설치한 경로 입력
etc. Add jdk를 눌러 여러 버전 입력
- gitlab 설정
- gitlab에 jenkins용 계정 생성
- jenkins홈 - jenkins관리 - Credentials에 username 및 password 입력
- SSH Server 설정
소스코드 빌드 후 배포할 서버의 정보를 입력하는 부분이다.
젠킨스 홈 - Jenkins 관리 - 시스템설정
Publish over SSH 항목으로가서 SSH Servers 항목에 배포대상 서버 정보 입력.
- Name : 배포대상서버명
- Hostname : IP주소
- Username : 배포대상서버 로그인 ID
- Remote Directory : 빌드된파일을 배포대상서버의 어디로 보낼건지 입력.
고급 버튼 클릭 후 배포대상서버의 로그인 비밀번호 입력.
7. Jenkins 프로젝트 생성 및 기본 설정
추가 설정들도 있겠지만 가장 기본적인 설정만 세팅을 정리해놓았다.
- 젠킨스홈에서 왼쪽의
+ 새로운 Item
클릭 - 프로젝트에 맞게 설정 진행(6번에서 설정한 항목이 보여져 쉽게 선택이 가능하다.)
- JDK : 프로젝트에 맞는 jdk 버전 선택
- 소스코드관리 : git 선택
- Repository URL : 깃랩에서 clone할 프로젝트의 주소
- Credentials : 깃랩 접속정보
- Branches to build : 깃랩에서 배포할 브랜치(ex.
*/deploy
) - Test Connection : Success 가 나오면 잘 연결된 것이다.
- Build Steps : Add build step을 통해 빌드 절차 입력
- Invoke top-level Maven targets
- Maven Version : 빌드에 사용할 maven 정보입력
- Goals : 클린 후 패키지
clean package
- Invoke top-level Maven targets
- 빌드 후 조치 : 빌드된 war 또는 jar 파일을 보낼 서버 정보 입력
- add를 통해 Send build artifacts over SSH 선택
- add server 클릭 후 SSH Server에서 배포할 서버 선택
- add transfer set 클릭
- Source files : 젠킨스에서 빌드 후 배포될 war 또는 jar 파일 정보 입력(ex.
target/myproject-1.0.0.war
) - Remove prefix : 접두사 제거(ex.
target
)
- Source files : 젠킨스에서 빌드 후 배포될 war 또는 jar 파일 정보 입력(ex.
- 아마 이후 실행 후에 빌드시 에러가 날 것이다.
젠킨스 프로젝트 - 고정링크 - Console Output을 통해 에러 파악이 가능하다.
보면 젠킨스는 다음과 같은 절차를 수행하고 있다.- 목적지 경로로 이동
/root/.jenkins/workspace/myjenkinsproject
- gitlab에서 소스코드 클론
- 소스코드 빌드
/usr/local/apache-maven-3.9.0/bin/mvn -Dmaven.repo.local=/root/.jenkins/workspace/myjenkinsproject/ .repository clean package
여기서 에러가 날것이다. 각 프로젝트마다 maven repository를 따로 갖고 빌드를 하기 때문에 폐쇄망이라 로컬(C:\Users\user\.m2
)에서 repository를 복사해올 필요가 있다.
로컬의 repository를 잠시 이름 바꾸고 로컬에서 프로젝트를 clean package 하면 필요한 repository만 생성될 것이다. 이것들을 jenkins가 설치된 클라우드서버의/root/.jenkins/workspace/myjenkinsproject/.repository
에 넣어주면 문제 없이 실행된다.
- 목적지 경로로 이동
8. 여기까지 왔으면 배포대상서버에
myproject-1.0.0.war
가 잘 생성되었을 것이다.
이제
'[DevOps] > Jenkins' 카테고리의 다른 글
Jenkins home 위치 (0) | 2023.02.20 |
---|