방구석 컴퓨터/방구석 DevOps / / 2023. 12. 15. 13:44

4. git 설치와 Jenkins 연동

반응형

젠킨스란?

소스 코드 레포지토리에 대한 지속적인 통합(CI)과 지속적 배포(CD) 환경을 구축하기 위한 도구입니다.

 

그럼 지속적인 통합과 배포란 무엇일까요?

쉽게 말해서 개발된 내용을 통합하고 빌드하고 배포하는 모든 과정을 시스템화시키는 것입니다.

 

좀 더 자세한 설명은 아래 링크를 참고해 주세요

https://krksap.tistory.com/1377

 

빌드란? 그리고 Jenkins(젠킨스)란? 써야 하는 이유

개요 서버 어플리케이션에 기능을 추가 하려면 개발자가 개발자 노트북에서 개발을 완료 하고 테스트까지 한 다음에 이상이 없으면 사용자가 사용할 수 있게 수정된 내용을 서버에 반영해야 합

krksap.tistory.com


 

일단 git을 설치하기 위한 명령어를 실행합니다.

sudo dnf install git

 

그리고 git이 제대로 설치되었는지 확인해 봅니다.

git --version

 


 

git이 설치되었으면 이제 본격적으로 젠킨스와의 연동을 해보겠습니다.

 

저는 앤서블을 통해 젠킨스에서 배포를 진행할 예정입니다.

 

그럼 앤서블은 무엇이냐?

앤서블은 플레이북이라는 곳에 빌드 및 배포를 위한 스크립트를 작성해 놓으면 필요할 때마다 실행시켜서 설정해 놓은 일련의 과정대로 빌드와 배포가 진행되는 것입니다.

 

예를 들어 제가 앤서블 플레이북에

A라는 디렉터리 만들고,
A.git에서 소스코드 가져와서
빌드한 다음에 8080 포트에 서비스되게 배포해 줘

 

라고 스크립트를 작성해 놓고 젠킨스에 연동시켜 놓으면 git에 A의 소스코드를 올려놓고 젠킨스를 실행시키기만 하면 일련의 과정을 거쳐 배포까지 완료되게 됩니다.

정말 편하죠?

 

그래서 우선 앤서블 스크립트를 작성해야 합니다.

 

서비스명을 apple이라고 가정하고 진행해 보겠습니다.

 

저의 앤서블 프로젝트 폴더의 구성은 아래와 같습니다.

apple
│  hostfile
│  apple.yaml

└─group_vars
        all
        apple

 

hostfile에는 빌드를 위해 접근할 실제 서버의 IP 정보를 저장합니다.

# hostfile: 접근할 서버의 IP 정보

[apple]
X.X.X.X

 

apple.yaml : 실제 스크립트 파일. 이름은 임의대로 지어도 됩니다.

밑에 적은 스크립트의 대략적인 내용은

1. 혹시나 이전에 사용했던 빌드 디렉터리가 있으면 제거
2. git에서 브랜치를 clone 해서 가져올 디렉터리 생성
3. git에서 수정된 소스 clone
4. 가져온 소스 빌드
5. 현재 서비스 중인 서버 중지시키고 해당 디렉토리 삭제
6. 새로운 디렉토리 생성 후 4번에서 빌드된 파일 이동
7. 새 빌드 파일 서버 시작
8. 빌드에 사용했던 디렉토리 삭제 (이미 빌드된 파일은 옮겼으니 삭제해도 괜찮습니다)
9. 서비스 상태 체크

 

위와 같습니다.

그리고 위의 내용을 구현한 스크립트가 아래의 내용입니다.

