Yeji's Tech Notes
article thumbnail
반응형

 

Introduce

여행 모임 프로젝트(TGather)를 개발하면서 아키텍쳐와 배포 프로세스에 관해 의견을 나눠보다 제가! Jenkins를 이용해서 직접 자동 배포화 하는 과정에 대해서 정리 해봤습니다! 이번 글에서는 Docker Hub까지 배포하는 과정만 다뤄봤습니다. 

 

젠킨스(Jenkins)는  레포지토리에 대한 지속적인 통합(Continuous itegration,CI)과 지속적인 배포(Continuous delivery, CD) 환경을 구축해주는 도구로 빌드, 테스트, 배포 프로세스를 자동화하여 소프트웨어 품질과 개발 생산성을 높혀줍니다

 

이번 글에서 사용할 도구 (Github, Jenkins, Docker, Docker Hub)

 

credentials 세팅

우선, 저희가 프로젝트를 clone 받거나 push 일련의 작업을 할 때 자격 인증을 합니다. 이러한 자격 인증을 자동적으로 해주기 위해서 Jenkins에 credential 설정하는 것을 먼저 하겠습니다

 

github 토큰 발급

Jenkins Credential을 위해서는 내 계정의 token을 입력해줘야 합니다. Jenkins 전에 우선 github을 먼저 들어가줍니다.

내 계정 -> Setting -> Developer Settings -> Generate new token을 클릭해 token을 생성해줍니다.

token 생성할 때 classic 과 Fine-grained tokens가 있는데 저는 기존에 쓰던 방법으로 token을 생성해보겠습니다.

저는 Select scopes에서 repo, admin:repo_hook을 클릭했습니다. 레포지토리 접근 권한과 훅 용도로만 사용할 수 있게 해주었습니다.

 

이제 Generate token버튼을 클릭하시면 빨간색 박스에 token이 생성됩니다! 이제 이 토큰을 가지고 Jenkins에 설정하러 가보겠습니다.

토큰은 페이지 벗어나면 다신 찾을 수 없으니 다른 곳에다 token을 적어나야 합니다 :) 

 

 

Manage Jenkins -> System Configuration

Manage Jenkins -> System Configuration 에서 System 톱니바퀴 모양을 클릭해줍니다.

 

 

System -> Add GitHub Server

System페이지에서 아래쪽으로 내리면 github 설정하는 곳이 있습니다 거기서 Add GitHub Server버튼 눌러주시면 서버 추가하는 

form이 나옵니다.

 

Jenkins Credentials Provider: Jenkins

이때 Add버튼을 눌러주시면 하단에 팝업창이 뜹니다 여기서 아까 발급받은 token 입력하면됩니다.

 

Github 자격증명 입력

Kind 설정을 Secret text 로 변경 후, Secret (Access token) ID 내가 지정할 Access token 발급시 설정한 이름을 입력하고 Add 버튼 눌러주시면 됩니다. (Access token 발급시 설정한 이름을 사용하지 않아도 되지만, 저는 헷갈릴까봐 둘이 같은 이름으로 설정해줬어요.)

 

test connection

이제 오른쪽 하단에 test connection버튼을 눌러서 아래와 밑줄친 부분과 같이 코멘트가 나오면 정상적으로 연결된 것 입니다!

 

파이프라인 생성하기

저는 미리 script를 작성하는 것보단 우선 동작 확인을 하고 추가해나가는 것을 선호 합니다. 미리 다 작성해놨을 경우에 문제가 날 경우 찾는 것이 어려워 점차 추가해 나갑니다. 그래서 우선 간단하게 동작만 하는지 확인해보겠습니다.

 

Jenkins 대시보드에서 new Item 클릭

 

 

파이프라인 추가

이름 작성 후 파이프라인을 클릭해주고 ok버튼 누르면 곧바로 파이프라인이 생성됩니다. 저는 프로젝트명과 파이프라인을 합쳐서 이름을 지어줬습니다.

 

 

 

파이프라인 스크립트 작성

