Updated:

Jenkins intro

Jenkins는 소프트웨어 개발시 지속적인 통합(Continuous integration)을 제공해주는 도구이다. 더불어 지속적인 배포환경까지 구축할 수 있는 도구이다. Jetty web server에 연동되어 Jenkins 서비스를 제공한다.

  • 빌드(Building), 태스트(Testing), 배포(Deploying) 프로세스를 자동화하여 개발자의 시간 절약과 개발 생산성을 높일 수 있다.
  • Git과 같은 버전 관리 시스템과 연동하여 커밋을 감지하면 빌드가 작동되도록 설정할 수 있다.
  • 소스코드는 대부분 Java이며, 몇 개의 Groovy, Ruby, ANTLR(Another Tool For Language Recognition) 파일이 있다.
  • Container를 k8s cluster에 배포
  • 1000개 이상의 automation tool plug-in

 Jenkins는 다음과 같은 장점이 있다.

  • Fast feedback to developers
  • Easy for developers to find and fix issues
  • Improves developers productivity
  • Improves code quality
  • Automates integration flow
  • Automates SW release process
  • Release SW updates faster
  • Automated CI/CD pipeline

Jenkins CI/CD 과정

  • Local에서 개발자가 개발한 후 공유 리포지토리에 commit & push
  • Jenkins가 이를 인지하여 변경된 소스코드와 기존 코드와 함께 빌드 및 테스트
    • Docker Image로 빌드
  • 빌드가 성공할 경우 빌드한 파일을 배포 서버로 전송
    • Docker Hub로 Image를 Push
  • 만약 빌드 및 테스트를 실패한 경우 로그를 남기고 종료

Jenkins freestyle demo (Maven project)

 실습 하기 전에 EC2 기계의 Inbound rule에 Jenkins default port 8080을 반영한다.

 먼저 Java(JDK17)와 Jenkins를 설치한다.

  • sudo wget -O /usr/share/keyrings/jenkins-keyring.asc
    https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
  • echo “deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc]”
    https://pkg.jenkins.io/debian-stable binary/ | sudo tee
    /etc/apt/sources.list.d/jenkins.list > /dev/null
  • sudo apt-get update
  • sudo apt-get install jenkins
  • sudo apt update
  • sudo apt install fontconfig openjdk-17-jre
  • java -version
  • jenkins –version
  • sudo systemctl status jenkins
  • sudo systemctl start jenkins

 이제 public ip address:8080으로 Jenkinks에 접속한다.

  • sudo cat /var/lib/jenkins/secrets/initialAdminPassword
    • c911c65c725e4148801208a9fb3ce5d4
    • 이를 Administrator password에 입력한다.
  • Install suggested plugins를 선택해 Install plugins Jenkins community finds most useful한다.
  • 이후 Admin User를 생성한다.

  • Enter an item name에 “1stFreeStyleJob”를 입력하고 Freestyle project를 선택해 생성한다.
    • Freestyle project: Jenkins에서 기본 틀을 정의해주고 안에 빈칸을 채우는 형식으로 프로세스 흐름을 정의하는 방식이다.

  • General의 설명 부분에 “1st demo”라고 적는다.
  • Build Steps에서 Execute shell을 선택하고 다음과 같이 작성한다.

  • 지금 빌드를 클릭해 Building을 하고 Build History의 “#1”을 클릭 후 Console Output을 보면 다음과 같이 Building이 성공함을 알 수 있다.

  • EC2 기계에서 다음 명령을 하면 Working directory가 생성되었음을 볼 수 있다.

Jenkins Freestyle Job with Maven Project

