안녕하세요 개발팀 김형진입니다. 이번에는 최근에 설정한 CI서버에 관해서 이야기할려고 합니다.
Jenkins를 사용해 CI서버를 구축하였고 아직 개선해야 할 점이 많지만 현재까지 구축한 방법과 앞으로의 개선사항을 애기해 볼까 합니다.
CI 서버의 필요성
일단 이전 방식 같은 경우 개발자PC에서 바로 빌드하고 배포를 하는 방식이였습니다. 수동으로 하는 방식이였고 프로파일에 따른 빌드도 잘 관리가 안되고 있었습니다.
이제 CI 서버가 생김으로써 이제 개발자 PC에서 소스를 빌드해서 배포하지 않고 SCM 서버에 있는 master 브런치에 해당하는 소스를 CI 서버에서 빌드해서 테스트 서버에 배포합니다.
이전 방식은 이번에 새로 MSA방식으로 구축되는 프로젝트에 맞지 않았습니다.
- MSA 방식으로 개발되면서 이전의 하나의 애플리케이션만 배포만 하면 되는 상황에서 여러개로 나뉜 프로젝트를 배포해야 하는 데 여러개의 프로젝트를 매번 수동으로 한다는 거는 불편하기도 했고 누가 언제 배포했는 지 알 수 없습니다.
- 개발 PC에서 빌드 되어서 배포되기 때문에 배포되는 소스의 일관성이 없습니다. 다른 사람이 적용시킨 소스가 누락되어서 배포되는 경우가 생길 수 있습니다.
Jenkins 설치 방법
전 AWS에 Docker로 설치를 하였습니다. 개발을 Maven으로 하고 있기 때문에 여기에 대한 설정까지 애기하겠습니다.
운영환경은 AWS 인스턴스는 t2.small, 운영체제는 ubuntu18입니다.
-
apt-get을 업데이트하고 Docker를 설치합니다.
# apt-get 업데이트 sudo apt-get update # docker 설치 sudo apt install docker
-
Jenkin를 설치합니다.
📌여기서 주의 하실 점이 있습니다. 실행하실 이미지 이름을 jenkins가 아닌 jenkins/jenkins로 하셔야 합니다. jenkins는 이전에 사용했던 이미지로 현재는 사용되지 않고 있습니다. 이걸로 설치를 하시면 플러그인들이 설치가 안됩니다. 그럴 경우 수동으로 jenkins를 업데이트하시고 플러그인을 수동으로 찾아서 설치해주셔야 합니다. 예전에 제가 처음 설치할 때 모르고 했다가 삽질을 했는 데 이 글을 보시는 분은 그럴 일이 없도록 하시기 바랍니다.
📌그리고 하나 더 애기를 하자면 Jenkins 안에 JDK 버전이 11로 하시고 싶은 분은 jenkins/jenkins:jdk11 이미지를 사용하시면 됩니다.
# Jenkins 설치 # jenkins는 옛날 버전 -> jenkins/jenkins:lts 로 설치 해야 함 docker run -d -p 8080:8080 -v /jenkins:/var/jenkins_home --name jenkins -u root jenkins/jenkins:lts docker run -d -p 8080:8080 -v /jenkins:/var/jenkins_home --name jenkins -u root jenkins/jenkins:jdk11
-
Jenkins 암호 알아내기
암호 같은 경우 처음 Jenkins에 접속할 경우 필요합니다. 다른 곳에 저장해 놓습니다.
# 암호 알아내기 docker logs jenkins
-
이제 http://아이피주소:8080 에 접속하시면 Jenkins에 접속이 되실 겁니다.
Maven 프로젝트 빌드 설정
회사에서 프로젝트 관리를 Maven으로 설정했기 때문에 CI서버에 Maven 빌드 설정과 Nexous에 리포지토리를 사용하기 때문에 해당 리포지토리를 볼 수 있게 설정을 먼저 하겠습니다.
-
Jenkins 컨테이너 접속
# 컨테이너 접속 sudo docker exec -it jenkins /bin/bash
-
Maven 설치
# apt 업데이트 apt update # 메이븐 설치 apt install maven
-
넥서스 저장소를 볼 수 있게 settings.xml 파일 수정하기
settings.xml# 혹시 모르니 settings.xml 백업해놓기 cp /usr/share/maven3/conf/settings.xml ~/.m2/settings.xml # 파일 수정 vi /usr/share/maven3/conf/settings.xml
<?xml version="1.0" encoding="UTF-8"?> <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"> <mirrors> <mirror> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://nexus.effectmall.com/repository/maven-public/</url> </mirror> </mirrors> <servers> <server> <id>nexus</id> <username>알고싶으세요?</username> <password>알려줄 수 없어요</password> </server> </servers> </settings>
소스저장소(Git)에서 소스 가져오기
Git에서 소스를 가져는 설정은 어렵지 않다.
-
젠킨스 구성에 소스 코드 관리 메뉴로 내려가서 Git 라디오 버튼을 선택한다.
Credentials 옆에 Add 버튼을 눌러 Git 아이디와 패스워드를 설정하면 된다.
‼️ 하지만 저 위에 방법은 현재 설정된 프로젝트에서 사용할 수 없었다.
왜냐하면 왼쪽에 프로젝트 구조를 보면 하나의 Git에 모든 프로젝트가 전부 들어가 있는 구조이다.
이 방법이 좋은 방법이 아니라는 것을 알지만 팀이 마이크로 서비스를 처음 도입하는 것도 있고 이 방식이 마이크로 서비스의 구성을 좀 더 알기 편하다고 생각해서 이런 구조를 만들었고 개발하기에도 편하다고 생각을 했다.
하지만 이렇게 해버리는 바람에 위와 같은 방법을 사용하게 되면 프로젝트 마다 모든 소스를 가져오는 사태가 발생해 버린다.
첫번째로 생각한 방법
처음에는 파라미터로 구분해서 빌드를 하고 배포를 하는 방법을 생각했다. 아래와 같은 방식이다.
하지만 이 방법은 배포를 했을 때 어떤 프로젝트를 배포했는 지 알기 어렵다는 생각이 들어 손이 좀 많이 가지만 다른 방법을 선택했습니다.
두번째 방법
각각 프로젝트 별로 젠킨스 아이템을 만드는 데 Git을 설정해서 필요한 파일들만 Pull 받는 방식입니다.
-
먼저 프로젝트에 해당하는 젠킨스 아이템을 만듭니다.
-
Jenkins 컨테이너에 접속 해당하는 젠킨스 아이템 폴더로 이동합니다.
# 아래 경로로 가면 되고 해당 폴더가 없다면 만들면 된다. cd var/jenkins_home/workspace/{Jenkins_item 이름}
-
원하는 파일만 받을 수 있게 Git을 설정합니다.
Git에 sparseCheckout 설정을 true로 설정하면 소스의 일부만 받을 수 있게 됩니다.
# Git 초기화 git init # *sparse Checkout* 이 가능하도록 설정한다. git config core.sparseCheckout true # 저장소 주소 설정 git remote add -f origin {저장소 주소} # checkout 하기 원하는 파일이나 폴더를 *.git/info/sparse-checkout* 파일에 작성합니다. 폴더일 경우 자동으로 하위 폴더가 포함됩니다. echo "microservices/company" >> .git/info/sparse-checkout # 이제 받으시면 됩니다. git pull origin master
-
비밀번호를 매번 입력할 수 없기 때문에 캐시설정을 해줍니다.
# Credential 정보 저장 git config credential.helper store # 캐시 저장 git config credential.helper cache # 캐싱 시간 설정 --timeout 뒤에 붙는 3600이 시간입니다. 단위는 초입니다. git config --global credential.helper 'cache --timeout 3600' # 모든 프로젝트에 적요 git config credential.helper store --global
여기 까지 하셨다면 프로젝트에서 원하는 파일만 받을 수 있고 매번 아이디와 패스워드를 입력하지 않아도 됩니다.
이제 각각의 프로젝트 별로 빌드을 해줄 수 있습니다.
빌드 후에 API Test 서버에 배포할 수 있습니다.
Source : 배포할 파일
Remove prefix: 배포할 파일에서 삭제할 경로
Remote Directory: 배포할 경로
Exec Command: 파일 복사 후에 실행될 명령어
Docker 설정
프로젝트 별로 Dockfile과 docker-compose-test.yml 파일을 구성했습니다.
Dockerfile
FROM openjdk:12.0.2
EXPOSE 7101
ADD ./target/*.jar company.jar
ENTRYPOINT ["java","-jar","/company.jar"]
docker-compose-test.yml
version: '2.1'
services:
company:
build: ./
mem_limit: 300m
networks:
- my-network
environment:
- SPRING_PROFILES_ACTIVE=test
networks:
my-network:
name: my-network
배포 후 실행되는 명령어를 보면 docker-compose-test.yml 파일을 실행시켜 Dockerfile을 바탕으로 새로운 이미지 파일을 만들고 서버를 재시작합니다.
Nexous에 배포되는 라이브러리 설정
해당프로젝트 pom.xml 파일에 라이브러리를 올릴 저장소를 설정한다. 프로파일 별로 라이브러리 저장소를 따로 사용할 꺼기 때문에 프로파일 설정에 저장소 설정을 넣습니다.
<profile>
<id>test</id>
<properties>
<env>test</env>
<spring.profiles.active>test</spring.profiles.active>
</properties>
<distributionManagement>
<repository>
<id>nexus</id>
<name>Releases</name>
<url>http://{저장소 주소~~~}/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus</id>
<name>Snapshot</name>
<url>http://{저장소 주소~~~}/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
</profile>
그리고 젠킨스에서 빌드하고 deploy를 해주면 된다.
앞으로 해야 할 것들
- Maven 빌드 플러그인 찾아보기
- 파이프라인 적용하기
- 자동화 테스트 적용하기
ETC
전직장에서 잘 구축된 Jenkins에 이미 작성된 스크립트 파일만 사용하다가 직접 구축하고 이전에 사용했던 거를 하나씩 떠올리면서 하자니 생각보다 힘들 다. 그냥 메뉴얼 대로 설치하고 대에~충 배포만 하면 될 줄 알았는 데 SE팀... 고마운 존재였구나 생각이 듭니다.
댓글