HyeLog

Jenkins 란? Jenkins 기초 개념 본문

DevOps/Jenkins

Jenkins 란? Jenkins 기초 개념

shj718 2023. 6. 6. 21:56

1️⃣ 개념

Jenkins는 소프트웨어 개발 시 지속적 통합(Continuous Integration) 서비스를 제공하는 도구이다.

빌드, 테스트, 배포 프로세스를 자동화한다.

 

이렇게 말로만 들으면, 그래서 걔가 도대체 뭘 하는거라고?🧐 의문이 들 수 있다.

Jenkins가 없는 상황을 가정해보면, Jenkins가 무슨 일을 하는지 좀 더 쉽게 이해할 수 있을 것이다.

 

내가 다른 팀원들과 프로젝트 A를 개발하고 있다고 생각해보자.

각 팀원들은 자신이 맡은 기능을 개발하고, 개발을 완료했다면 프로젝트 A의 코드에 자신의 코드를 병합할 것이다.

병합이 이루어진 이후에는 코드를 빌드하고, 테스트하면서 오류가 있다면 수정한다.

팀원들이 각자 테스트를 마치면, Github에 자신이 개발한 기능을 Push할 것이다.

여기서 끝나는 것이 아니라, 실제로 새롭게 개발한 기능을 사람들이 사용하려면, 프로젝트를 다시 배포해야 한다.

프로젝트 A가 AWS EC2를 통해서 배포된다고 해보자.

각 팀원들이 자신이 새롭게 개발한 기능을 프로젝트 A에 추가할 때마다 매번 EC2 인스턴스에 접속해서, Github의 변경사항을 Pull하고, 다시 배포하는 과정을 거쳐야 한다.

 

이렇게 개발자들이 매번 직접 코드를 병합하고, 빌드, 테스트를 검증하고, 다시 배포하는 것은 생각만 해도 번거롭고 많은 시간이 소요되는 일이다. 그래서 Jenkins가 존재하는 것이다. Jenkins는 위의 상황에서 일어나는 일들을 모두 자동화 해줌으로써 많은 장점을 가져다 준다.

 

2️⃣ Jenkins 를 사용하는 이유 및 장점

  • 소스 변경 사항을 프로젝트에 지속적으로 통합하여 코드의 오류조기에 발견
  • 개발 생산성 향상
  • 소프트웨어 품질 향상
  • 지속적인 통합을 통해 안정적인 릴리즈를 빠르게 배포할 수 있음

 

3️⃣ Jenkins 의 특징

  • Java Runtime Environment에서 동작함. (maven/java 프로젝트와 잘 맞음)
  • 다양한 plug-in들(1000개 이상 존재)을 활용해서 각종 자동화 작업을 처리함.
  • 일련의 자동화 작업의 순서들의 집합인 pipeline을 통해 CI/CD pipeline을 구축함.
  • Jenkins도 서버이기 때문에 띄워서 8080번 포트(디폴트)로 접속하면 볼 수 있음. (포트번호는 변경 가능)

 

4️⃣ Jenkins Pipeline 이란?

Pipeline은 일련의 작업들이 순서대로 연결된 것으로, CI/CD 실현을 돕는 플러그인들의 집합이다.

즉, 빌드 / 테스트 / 배포를 어떻게 자동화 할 것인지를 정의한 작업들의 집합이라고 할 수 있다.

 

Jenkins Pipeline을 정의하는 방법 에는 총 3가지가 있다.

 

1.  Jenkins Blue Ocean UI 를 사용

2.  전통적인 Jenkins UI 를 사용 (웹 브라우저를 통해 접속)

3.  SCM(Ex. Git) 에서 Jenkinsfile 을 작성

 

✨ 이 중에서 가장 권장되는 방식은 3. Jenkinsfile 을 작성하는 방법이다. ✨

 

5️⃣ Jenkinsfile 을 통한 파이프라인 정의

위에서 말한 것처럼, 프로젝트에 Jenkinsfile을 만들어서 해당 프로젝트에 대한 파이프라인을 정의하는 것이 가장 일반적이다.

그럼 Jenkinsfile은 어떻게 작성하는 걸까?

 

Jenkinsfile 작성은 2가지 문법으로 가능하다.

1. Declarative

pipeline {
    agent {
        label 'demoAgent'
    }

    stages {
        stage('Selenium Test') {
            steps {
                git branch: 'main', url: 'https://github.com/shj718/Selenium-maven-project.git'
                sh 'mvn clean test'
                sh 'echo "Selenium Testing..."'
            }
        }
    }
}

 

2. Scripted

node {
    stage('Test') {
        git 'https://github.com/user/project.git'
        sh 'mvn test'
        archiveArtifacts artifacts: 'target/surefire-reports/**'
    }
    stage('Build') {
        sh 'mvn clean package -DskipTests' 
        archiveArtifacts artifacts: 'target/*.jar'
    }
    stage('Deploy') {
        sh 'echo Deploy'
    }
}

 

코드를 보면 알 수 있듯이, Declarative 문법이 Scripted 문법보다 더 쉽고 직관적이다. 하지만, Scripted 문법은 보다 더 정교한 작업이 가능하다. 개인의 필요에 맞게 더 적절한 것을 사용하는 것이 좋다.

 

'DevOps > Jenkins' 카테고리의 다른 글

Jenkins 분산 빌드 아키텍처 (Master, Agent)  (0) 2023.06.06