서버내 보안 때문에 그리고 프로젝트 jdk 버전 때문에
그리고 메이븐 빌드 문제로 인하여 젠킨스 설정이 어려운경우가 많이 있다.
도커 설치 우분투22 기준
https://velog.io/@osk3856/Docker-Ubuntu-22.04-Docker-Installation
다음은 서버 환경상
젠킨스 내에서 자바 설치 및 메이븐 설치 등이 잘 안되는 경우를 위해
수동으로 자바 및 메이븐을 설치하는 방법이다.
1. 젠킨스 설치
1)도커파일 작성
젠킨스가 기본적으로 jdk17 을 사용하고 있다. 그래서 jdk8 이나 jdk11 필요한 프로젝트에서는 젠킨스 ui 화면의 tool 메뉴에서 jdk 설정을 해서 다운로드를 받고 경로를 잡아 주면 된다. 그러나 안되는 경우 다음과 같이 Docker 파일에서 도커 이미지 생성시 jdk8, jdk11 을 설치 하도록 하자.
maven 또한 메이븐의 특정 저장소를 이용해서 서버내 보안 때문에 작동이 안될경우 직접 설치하는 방향으로 한다.
Docker 파일에 openjdk 의 설치 명령어로 java 8 과 11을 설치를 하려고 하였으나 안되어서 직접 다운로드 받는 방법을 선택했다.
임의 디렉토리 위치에서 도커파일을 다음과 같이 작성 한다.
Dockerfile
# 베이스 이미지 설정 FROM jenkins/jenkins # 필요한 패키지 설치 USER root RUN apt-get update && \ apt-get install -y maven vim wget unzip curl # 필요한 패키지 설치 USER root RUN apt-get update && \ apt-get install -y vim wget unzip curl # Maven 설치 RUN mkdir -p /var/jenkins_home/maven && \ wget -O - https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz | tar -xzC /var/jenkins_home/maven --strip-components=1 && \ rm -f /usr/bin/mvn && \ ln -s /var/jenkins_home/maven/bin/mvn /usr/bin/mvn # 환경 변수 설정 ENV MAVEN_HOME /var/jenkins_home/maven ENV PATH $MAVEN_HOME/bin:$PATH # Oracle JDK 8 설치 RUN wget -c --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz -O /tmp/jdk-8-linux-x64.tar.gz && \ tar -xzf /tmp/jdk-8-linux-x64.tar.gz -C /opt && \ rm /tmp/jdk-8-linux-x64.tar.gz # OpenJDK 11 설치 RUN wget https://download.java.net/openjdk/jdk11.0.0.1/ri/openjdk-11.0.0.1_linux-x64_bin.tar.gz -O /tmp/openjdk-11-linux-x64_bin.tar.gz && \ tar -xzf /tmp/openjdk-11-linux-x64_bin.tar.gz -C /opt && \ rm /tmp/openjdk-11-linux-x64_bin.tar.gz # JAVA_HOME 환경 변수 설정 ENV JAVA_HOME /opt/jdk1.8.0_131 # PATH 환경 변수에 JAVA_HOME 추가 ENV PATH "${PATH}:${JAVA_HOME}/bin"
만약에 위 도커파일에 실행에 있어 자바 경로 때문에 오류가 난다면 jdk 다운로드 경로를 변경해야 한다.
다음 사이트에서 자바 다운로드 경로를 확인후 다운로드 링크 경로를 수정해야 한다.
https://jdk.java.net/java-se-ri/11-MR2
Dockerfile에서 Oracle JDK 8과 JDK 11을 설치한 경로는 /opt 디렉토리다.
따라서 JDK의 경로로서 젠킨스 에서 해당 경로를 입력해야 한다.
Oracle JDK 8: /opt/jdk1.8.0_131
Oracle JDK 11: /opt/jdk-11.0.0.1
참조) 다음과 같이 Dockerfile 에 스크립트를 설정 해서 실행해 보았다.
그러나 젠킨스 도커가 기본적으로 자바 17을 사용하기 때문에 작동이 안된다.
# 시작 스크립트 작성 RUN echo '#!/bin/bash' > /start.sh && \ echo 'export JAVA_HOME=/opt/jdk1.8.0_131' >> /start.sh && \ echo 'export PATH="${JAVA_HOME}/bin:${PATH}"' >> /start.sh && \ echo 'exec "$@"' >> /start.sh && \ chmod +x /start.sh # 시작 스크립트 실행 ENTRYPOINT ["/start.sh"]
참조) 그래들 설치
# 그래들 설치 RUN wget https://services.gradle.org/distributions/gradle-7.3.3-bin.zip -P /tmp && \ unzip /tmp/gradle-7.3.3-bin.zip -d /opt && \ ln -s /opt/gradle-7.3.3/bin/gradle /usr/bin/gradle && \ rm /tmp/gradle-7.3.3-bin.zip
3) 기존에 메이븐이 설치 되어 있으면 삭제 및 jenkins_home 디렉토리 생성
메이븐 삭제 #sudo apt-get remove maven 메이븐 설정파일 삭제 #sudo apt-get purge maven 메이븐 저장소 삭제 #rm -rf ~/.m2/repository
2) Dockerfile 실행
docker build -t my-jenkins-image:1.0 .
이 명령어는 현재 디렉토리(.)의 도커파일을 사용해 my-jenkins-image 라는 이름의 도커 이미지를 빌드한다는 명령어다.
3) 생성된 도커 이미지 실행
빌드한 도커 이미지를 실행하려면 docker run 명령어를 사용
(공백 및 백슬러시 때문에 오류 안나게 복사시 주의)
docker run -d \ --name my-jenkins \ --restart=on-failure \ -p 8080:8080 \ -p 50000:50000 \ -v /var/jenkins_home:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /var/jenkins_home/maven:/var/jenkins_home/maven \ -v /var/jenkins_home/maven/.m2:/root/.m2 \ -v /var/jenkins_home/gradle:/var/jenkins_home/gradle \ -v /var/jenkins_home/gradle/.gradle:/root/.gradle \ -e JAVA_HOME=/opt/jdk1.8.0_131 \ -e TZ=Asia/Seoul \ -e ANOTHER_ENV_VAR=value \ my-jenkins-image:1.0
docker run -d: Docker 컨테이너를 백그라운드에서 실행합니다.
--name my-jenkins: 컨테이너의 이름을 my-jenkins로 설정합니다.
--restart=on-failure: 컨테이너가 실패로 종료될 경우 자동으로 재시작합니다.
-p 8080:8080: 호스트의 8080 포트를 컨테이너의 8080 포트에 바인딩합니다. 이를 통해 Jenkins 웹 인터페이스에 접근할 수 있습니다.
-v /var/jenkins_home:/var/jenkins_home: 호스트의 /var/jenkins_home 디렉토리를 컨테이너의 /var/jenkins_home 디렉토리에 마운트합니다. 이를 통해 Jenkins 데이터를 영구적으로 저장할 수 있습니다.
-v /var/run/docker.sock:/var/run/docker.sock: Docker 소켓을 컨테이너에 마운트하여 Jenkins가 Docker 명령을 실행할 수 있게 합니다.
-v /var/jenkins_home/maven:/var/jenkins_home/maven: Maven 설정을 저장하는 디렉토리를 마운트합니다.
-v /path/to/gradle:/var/jenkins_home/gradle: Gradle 설정을 저장하는 디렉토리를 마운트합니다.
-v /host/path/to/.gradle:/root/.gradle: 호스트의 Gradle 캐시 디렉토리를 컨테이너의 해당 디렉토리에 마운트합니다.
-v /host/path/to/.m2:/root/.m2: 호스트의 Maven 캐시 디렉토리를 컨테이너의 해당 디렉토리에 마운트합니다.
-e TZ=Asia/Seoul: 컨테이너의 시간대를 서울로 설정합니다.
-e ANOTHER_ENV_VAR=value: 환경 변수 ANOTHER_ENV_VAR를 설정하고 값을 value로 지정합니다.
-e JAVA_HOME=/opt/jdk1.8.0_131: 환경 변수 JAVA_HOME를 설정하고 값을 /opt/jdk1.8.0_131로 지정합니다. 이는 JDK 8의 설치 경로입니다.
my-jenkins-image:1.0: 실행할 Docker 이미지의 이름과 태그를 지정합니다. 이 경우 my-jenkins-image라는 이름의 1.0 태그를 가진 이미지를 사용합니다.
Jenkins 슬레이브 에이전트는 Jenkins 마스터에서 작업을 받아 실행하는 보조 노드입니다. 일반적으로 Jenkins 마스터가 관리하고 스케줄링하는 작업을 처리하기 위해 사용됩니다.
원격 작업 수행: 슬레이브 에이전트는 Jenkins 컨트롤러로부터 요청을 받아 작업을 수행
이 슬레이브 에이전트들은 Jenkins 마스터와 통신하기 위해 TCP/IP를 사용합니다. Jenkins 마스터는 슬레이브 에이전트가 실행되는 호스트와 통신할 수 있는 TCP 포트를 할당합니다. 기본적으로 Jenkins 슬레이브 에이전트는 마스터의 JNLP (Java Network Launch Protocol) 포트인 50000번을 사용합니다. 이를 통해 마스터와 에이전트 사이의 통신이 이루어집니다.
만약에 다음과 같은 권한 오류가 발생한다면, 도커를 삭제후 재 설치 해야 한다.
docker: Error response from daemon: error while creating mount source path '/var/jenkins_home': mkdir /var/jenkins_home: read-only file system.
docker file 에 작성한 내용과 동일하게 메이븐 설치 및 환경 변수 설정.
자바가 설치 되지 않았으니 당연히 인식이 안된다.
단지 , 젠킨스 컨테이너 안에서 동일한 위치에 메이븐을 저장시켜주고 메이븐을 인식 시켜주기 위한 설정이다.
wget -O - https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz | tar -xzC /var/jenkins_home/maven --strip-components=1 && \ rm -f /usr/bin/mvn && \ ln -s /var/jenkins_home/maven/bin/mvn /usr/bin/mvn $환경변수 설정 #vi /etc/bash.bashrc echo 'export MAVEN_HOME=/var/jenkins_home/maven' >> ~/.bashrc echo 'export PATH=$MAVEN_HOME/bin:$PATH' >> ~/.bashrc # source /etc/bash.bashrc
docker stop my-jenkins
docker rm my-jenkins
4) my-jenkins 컨테이너에 진입 후 자바 설치 확인 및 메이븐 확인
$ docker exec -it my-jenkins /bin/bash #확인 root@b4250c44983a:/# ls -al /opt/ total 6700 drwxr-xr-x 1 root root 26 Apr 13 09:12 . drwxr-xr-x 1 root root 51 Apr 13 09:13 .. drwxr-xr-x 3 root root 21 Apr 9 22:29 java drwxr-xr-x 8 root root 96 Apr 13 09:12 jdk-11.0.0.1 drwxr-xr-x 8 uucp 143 255 Mar 15 2017 jdk1.8.0_131 -rw-r--r-- 1 root root 6858854 Apr 9 22:28 jenkins-plugin-manager.jar $update-java-alternatives --list root@b4250c44983a:/# $JAVA_HOME bash: /opt/jdk1.8.0_131: Is a directory root@b4250c44983a:/# mvn -version Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d) Maven home: /var/jenkins_home/maven Java version: 1.8.0_131, vendor: Oracle Corporation, runtime: /opt/jdk1.8.0_131/jre Default locale: en, platform encoding: UTF-8 OS name: "linux", version: "5.15.0-102-generic", arch: "amd64", family: "unix"
만약에 maven 디렉토리에 아무런 파일이 없거나 mvn -version 을 입력해도
root@b4250c44983a:/# ls -al /var/jenkins_home/maven/ total 60 drwxr-xr-x 7 root root 4096 Apr 18 13:48 . drwxrwxr-x 12 root daemon 4096 Apr 18 13:48 .. drwxr-xr-x 2 root root 4096 Apr 18 13:48 .m2 -rw-r--r-- 1 root root 17504 Nov 7 2019 LICENSE -rw-r--r-- 1 root root 5141 Nov 7 2019 NOTICE -rw-r--r-- 1 root root 2612 Nov 7 2019 README.txt drwxr-xr-x 2 root root 4096 Apr 18 13:42 bin drwxr-xr-x 2 root root 4096 Apr 18 13:42 boot drwxr-xr-x 3 root root 4096 Nov 7 2019 conf drwxr-xr-x 4 root root 4096 Apr 18 13:42 lib
버전이 안나오면은 my-jenkins 도커 컨테이너를 삭제후 my-jenkins 도커이미지를 다시 실행 해야 한다.
docker stop my-jenkins
docker rm my-jenkins
그리고
분명히 도커파일에서 jdk 8 을 설정했고, 도커이미지 실행시에도 jdk8 로 설정을 했으나 막상, jenkin 도커 이미지에
가서 자바 버전을 확인해 보면 17로 나온다.
그러나, 파이프 라인을 통해 자바 버전을 확인해 보면 jdk17 이나
빌드는 jdk8 설정되어 빌드 도는 것을 알수 있다.
간단하게 젠킨스 관리 -> Tools -> JDK installations 에서 jdk8 경로만 설정해 주면 되지 않냐고 생각할수 있는데,
보안및 기타이유로 안될 경우는 위와 직접 jdk 를 다운 받아 설정하면 된다는 내용의 글이다.
5) 젠킨스 접속
초기 비밀번호 입력
root@redmin:/home/redmin# cat /var/jenkins_home/secrets/initialAdminPassword c983a9cc1d3e428fa1964b38d3cf47d4
젠킨스 컨테이너를 실행했으면 http://<ip 주소>:<8080> 를 입력하여 젠킨스에 접속한다.
초기 비밀번호는 컨테이너의 /var/jenkins_home/secrets/initialAdminPassword에 저장되어 있다.
기본적으로 insall suggested plugins 선택
6) 젠킨스 플러그인 설치
다음 설치 플러그인을 추가하자
Generic Webhook Trigger
GitHub Integration
Config File Provider
maven
7) 자바 설정
/opt/jdk1.8.0_131
8) 메이븐 설정
Git에서 사용자 이름과 비밀번호를 묻지 않도록 설정하려면, Git의 credential.helper 설정을 사용할 수 있습니다12. 이 설정은 Git에게 사용자 이름과 비밀번호를 어떻게 기억하고 사용할지 알려줍니다12.
다음 명령어를 실행하면, Git은 사용자 이름과 비밀번호를 한 번만 물어보고 그 후로는 기억하여 사용합니다12:
git config --global credential.helper store
이 명령어를 실행한 후에 git pull이나 git push를 실행하면, 처음에만 사용자 이름과 비밀번호를 물어보고 그 후로는 묻지 않습니다12.
그러나 이 방법은 사용자 이름과 비밀번호를 평문으로 저장하므로, 보안에 취약할 수 있습니다1. 따라서 이 방법을 사용하기 전에 이 점을 고려해야 합니다
2.젠킨스 톰켓 배포 파이프라인 스크립트
1) Github Token 발급받아 Jenkins 자격 등록하기
=====> [GitHub] 깃허브 토큰(Token) 생성하는 법
https://7942yongdae.tistory.com/190
1. Github 토큰 발급받기
1.1 사용자 정보 메뉴 중 Settings 항목 선택
Profile > Settings
1.2 환경설정(Settings) 메뉴 중 Developer settings 항목 선택
- URL: https://github.com/settings/profile
Settings > Developer settings
1.3 개발자 설정(Developer settings) 메뉴 중 Personal access tokens 항목 선택 후 Generate new token 버튼 클릭
- URL: https://github.com/settings/apps
Personal access tokens > Generate new token
1.4 Generate token 버튼을 눌러 Github Access token 발급
- URL: https://github.com/settings/tokens/new
Github Access token 발급
- Jenkins 연동 시 필요한 Select scopes는 repo로 선택하였습니다. Scope에 대한 정의는 문서를 참조해주세요.
1.5 Github Access token 발급 완료
Generate Github access token
Generate token 버튼을 눌러 발행된 Aceesss token 값은 잘 메모해두어야 합니다. Access token의 권한은 재정의할 수 있지만 token 값은 확인할 수 있는 방법이 없어 잃어버린다면 새로운 Access token을 발행해야 하기 때문입니다.
2. Jenkins에 토큰 등록
2.1 자격(Credential) 관리 페이지로 이동
Jenkins 관리 > Manage Credentials
2.2 Add Credentials 버튼을 눌러 자격 등록 페이지로 이동
Manage Credentials > Global credentials > Add Credentials
2.3 자격(Credential) 등록
자격 등록 (Add Credential)
- kind: 정의할 자격의 종류를 선택합니다. Username with password를 선택해주세요. token 값을 사용하기 때문에 Secret text를 사용해도 될 거라고 생각했는데 git protocol은 지원하지 않는다고 합니다. 때문에 Git repository를 선택하는 과정에서 Secret text로 정의된 자격은 사용할 수 없었습니다.
출처: stackoverflow
- username: 사용자 ID를 입력합니다. Github 계정을 입력해주세요. Github Token으로 인증하기 때문에 어떤 값을 넣어도 문제는 없지만 추후 관리를 생각한다면 Github의 계정을 사용하는게 좋습니다.
- password: 사용자 패스워드를 입력합니다. Github에서 발급받은 token 값을 입력해주세요.
- ID: Jenkins 자격 증명에서 사용할 고유 ID 값을 입력합니다. 입력하지 않은 경우 자동으로 값이 생성되며, 신규 등록 시만 정의할 수 있습니다.
- Description: 자격 증명에 설명을 입력합니다. 용도를 입력하거나 설명이 필요한 경우 입력해주세요.
Jenkins Job 만들기
앞서 이야기한 과정을 따르면 위의 그림과 젠킨스에서 Github을 연동해서 Job을 만들 수 있습니다.
출처: https://7942yongdae.tistory.com/190 [개발자 일지:티스토리]
※ Credentials 에 SSH 등록 설정할 경우
https://hwannny.tistory.com/89
jenkins와 github 연동방식은 다음과 같이
1) 사용자명과 비밀번호
2) SSH
두가지가 존재하지만 첫번째 방식은 보안상 추천되지 않기 때문에 두번째 방식으로 진행하고자 한다.
방법은 간단하다. 비대칭키를 생성해 준 후 public key는 github repository에, private key는 위의 이미지의 Credentials에 등록되면 된다.
먼저 비대칭키를 생성한다.
mkdir /var/lib/jenkins/.ssh ssh-keygen -t rsa -f /var/lib/jenkins/.ssh/key
Passphrase 요구시 모두 Enter를 입력한다.
그러면 다음과같이 .ssh 디렉토리 안에 private key와 public key가 생성된다.
key key.pub
private key 부터 credential에 등록해보자. (.pub가 안붙어있는게 private key 다.)
private key 내용을 복사해둔 후
Credentials Add를 클릭하면 나오는 팝업에서 위와 같이 설정 후 복사한 private key를 기입해주면 된다.
public key도 마찬가지로 복사해둔 후 빌드 배포하고자하는 github repository의
Settings > Deploy keys > Add deploy key 로 진입한다.
위와 같이 입력을 완료하면 아래와 같이 public key 등록이 완료된것을 확인할 수 있다.
아래와 같이 Repository URL에 cloning에 사용되는 URL을 기입해주면된다.
2) 젠킨스 파이프라인 Item 생성 및 설정
Branch Specifier (blank for 'any') : 깃허브 브렌치 값을 입력하면된다.
기본값이 master 이므로 master를 설정해도 된다.
2) 톰켓 설정
톰캣 9.0.44 의 시작페이지
톰캣을 처음 설치하면 위와 같은 화면이 나온다.
여기서 관리자 메뉴를 이용하기 위해서는 몇 가지 작업이 필요하다.
톰캣이 설치된 루트에서 conf 폴더를 연다.
tomcat 폴더
tomcat-users.xml 파일을 편집기로 열어준다.
conf 폴더
tomcat-users 태그 내부의 마지막에 아래와 같이 추가해준다.
username 속성값에 관리자 계정 아이디를, password 속성값에 비밀번호를 입력하면 된다.
<role rolename="admin-gui"/> <role rolename="admin-script"/> <role rolename="manager-gui"/> <role rolename="manager-status"/> <user username="myusername" password="mypassword" roles="admin-gui,admin-script,manager-gui,manager-status"/>
tomcat-users.xml 파일에 관리자 계정을 추가한 모습
tomcat-users.xml 파일을 그대로 덮어씌워 저장한다. 끝.
만약 톰캣을 원격 서버에 이용하고 있다면, 추가적인 설정이 필요하다.
보안을 위해서 톰캣이 설치된 기기에서만 관리자 접근이 가능한데, 이 제한을 지워주어야 한다.
먼저 톰캣이 설치된 폴더에서 tomcat/webapps/host-manager/META-INF/ 경로로 들어가 context.xml 파일을 연다.
webapps 폴더
host-manager
META-INF
context.xml
context.xml 파일을 아래와 같이 주석처리 해준다.
context.xml
저장후 원격 서버에 파일을 덮어쓴다.
/tomcat/webapps/manager/META-INF/ 경로로 들어가면 context.xml 파일이 동일하게 존재한다.
위와 동일하게 주석처리 한 후, 덮어써서 업로드 해주면 된다.
주석처리 한 부분은 관리자로 접근가능한 ip를 제한하는 부분이다.
ip가 127.x.x.x 인 경우에만 관리자 기능을 이용할 수 있도록 되어 있는데, 이를 지워주면 다른 ip에서도 접속이 가능해진다.
출처:
https://bmangrok.tistory.com/entry/Tomcat-톰캣-설치-후-관리자-페이지-들어가기
3) Jenkinsfile 작성
Jenkinsfile
pipeline { agent any stages { stage('Build') { steps { // 여기에 빌드 단계를 추가하세요. } } } post { success { script { withCredentials([usernamePassword(credentialsId: 'macaronics', passwordVariable: 'password', usernameVariable: 'username')]) { sh """ curl -u ${username}:${password} -T /var/jenkins_home/workspace/macaronics/target/ROOT.war "http://192.168.120.137:80/manager/text/deploy?path=/&update=true" """ } } } } }
1.톰켓 관리자 메뉴에서 아이디 비번 설정후 접속을 설정한다.
2.젠킨스 관리 -> Credentials 에서 톰켓 관리자 메뉴접속에 설정한 아이디와 비번을 넣어 생성한다.
젠킨스 Credentials 로 생성한 젠킨스 Credentials 값이 my-credentials-id 라면 이것을 credentialsId: 'my-credentials-id' 로 입력 하면 된다.
필자는 젠킨스에서 macaronics 로 등록 처리 했기 때문에 macaronics 로 적었다.
나머지는 젠킨스 password 로 변수 이름 설정 되어 있으니 그대로 한다., username 도 동일하게 그대로 하면 된다.
passwordVariable: 'password', usernameVariable: 'username'
http://198.156.0.223:7070/manager/text/deploy?path=/&update=true
이 주소는 배포할 서버 의 톰켓 manager 주소를 입력 하면 된다.
withCredentials 블록은 Jenkins 자격 증명을 안전하게 로드하고, username과 password 변수에 사용자 이름과 비밀번호를 저장한다.
다음은 Jenkinsfile 전체 예
pipeline { agent any stages { stage('github-clone') { steps { git branch: 'main', credentialsId: 'github_token', url: 'https://github.com/braverokmc79/eGovFrame-jenkins' } } // stage('Git Pull') { // steps { // git branch: 'main', credentialsId: 'github_token', url: 'https://github.com/braverokmc79/eGovFrame-jenkins' // } // } stage('copy-file') { steps { sh 'cp /var/jenkins_home/egovProps/globals.properties /var/jenkins_home/workspace/macaronics/src/main/resources/egovframework/egovProps' sh 'cp /var/jenkins_home/egovProps/log4j2.xml /var/jenkins_home/workspace/macaronics/src/main/resources' } } stage('build') { steps { sh ''' rm -rf /var/jenkins_home/workspace/macaronics/src/main/webapp/WEB-INF/lib cp -r /var/jenkins_home/lib/ /var/jenkins_home/workspace/macaronics/src/main/webapp/WEB-INF/ rm -rf /var/jenkins_home/workspace/macaronics/target cd /var/jenkins_home/workspace/macaronics /var/jenkins_home/maven/bin/mvn clean install mv -f /var/jenkins_home/workspace/macaronics/target/eGovFrame-jenkins.war /var/jenkins_home/workspace/macaronics/target/ROOT.war ''' } } // 추가적인 스테이지들... } // credentialsId 값은 젠킨스에서 credentials 에 설정한 값 post { success { script { withCredentials([usernamePassword(credentialsId: 'macaronics', passwordVariable: 'password', usernameVariable: 'username')]) { sh """ curl -u ${username}:${password} -T /var/jenkins_home/workspace/macaronics/target/ROOT.war "http://192.168.120.137:80/manager/text/deploy?path=/&update=true" """ } } } } }
github-clone 스테이지: 이 스테이지에서는 ‘https://github.com/braverokmc79/eGovFrame-jenkins’ 주소의 GitHub 저장소를 클론합니다.
이 작업은 젠킨스에서 인증으로 등록한 'github_token’이라는 자격 증명을 사용하여 수행됩니다.
copy-file 스테이지: 이 스테이지에서는 특정 파일들을 복사합니다.
‘globals.properties’ 파일과 ‘log4j2.xml’ 파일을 ‘/var/jenkins_home/workspace/macaronics/src/main/resources’ 디렉토리로 복사합니다.
당연히 /var/jenkins_home/egovProps/ 존재 해야 합니다.
globals.properties 복사하는 이유는 깃허브에는 보안 때문에 당연히 db 접속 정보를 버전관리하면 안되기 때문입니다.
따라서 리눅서 서버내에 존재하는 db 정보를 빌드하기전에 복사합니다.
log4j2.xml 또한 실제 운영 서버에는 error 로그만 표시하기 위해 복사 합니다.
보안상 메이븐 라이브러리를 다운로드 받을 수 없는 환경이 많습니다. 따라서,
다음과정은 메이븐으로 라이브러리를 다운로드 받을 수 없는 환경일경우 직접 라이브러리를 옮기는 작업입니다.
rm -rf /var/jenkins_home/workspace/macaronics/src/main/webapp/WEB-INF/lib
cp -r /var/jenkins_home/lib/ /var/jenkins_home/workspace/macaronics/src/main/webapp/WEB-INF/
build 스테이지: 이 스테이지에서는 프로젝트를 빌드합니다.
먼저, 특정 디렉토리와 파일을 삭제하고, 다른 디렉토리를 복사합니다.
다음은 기존 빌드된 target 디렉토리를 제거하고 macaronics 디렉토리를 이동후 해당 디렉토리내에서 빌드처리 합니다.
rm -rf /var/jenkins_home/workspace/macaronics/target
cd /var/jenkins_home/workspace/macaronics
/var/jenkins_home/maven/bin/mvn clean install
그런 다음, Maven을 사용하여 프로젝트를 빌드하여 생성된 WAR 파일의 이름을 'ROOT.war’로 변경합니다.
post 섹션: 이 섹션에서는 빌드가 성공한 후에 실행되는 작업을 정의합니다.
빌드가 성공하면, 젠킨스에서 등록한 'macaronics’이라는 자격 증명을 사용하여
이 자격증명은 앞서 적은 톰케 관리자 접속 정보 입니다.
‘ROOT.war’ 파일을 특정 서버에 업로드합니다.
4) ssh설정 등록을 하지 않고, 토큰 방식으로 인증설정을 할경우 git clone 시 인증 오류가 날 경우
Dashboard > All >New Item
으로 임의 sample 을 생성한다음 빌드를 하면 다음과 같이
/var/jenkins_home/workspace 디렉토리에 sample 디렉토리가 생성된다.
1. /var/jenkins_home/workspace/젠킨스아이템이름 생성후
2 .git config --global credential.helper store
Git에서 사용자 이름과 비밀번호를 묻지 않도록 설정하려면, Git의 credential.helper 설정을 사용할 수 있다.
이 설정은 Git에게 사용자 이름과 비밀번호를 어떻게 기억하고 사용할지 알려준다.
다음 명령어를 실행하면, Git은 사용자 이름과 비밀번호를 한 번만 물어보고 그 후로는 기억하여 사용한다.
이 명령어를 실행한 후에 git pull이나 git push를 실행하면, 처음에만 사용자 이름과 비밀번호를 물어보고 그 후로는 묻지 않는다.
그러나 이 방법은 사용자 이름과 비밀번호를 평문으로 저장하므로, 보안에 취약할 수 있다.
따라서 이 방법을 사용하기 전에 이 점을 고려해야 합니다
3. git clone https://github.com/braverokmc79/eGovFrame-jenkins.git
4. 깃허브 아이디 및 토큰 입력
5) 메이븐 저장소 위치를 변경할우.
이 포스트에서는 메이븐을 직접 설치 했기때문에 다음 위치에 서
/var/jenkins_home/maven/conf/settings.xml
setting.xml 파일을 열고 수정할 수 있다.
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository>/var/jenkins_home/maven/repository</localRepository> </settings>
다음은 전자정부 3.8 샘플 예
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd"> <localRepository>/var/jenkins_home/maven/repository</localRepository> <pluginGroups> </pluginGroups> <proxies> </proxies> <servers> </servers> <mirrors> <mirror> <id>jahia</id> <mirrorOf>*</mirrorOf> <name>Jahia Repository</name> <url>https://maven.jahia.org/maven2/</url> </mirror> <mirror> <id>maven</id> <mirrorOf>*</mirrorOf> <name>Maven Repository</name> <url>https://repo1.maven.org/maven2/</url> </mirror> <mirror> <id>egovframe</id> <mirrorOf>*</mirrorOf> <name>EgovFrame Repository</name> <url>https://maven.egovframe.go.kr/maven/</url> </mirror> </mirrors> <profiles> <profile> <id>default</id> <repositories> <repository> <id>jahia-release</id> <name>Jahia Release Repository</name> <url>https://maven.jahia.org/maven2/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>maven-release</id> <name>Maven Release Repository</name> <url>https://repo1.maven.org/maven2/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>egovframe-release</id> <name>EgovFrame Release Repository</name> <url>https://maven.egovframe.go.kr/maven/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </profile> </profiles> <activeProfiles> <activeProfile>default</activeProfile> </activeProfiles> </settings>
3.Jenkins home 디렉토리 캐시 파일 관리
도커 젠킨스를 마운트한 디렉토리 /var/jenkins_home 를 보면 젠킨스 캐시파일들이 쌓이는 것을 볼 수있다.
해당 디렉토리 용략을 다음 명령어로 확인해 보자.
du -h --max-depth=1 | sort -rh
Jenkins의 캐시 파일을 삭제해도 Jenkins에 설정된 값들이 모두 사라지지는 않는다.
/var/jenkins_home/caches 디렉토리에 있는 캐시 파일들은 Jenkins가 Git 저장소와 관련된 데이터를 캐시하는 데 사용된다.
이 캐시 파일들은 필요할 때마다 다시 생성된다.
따라서, 이 캐시 파일들을 삭제해도 Jenkins의 작업 설정이나 플러그인 설정 등은 영향을 받지 않는다.
하지만, 캐시 파일을 삭제하면 Jenkins가 다시 캐시를 생성해야 하므로 일시적으로 성능이 저하될 수 있다.
정기적인 정리를 위해 cron 작업을 설정하여 스크립트를 주기적으로 실행할 수 있다.
이 스크립트는 /var/jenkins_home/caches 디렉토리의 오래된 파일을 삭제하는 역할을 한다.
1) 스크립트 작성:
먼저, 오래된 캐시 파일을 삭제하는 bash 스크립트를 작성한다.
이 스크립트는 /var/jenkins_home/caches 디렉토리를 대상으로 하며, 특정 날짜 이전의 파일을 삭제한다.
# vi /var/jenkins_home/jenkins_caches_delete.sh
#!/bin/bash find /var/jenkins_home/caches -type f -mtime +30 -exec rm {} \;
위의 스크립트는 30일 이상 된 파일을 삭제합니다. +30을 다른 숫자로 변경하여 다른 기간의 파일을 삭제할 수 있다.
2) 스크립트 권한 설정:
chmod +x /var/jenkins_home/jenkins_caches_delete.sh
3) Cron 작업 설정:
crontab -e 명령을 사용하여 cron 설정을 열고 다음과 같이 작성한다.
0 0 * * * /var/jenkins_home/jenkins_caches_delete.sh
위의 설정은 매일 자정에 스크립트를 실행하도록 한다.
다른 시간에 스크립트를 실행하려면 cron 표현식을 적절히 조정하면 된다.
댓글 ( 4)
댓글 남기기