새소식

⇥ DevOps Tech 🙋🏻‍♀️/✏️ Jenkins

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 등의 프로젝트는 약간의 수정이 필요하다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.