본문 바로가기
개발 및 운영

Jenkins gitlab연동 gradle프로젝트 자동빌드&도커빌드

by Joseph.Lee 2019. 8. 5.

단순 예제임.

사용법 없음..ㅋ

Jenkins -> item추가 -> Pipeline 으로 프로젝트 생성하고

Gitlab Integration에서 push event에 대한 WebHook을 jenkins으로 걸어놓고

Jenkins에서는 해당 이벤트를 받으면 gradle build -> Docker 이미지 생성 -> Docker Registry에 배포 -> 결과 전송 (Jandi Webhook)

이런 구조임..

프로젝트 git에는 docker폴더에 Dockerfile이 있어야 함.

import groovy.json.JsonOutput

version = ""
imageName = ""

def sendMessage(title, data) {
    def post = new URL("JANDI Web Hook URL").openConnection();

    data.body = "[[${env.JOB_NAME}]](${env.RUN_DISPLAY_URL}) push by ${env.gitlabUserName}: ${title}"

    post.setRequestMethod("POST")
    post.setDoOutput(true)
    post.setRequestProperty("Accept", "application/vnd.tosslab.jandi-v2+json")
    post.setRequestProperty("Content-Type", "application/json")
    post.getOutputStream().write(JsonOutput.toJson(data).getBytes("UTF-8"));
    def postRC = post.getResponseCode();
    return postRC
}

node('linux-agent-1') {
    try {
        stage('Preparation') {
            sendMessage("start build", [:])

            git(
                    url: env.gitlabSourceRepoURL,
                    credentialsId: 'gitlab-jenkins-1',
                    branch: env.gitlabTargetBranch
            )
        }
        stage('Build') {
            // 아래는 Artifactory 필요한 경우
            withCredentials([usernamePassword(credentialsId: 'artifactory-jenkins-pipeline', usernameVariable: 'ARTIFACTORY_USERNAME', passwordVariable: 'ARTIFACTORY_PASSWORD')]) {
                sh 'chmod +x gradlew'
                sh 'rm -rf build/libs/'
                sh './gradlew bootJar'
            }
        }
        stage('Publish') {
            version = sh(returnStdout: true, script: 'find build/libs/*.jar | sed -r \'s/^.*-([0-9.]+)\\.jar$/\\1/\'').trim()
            imageName = "Docker Registry 주소/네임스페이스/${env.JOB_NAME}:${env.gitlabTargetBranch.substring(7)}-${version}"
            sh 'cp build/libs/*.jar ./docker/app.jar'
            withDockerRegistry([url: "Docker Registry 주소"]) {
                def buildedDockerImage = docker.build(imageName, "./docker/") 
                buildedDockerImage.push()
            }
        }
        stage('Results') {
            def data = [
              "connectColor": "#FAC11B",
              "connectInfo": [
                [
                  "title": "version",
                  "description": version
                ],
                [
                  "title": "published image",
                  "description": imageName
                ]
              ]
            ]
            sendMessage("build success", data)
        }
    }catch(Exception e){
        def data = [
            "connectColor": "#FAC11B",
            "connectInfo": [
                [
                  "title": "version",
                  "description": version
                ],
                [
                  "title": "Exception",
                  "description": e.getMessage()
                ]
              ]
            ]
        sendMessage("build failed. [[Click]](${env.BUILD_URL}/console) to see more information.", data)
        throw e
    }
}
반응형

댓글