이제 파이프라인을 작성했다면 파이프라인에서 활용할 pipeline script를 작성해줘야 합니다.

Jenkins 파이프라인은 지속적인 배포 파이프라인을 구현하고 Jenkins에 통합하는 것을 지원하는 플러그인입니다.

 

파이프라인 스크립트에 대해서는 공식문서를 참고하면 좋을 것 같습니다!

https://www.jenkins.io/doc/book/pipeline/

 

Pipeline

Jenkins is, fundamentally, an automation engine which supports a number of automation patterns. Pipeline adds a powerful set of automation tools onto Jenkins, supporting use cases that span from simple continuous integration to comprehensive CD pipelines.

www.jenkins.io

 

저는 젠킨스에서 제공해주는 pipeline syntax를 이용해 우선 동작 확인 부터 해주겠습니다.

 

General -> try sample pipeline 버튼 클릭 후 Hello World 클릭

 

이제 아래와 같이 Hello World를 print해주는 스크립트가 작성되었습니다. 이제 이 sample script를 git clone할 수 있게 변경해보겠습니다.

 

 

 

git clone 하기

Github Snippet 만들기

우선 Pipeline Syntax에서 Sample Step을 클릭해줍니다.

이제 repository URL (내 프로젝트 주소, Branch, Credentials) 설정 후 사진에서는 안보이지만 Generate Pipeline Script 버튼을 클릭하면 아래와 같이 스니펫이 생성됩니다. 

 

Jenkins pipeline script에 Github Snippet 적용하기

이제 Hello World 작성한 script에 위에서 만든 Github Snippet을 넣어보겠습니다. 아래와 같이 'github clone' , steps에 만들어둔 snippet을 적용하면 됩니다.

Build Now

이제 적용이 끝났으면 수동으로 Build를 해보겠습니다.

 

정상적으로 마쳤으면 위의 사진 처럼 Green 표시가 나타날 것입니다!

 

본격적인 Script제작 및 Docker Hub push

이제 git clone까지 확인 되었으면 본격적으로 Jenkinsfile을 작성해 Docker Hub까지 Image push를 해보겠습니다.

저는 Jenkinsfile을 따로 프로젝트에서 관리하고 싶어서 분리를 했습니다. 

솔직히 이 전까지는 생각보다 할만한데라고 생각했습니다.... 이 뒤 부터 장난없네요...😂 

 

Pipeline script from SCM

기존에 작성하던 Pipeline script에 계속 작성해도 되고, Pipeline script from SCM으로 변경해서 따로 내 프로젝트에 관리해도 됩니다.

 

이제 여기서 연결할 GitHub URL, Credential 그리고 브랜치를 명시해줍니다. 저는 main대신 setting으로 테스트 용도로 브랜치를 만들어줬습니다!

 

Gihub Webhook 설정 

 

젠킨스에서 BuildTrigger 설정

 

Github repository에서 Jenkins Webhook 설정

  • [Github Repository]-[Settings]-[Webhooks]-[Add webhook]
  • Payload URL : http://<Server IP>:<Jenkins Port>/github-webhook/
  • Content type : application/json
  • Acitve 활성화

GitHub webhook과 Jenkins를 연동하여 git push시에 pipeline 자동 빌드해주는 역할 입니다.

 

 

환경변수 설정

 

Jenkins의 중요 정보 별도로 관리하기

* 해당 설정은 Global properties로 프로젝트마다 공통된 환경변수만 설정해주는 것이 좋습니다. *

Jenkins 관리 > 시스템 설정 > Global properties > Enviroment variables에 민감한 정보를 환경변수로 등록합니다.

Enviorment variables 체크 박스를 클릭하면 Name,Value 형식의 form이 생성됩니다.

 

 

이때 Jenkinsfile에서 감춰야할 중요 정보들은 해당 form 박스에 작성합니다.

예를 들면, HARBOR_USER, HARBOR_PWD 등등..

 

Dockerfile 작성

프로젝트 이미지 생성할 Dockerfile 작성

