Jenkins 에서 빌드한 artifact 를 Ansible 로 넘기는 방법 [nginx file hosting]
이전에 젠킨스에서 git clone, build 를 하는 방법에 대해 포스팅했었다.
2023.10.11 - [✏️ Jenkins] - Jenkins Pipeline 으로 git clone , build 수행하기
Jenkins Pipeline 으로 git clone , build 수행하기
Jenkins Pipeline 으로 CI/CD 를 구축할 때 가장 기본적으로 repository 에서 git 을 clone 하여 build 하는 과정은 반드시 존재한다. 이 과정이 CI (Continuous Integration) 으로 지속적인 통합이라고 할 수 있다. 즉
jjoyling.tistory.com
여기서 빌드된 아티팩트는 젠킨스의 workspace 에 존재하게 될 뿐이고, 배포 시 어떻게 사용해야 할지 알아보려고 한다.
그림으로 보면 이런 느낌인데, CI Server 에서 빌드한 아티팩트(war 혹은 jar) 를 artifact 저장소로 이동시킨 후 배포 시 접근하여 사용하는 방식으로 구성하려고 한다.
많은 프로젝트가 빌드하고 배포가 진행되면 artifact 의 용량도 커지게 될 것이다. 그래서 별도로 CI Server 에 disk 를 mount 하게 되는데 필수 과정은 아니기 때문에 여기서는 생략 하고 진행하려고 한다. 별도로 disk 를 가지고 있거나 VM 에 할당하였다면 linux mount 명령어를 통해 앞으로 진행하게 될 path 로 disk 를 마운트 해주면 된다.
nginx 설치
빌드 한 바이너리를 사용하기 위해선 먼저 nginx 를 설치해야 한다. nginx 의 버전은 상관 없으니 linux 의 패키지 관리자를 통해 설치 해주면 된다.
보통은 /etc/nginx 경로로 설치가 된다.
apt update
apt install nginx
nginx 가 사용되는 이유는 artifact storage 로 지정한 path 의 파일들을 호스팅하기 위해서 설치하였다.
nginx 설정
nginx 설정을 추가하는 방법은 여러가지가 있는데 여기서는 conf.d 에 설정을 추가하는 방법을 사용하였다.
먼저 file 호스팅 정보가 담긴 conf 파일을 conf.d 내부에 생성해준다.
vi /etc/nginx/conf.d/jenkins-build.conf
server {
listen 80;
server_name ip;
rewrite_log off;
root /opt/build-java;
access_log /var/log/nginx/jenkins-build/access.log;
error_log /var/log/nginx/jenkins-build/error.log;
location / {
autoindex on;
sendfile on;
}
}
server_name 에 접속 할 ip 를 입력해준다. 별도로 domain 을 할당 받았다면 domain 을 입력해줘도 된다.
root 옵션에 file listing 이 될 경로를 지정해준다. 위 설정을 적용시킨다면 ip:80 에 접근한다면 /opt/build-java 의 file 이 호스팅 된다.
그에 관련된 로그들은 /var/log/nginx/jenkins-build 디렉토리에 저장되는 내용을 담고 있다.
설정파일을 작성했으면 nginx에서 해당 설정파일을 적용할 수 있도록 작성해줘야 한다.
vi /etc/nginx/nginx.conf
....
include /etc/nginx/conf.d/*.conf;
nginx.conf 설정 파일 하단에 conf.d 디렉토리 내부의 *.conf 파일들을 포함하라는 코드를 작성해줘야 한다.
그 후 nginx 를 재시작 해주면 된다.
systemctl restart nginx
이제 작성한 ip:port 로 접속해서 /opt/build-java 디렉토리의 파일이 호스팅 되는지 확인해보면 된다.
이런식으로 Index of / 밑에 내부 파일들이 보인다면 정상적으로 파일이 호스팅 되는 것이다. 이제 해당 주소로 파일들에 접근이 가능하다.
Ansible 에서도 해당 주소로 바이너리를 받을 수 있고, wget 등의 패키지를 사용해서도 바이너리를 받을 수 있는 것이다.
이제는 젠킨스에서 빌드 한 후 해당 디렉토리로 아티팩트를 전송시키고, 배포할 때 해당 주소에 접근해서 배포할 수 있도록 구성이 완료되었다.
Jenkins 설정
젠킨스 파이프라인 에서는 빌드한 아티팩트를 /opt/build-java 경로로 옮겨주기만 하면 된다.
def gradle_artifacts() {
sh """
#!/bin/bash -e
## global variables
artifact=/opt/build-java/$profile/$project
target=build/libs
jar=\$(cd \$target && if [ -f *.war ]; then ls *.war | head -n 1; else ls *.jar | grep -v 'plain' | head -n 1; fi; )
## init
[ -d "\$artifact" ] || mkdir -p \$artifact
## copy
mv -f \$target/\$jar \$artifact
"""
}
gradle_artifacts 함수를 작성하였는데 opt/build-java 경로 밑에 profile, project 를 통해서 디렉토리를 나누어 주었다.
해당 변수들은 jenkins pipeline 에서 사용하는 변수들이고 다른 프로젝트 들과 겹치지 않기 때문에 고유한 경로를 가질 수 있다.
빌드하게 되면 workspace/project 경로의 build/libs 에 artifact 가 생성되기 때문에 해당 경로에서 war 혹은 jar 를 찾는다.
jar 일 경우엔 plain 을 포함한 파일은 스킵하도록 grep -v 를 넣었는데 plain jar 는 빌드 시 생성되는 의존성을 포함하지 않은 클래스와 리소스 파일만을 담고 있는 jar 기 때문에 배포 시 사용할 수 없다. 그래서 제외하고 파일을 찾아서 /opt/build-java 경로로 이동시켜 준다.
jenkins 설정까지 끝났다면 이제는 아티팩트가 저장소로 이동되는 과정까지 파이프라인 구성이 완료되었다.
이후 부터는 ansible 의 role 을 구성해서 CD 단계로 넘어가야 한다.
물론 해당 포스팅은 단일 gradle 프로젝트 설정만을 가지고 작성하였기 때문에 maven, multi project, npm 등의 프로젝트는 약간의 수정이 필요하다.
'⇥ DevOps Tech 🙋🏻♀️ > ✏️ Jenkins' 카테고리의 다른 글
AWS CodeBuild Plugin 사용하여 AWS 연동하기 (0) | 2023.10.12 |
---|---|
Jenkins Pipeline 으로 git clone , build 수행하기 (0) | 2023.10.11 |
Bitbucket 과 AWS CodeCommit Jenkins를 이용한 Mirroring (0) | 2023.10.10 |
Jenkins 와 Ansible Tower (AWX) 연동, API 사용 (0) | 2023.10.10 |
BACKUPSET 을 이용한 JENKINS 복구 방법 (1) | 2022.12.26 |
댓글
이 글 공유하기
다른 글
-
AWS CodeBuild Plugin 사용하여 AWS 연동하기
AWS CodeBuild Plugin 사용하여 AWS 연동하기
2023.10.12 -
Jenkins Pipeline 으로 git clone , build 수행하기
Jenkins Pipeline 으로 git clone , build 수행하기
2023.10.11 -
Bitbucket 과 AWS CodeCommit Jenkins를 이용한 Mirroring
Bitbucket 과 AWS CodeCommit Jenkins를 이용한 Mirroring
2023.10.10 -
Jenkins 와 Ansible Tower (AWX) 연동, API 사용
Jenkins 와 Ansible Tower (AWX) 연동, API 사용
2023.10.10