Jenkins 설치부터 Github Repository 자동 배포 설정까지 정리

HelloSesang·2023년 4월 6일
0

1. Jenkins 설치

  • Jenkins 공식 홈페이지에서 자신의 서버 운영체제와 일치하는 설치 매뉴얼을 그대로 따라하면 쉽게 설치할 수 있다.

    본 포스트는 Ubuntu 22.04 운영체제 위에 설치를 진행했으며, Jenkins 설치 가이드 중 openjdk-11-jre를 설치하라고 한 것을 openjdk-17-jdk로 변경해서 설치했다.
    변경한 이유는 개발한 애플리케이션이 Java 17 버전으로 작성되었다는 점과 추후 배포할 때 JRE뿐만 아니라 JDK에 있는 파일들도 필요하다는 점 때문이다.

2. Jenkins 초기화

  1. 설치하면 자동으로 8080 포트에서 실행되고 있으며 ${서버IP}:8080으로 접근하면 Jenkins 페이지를 볼 수 있다.

  2. 안전한 설치를 위해서 설치 과정에서 서버에 생성해 놓은 암호 파일에서 비밀번호를 꺼내서 입력하라고 가이드를 하며 그대로 진행해준다.

    • 아래 명령으로 비밀번호를 찾는다.

    • 찾은 비밀번호를 Jenkins 페이지에 입력하고 Continue를 눌러서 넘어간다.

  3. 다음 페이지로 넘어가면 플러그인인을 어떻게 설치할지에 대해 묻는데 그냥 추천해주는거 그대로 설치하는걸로 선택했다.

  4. 선택하면 플러그인 설치가 진행되니 끝날때까지 기다린다.

  5. 설치가 끝나면 Jenkins 접속 계정을 생성하는 페이지가 나오며 원하는대로 만들어주면 된다.

  6. 계정 생성 페이지 다음에는 Instance Configuration 페이지가 나오는데 입력값 그대로 두고 그냥 Save and Finish로 넘어가겠다. 필요한건 추후 변경해주면 된다.

  7. 설정이 끝났고 Jenkins Dashboard에 접속할 수 있게 될 것이다.

3. Jenkins에서 Github Repository 접근을 위한 토큰 생성하기

  1. 애플리케이션을 빌드하고 배포하려면 먼저 Github 저장소에 Jenkins가 접근 가능해야한다.
  2. 접근을 가능하게 만들기 위해서는 Github에서 토큰을 만들고 이를 Jenkins에 저장해야한다.
  3. Github > 우측 상단 유저 아이콘 > Settings > Developer settings > Personal access tokens 메뉴로 이동한다.
  4. Generate new token 버튼을 눌러서 토큰 생성 페이지로 간다.
  5. 토큰을 생성해줘야하는데 배포 대상 Repository에 대한 접근 권한이 생기도록 Resource Owner, Repository access 등을 적절히 설정해서 만들어줘야한다.
    • 포스트 작성 시에는 개인 Repository가 아닌 Organization의 Repository가 대상이라 Resource Owner에 Organization을 선택했다.
    • Repository access는 private Repository가 대상이라서 All repositories로 선택했다.
    • permissions는 Actions와 contents를 read-only로 설정했다.
  6. 생성 완료를 누르면 토큰 값을 확인할 수 있다.

4. Jenkins에 Github 접근을 위한 토큰 설정 및 테스트

  1. Jenkins Dashboard에서 새로운 Item을 클릭하고, Freestyle project를 하나 생성한다.
  2. Item의 구성(설정)으로 들어간다.
  3. Github project 체크박스 활성화하고 Project url에 배포 대상 repository의 github URL을 적어준다.
  4. 소스 코드 관리 > Git 체크박스 활성화하고 Repository URL에 아까와 같이 배포 대상 repository의 github URL을 입력한다.
  5. 아래 Credentials가 맞지 않으면 위의 이미지 처럼 에러문구가 뜬다. Add 버튼 > Jenkins 버튼을 눌러서 Credential 생성 페이지로 이동한다.
  6. username은 github 아이디, password는 이전에 생성했던 토큰 값을 넣어줘서 Credential을 생성한다.
  7. 정상적으로 됐다면 에러 문구가 안나올 것이고, 이는 Github Repository의 소스코드를 가져올 수 있게 됐다는 것을 의미한다.

5. Github to Jenkins Webhook 설정

  1. Github > 배포 대상 Repository > Settings > Webhooks 페이지로 간다.
  2. Payload URL을 '{Jenkins 서버IP:PORT}/github-webhook/'로 적은 후 저장한다.
  3. 저장 후 Recent Deliveries 탭에서 Webhook을 보내고 정상적으로 되는지 확인한다.
  4. Github에서 Webhook을 보내고 Jenkins가 수신하는 것까지 완료된 것이고 Webhook을 받았을 때 자동으로 Jenkins Job이 실행되도록 하려면 Jenkins Job 설정에서 Github hook trigger for GITScm polling 체크박스를 활성화해주면 된다.

6. Application 빌드하기