Maven은 빌드 도구(Build tool)로서 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전영 프로그램이다. 실제 프로젝트를 진행할 때 가장 널리 사용되는 build tool로 Java Spring Boot 프로젝트에는 필수적이다. Maven에 필적하는 도구에 gradle이 있으나, gradle도 dependency를 maven의 repository에서 탐색하여 제공한다.  이번 Jenkins Demo에서는 git을 사용하므로 git을 먼저 설치한다.

  • sudo apt-get install git
  • sudo apt-get update
  • mvn -v
    • sudo apt install maven
    • https://github.com/jenkins-docs/simple-java-maven-app의 pom.xml을 보면 maven 3.8.6이상이 필요한 것을 확인할 수 있다.
    • 하지만 이 명령을 수행하면 3.6.x Maven이 설치 됨으로 다음과 같은 명령을 입력한다.
  • cd /opt
    • 제 3자가 제공하는 Software을 Linux에 설치할 때의 관행으로 이 directory에 설치를 한다.
  • sudo wget https://dlcdn.apache.org/maven/maven-3/3.9.7/binaries/apache-maven-3.9.7-bin.tar.gz
    • wget 명령어를 사용하여 Apache Maven 3.9.7 버전의 binary 파일을 다운로드한다.
  • sudo tar -xvf apache-maven-3.9.7-bin.tar.gz
    • tar 명령을 사용하여 다운로드한 tar.gz 파일의 압축을 푼다.
  • sudo ln -s /opt/apache-maven-3.9.7 /opt/maven
    • 심볼릭 링크를 생성하여 “/opt/apach-maven-3.9.7” directory를 “opt/maven”으로 참조할 수 있게 한다.
  • sudo vi /etc/profile.d/maven.sh
    • Maven의 환경변수를 설정한다.
    • export M2_HOME=/opt/maven
    • export MAVEN_HOME=/opt/maven
    • export PATH=${M2_HOME}/bin:${PATH}
    • M2_HOME과 MAVEN_HOME은 Maven의 설치 디렉토리를 가리키고 PATH는 실행 파일 디렉토리를 포함하여 Maven 명령어를 전역에서 사용할 수 있도록 한다.
  • sudo chmod +x /etc/profile.d/maven.sh
    • chmod 명령어를 사용하여 ‘/etc/profile.d/maven.sh’파일에 실행 권한을 부여한다.
  • source /etc/profile.d/maven.sh
    • source 명령어를 사용하여 새로 만든 환경 변수 설정을 현재 세션에 적용한다.
  • mvn -v
    • Maven이 설치되었음을 확인할 수 있다.

  • cd ~
  • mkdir maven-test && cd maven-test
  • git clone https://github.com/jenkins-docs/simple-java-maven-app
  • ls -al
  • cd simple-java-maven-app
  • ls -al
  • mvn compile
    • src directory에 있는 java 파일을 컴파일한다.
    • compile하는데 필요한 dependency modules를 설치한다.
  • mvn test
    • test 파일을 컴파일한다.

  • mvn package
    • 이 프로그램을 실행 파일(package)로 만든다.

  • ls -al
  • cd target && ls -al
  • java -jar my-app-1.0-SNAPSHOT.jar
    • Hello World!가 출력됨을 확인할 수 있다.

 Jenkins 관리의 Tools에 들어가서 Maven installations의 Add Maven을 클릭하고 다음과 같이 설정한다.

  • Install automatically를 체크하면 원하는 Version의 Maven을 장착할 수 있다.
  • 하지만 이번 실습에서는 다음과 같은 방법으로 한다.

  • MAVEN_HOME에 입력할 값은 다음과 같이 알 수 있다.

 이제 simple-java-maven-app을 Freestyle project로 생성한다.  simple-java-maven-app에 들어가 Configure의 소스 코드 관리를 Git으로 체크해주고 다음과 같이 설정해준다.

 Build Steps를 Invoke top-level Maven targets으로 하고 다음과 같이 설정한다.

  • Invoke top-level Maven targets: Maven 프로젝트의 최상위 레벨에서 정의된 목표를 실행할 수 있다.

  • 지금 빌드를 클릭해 Building을 하고 Build History의 “#2”을 클릭 후 Console Output을 보면 다음과 같이 Building이 성공함을 알 수 있다.

 위 사진의 Building jar: /var/lib/jenkins/workspace/simple-java-maven-app/target/my-app-1.0-SNAPSHOT.jar을 에서 cd /var/lib/jenkins/workspace/simple-java-maven-app/target/을 한 뒤 java -jar my-app-1.0-SNAPSHOT.jar을 입력하면 “Hello World!”가 출력됨을 알 수 있다.

Jenkins pipeline & Webhook