---
- hosts: apple
  tasks:

    - name: 기존 빌드 디렉토리 제거
      file:
        path: '{{ build_dir }}'
        state: absent
      tags:
        - restart-with-build

    - pause: seconds=2
      tags:
        -restart-with-build

    - name: 빌드 디렉토리 생성
      file:
        path: "{{ build_dir }}"
        state: directory
      tags:
        - restart-with-build

    - name: Git 소스의 main 브랜치 복제
      shell: git clone -b main https://{{ git_token_name }}:{{ git_token }}@github.com/apple/apple_{{version_name}}.git
      when: version_name == "korea"
      args:
        chdir: "{{ build_dir }}"
      tags:
        - restart-with-build

    - pause: seconds=2
      tags:
        - restart-with-build

    - name: 스프링 빌드
      shell: /opt/maven/bin/mvn -f {{ build_dir }}/apple_{{version_name}}/pom.xml clean install -DskipTests
      args:
        chdir: "{{ build_dir }}"
      tags:
        - restart-with-build

    - pause: seconds=2
      tags:
        - restart-with-build

    - name: 서버 중지
      shell: pkill -ef apple_{{version_name}}
      ignore_errors: yes
      args:
        chdir: "{{ home_dir }}"
      tags:
        - restart-with-build
        - startup
        - shutdown

    - pause: seconds=5
      tags:
        - restart-with-build
        - startup
        - shutdown

    - name: 기존 디렉토리 제거
      file:
        path: "{{ home_dir }}/tobot_{{service_key}}"
        state: absent
      tags:
        - restart-with-build

    - pause: seconds=5
      tags:
        - restart-with-build

    - name: 디렉토리 생성
      file:
        path: "{{ home_dir }}/tobot_{{service_key}}"
        state: directory
      tags:
        - restart-with-build

    - pause: seconds=2
      tags:
        - restart-with-build

    - name: 빌드 파일 이동
      shell: mv {{ build_dir }}/apple_{{version_name}}/target/apple_{{version_name}}-1.0.0.war {{ home_dir }}/apple_{{version_name}}/apple_{{version_name}}.war
      args:
        chdir: "{{ home_dir }}"
      tags:
        - restart-with-build

    - pause: seconds=2
      tags:
        - restart-with-build

    - name: 서버 시작
      shell: nohup java -jar apple_{{version_name}}.war --spring.profiles.active=test 1>/dev/null 2>&1 &
      args:
        chdir: "{{ home_dir }}/apple_{{version_name}}"
      tags:
        - restart-with-build
        - startup

    - pause: seconds=2
      tags:
        - restart-with-build
        - startup

    - name: 빌드 디렉토리 제거
      file:
        path: "{{ build_dir }}/apple_{{version_name}}"
        state: absent
      tags:
        - restart-with-build

    - name: 서비스 상태 체크
      shell: ps -ef | grep -E "java"
      args:
        chdir: "{{ home_dir }}"
      tags:
        - restart-with-build
        - startup
        - shutdown

 

group_vars : 사용할 여러 변수 정보들을 모아놓은 디렉토리

all : git에 접근하기 위한 토큰 정보

apple: 기타 각종 변수. 이름은 임의대로 설정

 

앤서블 관련 좀 더 자세한 설명은 아래 링크를 참고해 주세요

https://wikidocs.net/book/6350

 

개발자가 앤서블(Ansible) 시작하기

개발 환경을 구축할 때 동일한 작업을 반복해야 하는 경우가 많습니다. 파일 복사, 설정 변경, 모듈 설치 등을 반복할 수 있습니다. OS가 다르거나 버전이 달라지는 경우 …

wikidocs.net

 

이제 이렇게 앤서블을 생성한 뒤에 젠킨스에 올려야 하는데요

 

미리 다른 비슷한 프로젝트가 있다면 복사해 와서 생성하는 것도 좋습니다.

 

만약 그렇지 않다면 파라미터들을 생성한 뒤에 git에 있는 ansible 주소와 연동해 주면 됩니다.

 

 

 

좀 더 자세한 내용은 아래 링크를 참고해 주세요

https://beaniejoy.tistory.com/101

 

[Jenkins] Ansible plugin 사용해보기(ansible 설치부터 pipeline까지 작업)

지난 게시글 중에 Jenkins 서버를 설치하고 Spring boot project 대상으로 간단하게 테스트, 빌드까지 해보는 Jenkins pipeline을 적용해보는 글이 있었습니다. 이번 게시글을 읽기 전에 먼저 읽어보시는 것

beaniejoy.tistory.com

 


참고

https://blogger.pe.kr/1078/

 

리눅스에 git 설치하고 github와 연동하기 – taeho's life logger

리눅스에 git 설치, git과 github 연동, vscode에서 ssh접속하여 git 연동하기

blogger.pe.kr

https://krksap.tistory.com/1377

 

빌드란? 그리고 Jenkins(젠킨스)란? 써야 하는 이유

개요 서버 어플리케이션에 기능을 추가 하려면 개발자가 개발자 노트북에서 개발을 완료 하고 테스트까지 한 다음에 이상이 없으면 사용자가 사용할 수 있게 수정된 내용을 서버에 반영해야 합

krksap.tistory.com

 

반응형

'방구석 컴퓨터 > 방구석 DevOps' 카테고리의 다른 글

3. Nginx 설치  (0) 2023.12.14
2. 메이븐 설치  (0) 2023.12.14
1. 리눅스 자바 설치 - JDK 17  (0) 2023.12.13
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유