이전 단계까지 진행함으로써 Github에서 Webhook을 날리면 Jenkins가 Job을 실행시키고 Job이 Github의 소스코드를 다운받을 수 있는 것까지 가능해졌다. 이후에는 다운받은 소스코드를 빌드해서 결과물을 생성하도록 해줘야한다.

  1. 본 포스트 작성 과정에서는 Spring Boot Application이 배포 대상이었고 빌드 도구로 Maven을 사용하였으므로 JDK, Maven을 Jenkins 서버에 설치해줘야했다.
  2. JDK와 Maven, Gradle과 같은 빌드 도구의 설치는 각자 운영체제의 패키지 관리 도구 등을 사용해서 설치하도록 한다.
  3. 설치 후 Jenkins에 해당 도구들의 위치를 알려줘야한다. Jenkins Dashboard > Jenkins 관리 > Global Tool Configuration으로 이동한다.
  4. JDK, Maven, Gradle, Git과 같은 항목들이 있으며 Add 버튼을 눌러 각각의 위치를 설정해준다. Git의 경우는 자동으로 설정되어 있는데 안되어있다면 Git도 설정해줘야한다.
  5. 설정 이후 Jenkins Job의 설정에서 Build 스크립트를 작성해주고 지금 빌드 버튼을 눌러서 성공하는지 확인한다.(빌드 스크립트 작성에 대한 설명은 생략한다)
  6. Jenkins workspace 폴더에 원하는 결과물(Jar파일)이 생성됐는지 확인한다.
    • Jenkins workspace는 Jenkins 홈 디렉토리/workspace 이다.
    • Jenkins workspace는 Jenkins Dashboard > Jenkins 관리 > 시스템 설정 > 맨위 홈 디렉토리 란에서 확인할 수 있다.

7. Jenkins to 배포 서버 SSH 접근 설정

배포 과정에서 파일 접근 권한 문제가 발생하는 경우가 있는데 이는 Jenkins workspace에서 build 결과물이 생성되는 target 디렉토리가 Jenkins 계정의 소유가 아닌 다른 계정의 소유여서 발생하는 것이다.
이 경우 target 디렉토리의 소유자를 Jenkins 계정으로 바꿔주면 된다. 단순히 Jenkins 계정으로 로그인해서 target 디렉토리를 지우고 다시 생성해준 이후 다시 build해도 해결된다.

  1. 본 포스트에서는 원격 서버에 배포 시 SSH로 원격 서버에 접속해서 배포를 진행했다.
  2. SSH 접속에 필요한 Jenkins 플러그인 Publish over SSH를 설치한다.
    • Jenkins Dashboard > Jenkins 관리 > 플러그인 관리 > Available plugins로 이동
    • Publish over SSH 검색 후 체크박스 활성화하고 다운로드 및 설치 버튼을 누른다.
  3. Jenkins 서버에서 배포 대상 서버에 SSH로 접속하려면 인증을 위한 Key 설정을 해줘야한다.
    • Jenkins 서버에서 Jenkins 계정으로 로그인한 상태에서 'ssh-keygen -t rsa -m PEM'명령으로 비대칭키를 생성한다.
    • PEM Format으로 키를 생성해야지만 동작한다.
    • 중간 중간 요청하는 입력은 설명하려면 길어지니 그냥 엔터치고 넘어가도록 하자.
    • Home디렉토리 > .ssh 디렉토리에 id_rsa, id_rsa.pub가 생긴 것을 확인할 수 있는데 id_rsa는 비밀키 id_rsa.pub는 공개키이다.
    • 그 중 공개키인 id_rsa.pub의 내용을 배포 대상 서버로 옮긴후 배포 대상 서버의 홈디렉토리 > .ssh > authorized_keys 파일에 아래 명령어로 덧붙여준다.

      cat {.pub 파일} >> {authorized_keys 파일}

  4. Jenkins Dashboard > Jenkins 관리 > Configure System > Pushlish over SSH로 이동
  5. Path to Key에 Jenkins 서버 내 생성한 비밀키 위치를 지정해준다.
  6. 그 아래 추가 버튼을 누르면 SSH로 접근할 대상 서버 정보를 입력하는 칸이 생성되는데 이를 기입한다.
  7. Test Configuration버튼을 눌러서 정상적으로 되는지 확인한다.

    우분투 22.04에서는 public 키를 이용한 인증 설정이 disabled 되어 있어서 추가로 설정이 더 필요했다.
    배포 대상 서버의 /etc/ssh/sshd_config 파일 가장 끝에 아래와 같이 2줄을 추가함으로써 문제를 해결했다.
    PubkeyAuthentication yes
    PubkeyAcceptedKeyTypes +ssh-rsa

8. Application 배포 및 실행

글이 너무 길어져서 힘든 관계로 짧게 설명하고 마무리하겠다.

  1. Jenkins Job 설정으로 이동한다.
  2. Build Steps으로 이동해서 Add build step을 눌러서 Send files or execute commands over SSH를 선택한다.
  3. Maven 빌드 이후 SSH로 전송할 파일과 전송할 위치 그리고 전송 이후 실행할 명령어 등을 설정할 수 있다.
  4. 아래 이미지를 참고해서 작성 후 Jenkins Job을 실행시키고 정상 동작을 확인하면 자동 배포 설정 끝이다.
profile
개인 기록용 블로그입니다. 잘못된 정보가 있거나 내용 이해가 어려운 경우 댓글로 알려주시면 감사하겠습니다 :)

0개의 댓글