Jenkins pipeline은 jenkins job들을 순차적 혹은 병렬적으로 실행시키거나 특별하게 작성한 스크립트로 이벤트들을 연속적으로 실행시키는 등의 일을 지원하는 기능이다. 즉, Jenkins pipeline은 Jenkins를 사용하여 연속적인 전달 파이프 라인의 통합 및 구현을 지원하는 플러그인의 조합이다. 파이프라인은 파이프라인 DSL(Domain-Specific Language)을 통해 간단하거나 복잡한 전달 파이프라인을 Code로 생성할 수 있는 확장 가능한 자동화 서버를 갖추고 있다.

실습 - Pipeline Demo

Pipe line으로 pipeline 프로젝트를 생성한다.

 Configure에서 Build Triggers의 Poll SCM의 체크를 하고 Schedule에 다음과 같이 입력해준다. 이는 2분마다 읽는것으로 설정한 것이다.

 Pipeline의 Pipeline Syntax 링크를 클릭하고 다음과 같이 설정하고 Generate Pipeline Script를 클릭한다. 그러면 “build ‘simple-java-maven-app’“가 생성된다.

 이후 Github에 레포지토리를 생성하고 Jenkinsfile을 생성한다.

 Pipeline에서 Definition을 Pipeline script from SCM으로 하고 다음과 같이 설정한다.

 Script Path는 Jenkinsfile로 하고 Apply를 하고 저장을 한다. Build를 한 뒤 Console Output을 확인한다. Starting building: simple-java-maven-app #3을 클릭하고 Console Output을 확인하면 출력을 확인할 수 있다.

 EC2기계에서 다음 명령어를 입력하면 “Hello World!”가 출력된다.

  • cd /var/lib/jenkins/workspace/simple-java-maven-app/target/
  • ls -al
  • java -jar my-app-1.0-SNAPSHOT.jar

 만약 Github에 새로 commit을 하면 2분이 지나면 다시 빌드가 되는 것을 확인할 수 있다.

실습 - Pipeline Project Triggered using Github Webhook

 먼저 다음과 같이 simple-java-maven-app을 fork해온다.

 이후 github-webhook으로 pipeline 프로젝트를 생성한다. Build Triggers에서 Github hook trigger from GITScm polling을 체크해준다. pipeline syntax 링크를 클릭해주고 다음과 같이 설정한다.

다음과 같이 credential을 준다(password로는 token을 입력한다).

 Generate Pipeline Script를 클릭하면 “checkout scmGit(branches: [[name: ‘*/master’]], extensions: [], userRemoteConfigs: [[credentialsId: ‘Lazernes’, url: ‘https://github.com/Lazernes/simple-java-maven-app.git’]])”이 생성된다.
 이제 Pipeline의 Definition을 Pipeline script로 해 두고 Script에 다음과 같이 입력한다.

pipeline {
    agent any

    tools {
        // Install the Maven version configured as "M3" and add it to the path.
        maven "mvn3.9.7"
    }

    stages {
        stage('checkout') {
            steps {
                checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'Lazernes', url: 'https://github.com/Lazernes/simple-java-maven-app.git']])
            }
        }
        stage('Build') {
            steps {
                // Get some code from a GitHub repository
                git 'https://github.com/Lazernes/simple-java-maven-app.git'

                // Run Maven on a Unix agent.
                sh "mvn -Dmaven.test.failure.ignore=true clean package"

                // To run Maven on a Windows agent, use
                // bat "mvn -Dmaven.test.failure.ignore=true clean package"
            }

            post {
                // If Maven was able to run the tests, even if some of the test
                // failed, record the test results and archive the jar file.
                success {
                    echo "Job Done."
                }
            }
        }
    }
}

 이제 Github에 들어가 다음과 같이 Webhooks를 생성한다.

 Jenkins에서 빌드를 하면 다음과 같이 성공했음을 볼 수 있다.

 EC2기계에서도 다음과 같이 확인할 수 있다.

 Github repository에서 아무 파일이나 수정 후 commit을 하면 Jenkins 프로젝트가 Github webhook에 의해 수정된 내용을 포함해 push되어 pipeline이 수행되는 것을 확인할 수 있다.

댓글남기기