본문 바로가기
젠킨스 (Jenkins)

7. Pipeline project - pipeline script from SCM (2/2)

by 실짱 2024. 3. 14.

이제 다 왔다.

맨 처음에 파이프라인 빌드 단계를 언급한게 기억이 나는가?

이제 이걸 진행해 보자.

 

앞장에서 Jenkinsfile 스크립트를 설정한 위치에 파일을 하나 만들고 Jenkinsfile 이라고 이름짓자.

Jenkinsfile 의 구성은 쉽다.

pipeline {
  
  agent any
  
  stages {
  
    stage('1st step') {
      steps {
        // 원하는 액션들
      }
    }
    
    stage('2nd step') {
      steps {
        // 원하는 액션들
      }
    }
    ...
  }
  
  post {
    success {
      // 빌드 성공시 액션
    }
    
    failure {
      // 빌드 실패시 액션
    }
    
    always {
      // 빌드 성공,실패 여부와 상관없이 항상 수행할 액션
    }
  }
}

 

이해가 쏙 되죠?

 

여기서 각 단계를 설명하는것은 의미가 없을듯 하다.

각자마다 빌드할 코드들이 다를테니 내가 뭘 설명한들 나한테만 유의미할 수 있다.

내 Jenkinsfile 을 붙이는것으로 갈음한다.

 

더보기

내 Jenkinsfile

난 각 단계단계를 알아보기 쉽게 각 sh 파일로 나누었다.

 

pipeline {
    agent any

    stages {

        // execute pre-build script
        stage('Pre-Build') {
            steps {
                echo "Previous step before Build!!";
                sh 'chmod +x ./jenkins/develop/jenkins_pre_build.sh';
                sh './jenkins/develop/jenkins_pre_build.sh';
            }
        }

        // execute build script
        stage('Build') {
            steps {
                echo "Build step!!";
                script {
                    docker.withRegistry('https://registry.hub.docker.com', 'docker-hub-credentials') {
                        sh 'chmod +x ./jenkins/develop/jenkins_build.sh';
                        sh './jenkins/develop/jenkins_build.sh';
                    }
                }
            }
        }

        // execute test script
        stage('Test') {
            steps {
                echo "Test step!!";
                sh 'chmod +x ./jenkins/develop/jenkins_test.sh';
                sh './jenkins/develop/jenkins_test.sh';
            }
        }

        stage('Static Analysis') {
            steps {
                withSonarQubeEnv('SonarQube-Server') {
                    echo "SonarQube Analysis step!!";
                    sh '/opt/sonarscanner/bin/sonar-scanner -X';
                }
            }
        }
        // execute post-build script
        stage('Post') {
            steps {
                echo "Post step!!";
                script {
                    // change owner to jenkins for next build
                    withCredentials([string(credentialsId: 'jenkins-sudo-pass', variable: 'SUDO_PASS')]) {
                        sh 'echo $SUDO_PASS | sudo -S chown -R jenkins:jenkins api/coverage'
                    }
                }
                sh 'chmod +x ./jenkins/develop/jenkins_post_build.sh';
                sh './jenkins/develop/jenkins_post_build.sh';
            }
        }
    }

    post {
        success {
            echo 'All of pipeline stop is clear without any error !!'
        }

        failure {
            echo 'The build failed, see console output for detail.'
            echo 'We need to do clean up container even after build failed.'

            // execute post_build for clean up container
            sh 'chmod +x ./jenkins/develop/jenkins_post_build.sh';
            sh './jenkins/develop/jenkins_post_build.sh';
        }

        always {
            script {
                echo 'Build completed, we do some remained works !!'
                // change owner to jenkins for next build
                withCredentials([string(credentialsId: 'jenkins-sudo-pass', variable: 'SUDO_PASS')]) {
                    sh 'echo $SUDO_PASS | sudo -S chown -R jenkins:jenkins .'
                }
            }
        }
    }

}

 

build step 에 docker-hub-credentials 추가된 이유 : 우리는 docker 를 이용해서 프로젝트 개발을 한다. 배포도 docker image 로 한다. 그런데, 이게 무료버전은 6시간에 pull 할 수 있는 이미지 횟수가 200번인가...정해져 있다. 덴당...

그래서 한달에 5달러를 내면 조금 더 많이 할 수 있다. (https://www.docker.com/pricing/)

젠킨스로 docker image 를 생성시키고 pull 하다보니 6시간에 200번은 모자르더라. 그래서 돈냈다. ㅠㅠ

 

각 단계별로 자세한 사항이 필요하신 분은 댓글 남겨주세요. 

아는 범위에서 최대한 자세하게 설명 드릴께요.