FROM eclipse-temurin:17-jdk-alpine
CMD ["./gradlew", "clean", "bootJar"]
ARG JAR_FILE_PATH=build/libs/*.jar
COPY ${JAR_FILE_PATH} app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

 

 

Jenkins script 작성

이제 Horbor 까지 Push하기 위한 Script 작성만 남았습니다. 

스크립트에서는 git clone -> gradle Build -> Image push to DockerHub 순으로 스크립트를 작성해주시면 됩니다.

 

pipeline {
  agent any
    stages{
        // git clone
        stage('Clone') {
            steps {
                checkout scm
            }
        }
        stage("Delete") {
            steps{
              sh(script: "docker rmi ${IMAGE_NAME}  || true")
              sh(script: 'docker rmi $(docker images -f "dangling=true" -q) || true')
            }
        }

        stage('Build'){
          steps{
                sh(script: "docker build -t ${HARBOR_USER}/${IMAGE_NAME}:latest .")
                withDockerRegistry(credentialsId: 'docker-hub', url: '') {
                  sh(script: "docker push ${HARBOR_USER}/${IMAGE_NAME}:latest")
              }
          }
        }
    }
}

 

SpringBoot 2.3 이후로는 DockerFile없이도 이미지 생성이 가능합니다! 위에 stage('Build')에서 명시 된 bootBuildImage task가 나왔습니다!! --imageName 같이 property를 설정할 수 있습니다.

 

https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#build-image

 

Spring Boot Gradle Plugin Reference Guide

To manage dependencies in your Spring Boot application, you can either apply the io.spring.dependency-management plugin or use Gradle’s native bom support. The primary benefit of the former is that it offers property-based customization of managed versio

docs.spring.io

 

 

남은 할일

아직...Jenkins 설정할 것이 많이 남아있습니다...Gitlab CI/CD 한번 적용해보고 처음 해보는 건데 세팅하는게 제일 힘든 것 같아요,,, 🥲

 

❎ 서버 별(운영, 테스트)로 Jenkinsfile 생성 및 별도 관리

❎ Github에서 특정 작업(특정 브랜치 Merge)이 이루어졌을때 자동으로 hub 배포하기 

❎ Jenkins 작업 시작 시 Slack 알람 발송

❎ Dockfile없이 Gradle Task를 이용해서 이미지 Build

 

아직 수동으로 밖에 돌아가지 못하지만,, 다음에는 Jenkins 설정 개선기를 통해서 찾아뵙겠습니다..!

 

작업한 내용은 TGather repository에 있습니다 :)

https://github.com/ys-developer/TGather

 

GitHub - ys-developer/TGather

Contribute to ys-developer/TGather development by creating an account on GitHub.

github.com

 

참고

Jenkins 적용하면서 알아보다가 알게된 git label 적용하는 법

 

https://velog.io/@rimo09/Github-github-label-%ED%95%9C%EB%B2%88%EC%97%90-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0

 

[Github] github label 한번에 적용하기

레파지토리를 새로 만들 때마다 커스텀한 github label을 따로 설정하는게 불편해서 찾은 방법. 내가 사용하는 label 템플릿을 공유하고, 레파지토리에 바로 적용하는 법을 정리해본다.

velog.io

 

https://sihyung92.oopy.io/e5300d92-1a4e-40f4-b927-a93b2bbb17d2

 

젠킨스 파이프라인을 이용한 배포 자동화

개요

sihyung92.oopy.io

 

https://hyeinisfree.tistory.com/23

 

[Devops] Jenkins, Docker로 Spring Boot CI/CD 구축하기

👩‍💻 CI/CD 1️⃣ 구성 요소 Jenkins Server : AWS EC2 Ubuntu 18.04 Spring Boot Server : AWS EC2 Ubuntu 18.04 Github Repository Docker Hub Repository 2️⃣ 진행 순서 Jenkins Server에 Docker 설치 Jenkins Server에 Docker를 이용하여 J

hyeinisfree.tistory.com

 

반응형
profile

Yeji's Tech Notes

@Jop

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!