DevOps, Infra

[Jenkins] Jenkinsfile

seulseul 2022. 12. 28. 00:42

목차

 

    1. Dockerizing (도커라이징)

    pipeline {
    
    agent any
        environment {
            SOURCECODE_JENKINS_CREDENTIAL_ID = 'jei0486'
            SOURCE_CODE_URL = 'https://github.com/jei0486/demo-fe'
            RELEASE_BRANCH = 'main'
            REGISTRY = 'jei0486/demo-fe'
        }
    
        stages {
            stage('init') {
                steps {
                    echo 'init'
                    echo "Current workspace : ${workspace}"
                }
            }
    
            stage('clone') {
                steps {
                    echo 'clone'
                    git url: "$SOURCE_CODE_URL",
                    branch: "$RELEASE_BRANCH",
                    credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID"
                    sh "ls -al"
                }
            }
    
            stage('build') {
                steps {
                    sh 'pwd'
                    sh '''
                    chmod +x gradlew
                    ./gradlew clean bootJar
                    '''
                }
            }
    
            stage('dockerizing'){
                steps{
                    sh '''
                    pwd
                    docker image build -f Dockerfile -t $REGISTRY:${TAG} .
                    '''
                }
            }
    
            stage('Deploy docker image') {
                steps {
                    withDockerRegistry([ credentialsId: 'dockerhub', url: '' ]) {
    					sh 'docker push $REGISTRY:${TAG}'
                    }
                }
            }
        }
    
        post {
            always {
                cleanWs()
            }
        }
    }

    Dockerfile

    FROM openjdk:11.0.11-jre-slim
    EXPOSE 9099
    
    RUN mkdir /app
    
    COPY ./build/libs/*-SNAPSHOT.jar ./app/application.jar
    
    ENTRYPOINT ["java","-jar","/app/application.jar"]

     

    2. jib

    2.1. Jenkinsfile

    pipeline {
        agent any
        environment {
            SOURCECODE_JENKINS_CREDENTIAL_ID = 'jei0486'
            SOURCE_CODE_URL = 'https://github.com/jei0486/demo-api'
            RELEASE_BRANCH = 'main'
            REGISTRY = 'jei0486/demo-api'
        }
    
        stages {
    
            stage('init') {
                steps {
                    echo 'init'
                    echo "Current workspace : ${workspace}"
                }
            }
    
          stage('clone') {
            steps {
                echo 'clone'
                git url: "$SOURCE_CODE_URL",
                branch: "$RELEASE_BRANCH",
                credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID"
                sh 'ls'
            }
          }
    
          stage('Gradle Build') {
            steps {
                echo 'build'
                sh '''
                chmod +x gradlew
                ./gradlew clean bootJar
                '''
             }
          }
    
            stage('Publish-release') {
                steps {
                    withDockerRegistry([ credentialsId: 'dockerhub', url: '']) {
                          sh '''
                          ./gradlew jib -Ddocker.repo.username=$USERNAME -Ddocker.repo.password=$PASSWORD
                          '''
                      }
                }
            }
        }
    
        post {
            always {
                cleanWs()
            }
        }
    }

    2.2. Jenkins credential 추가


    Name : docker.repo / Credential type : Username with password

    credential

    2.3. jib 관련 설정

    https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin#war-projects

     

    GitHub - GoogleContainerTools/jib: 🏗 Build container images for your Java applications.

    🏗 Build container images for your Java applications. - GitHub - GoogleContainerTools/jib: 🏗 Build container images for your Java applications.

    github.com

    2.3.1. build.gradle 추가 (gradle 일 경우)

    jib {
    	from {
    		image='openjdk:11.0.14.1-jre'
    	}
    
    	to {
    		image='jei0486/demo-api'
    
    		def imageTag = System.getenv('TAG') ?: 'v1'
    
    		tags=[imageTag]
    	}
    
    	container {
    		creationTime='USE_CURRENT_TIMESTAMP'
    		format='OCI'
    	}
    
    	extraDirectories {
    		paths {
    			path {
    				from = file('build/libs')
    			}
    		}
    	}
    }

    2.3.2. pom.xml 추가 (maven 일 경우)

    <plugin>
    	<groupId>com.google.cloud.tools</groupId>
    	<artifactId>jib-maven-plugin</artifactId>
      <version>3.3.1</version>
      <configuration>
        <from>
    	 <image>openjdk:11.0.14.1-jre</image>
    	</from>
        <to>
         <image>registry.hub.docker.com/jei0486/demo-api</image>
        </to>
        <container>
    	 <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
    	 <format>OCI</format>
        </container>
      </configuration>
    </plugin>

    3. Skaffold

    pipeline {
        agent any
        environment {
            PATH = "$PATH:/usr/local/bin/"  // skaffold, gradle path
            SOURCECODE_JENKINS_CREDENTIAL_ID = 'jei0486'
            SOURCE_CODE_URL = 'https://github.com/jei0486/demo-scg'
            RELEASE_BRANCH = 'main'
            REGISTRY = 'jei0486/demo-scg'
        }
    
        stages {
    
            stage('init') {
                steps {
                    echo 'init'
                    echo "Current workspace : ${workspace}"
                }
            }
    
    	      stage('clone') {
    	        steps {
    	            echo 'clone'
    	            git url: "$SOURCE_CODE_URL",
    	            branch: "$RELEASE_BRANCH",
    	            credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID"
    	            sh 'ls -al'
    	        }
    	      }
    
    	    stage('Build') {
    	      steps {
    	            withDockerRegistry([ credentialsId: 'dockerhub', url: '' ]) {
    	               sh "skaffold build -p dev -t ${TAG}"
    	            }
    	        }
    	     }
      }
    
       post {
            always {
                cleanWs()
            }
        }
    }

     

    4. Skaffold + GitOps + Branch

    pipeline {
        agent any
        environment {
            PATH = "$PATH:/usr/local/bin/"  // skaffold , argocd path
            SOURCECODE_JENKINS_CREDENTIAL_ID = 'jei0486'
            SOURCE_CODE_URL = 'https://github.com/jei0486/demo-scg'
            RELEASE_BRANCH = 'main'
            GIT_OPS_URL = 'github.com/jei0486/demo-gitops.git'
            GIT_OPS_BRANCH = 'main'
            REGISTRY = 'jei0486/demo-scg'
        }
    
        stages {
    
            stage('init') {
                steps {
                    echo 'init'
                    echo "Current workspace : ${workspace}"
                }
            }
    
           stage('checkout') {
             steps {
                 echo 'checkout'
                 checkout scm: [
                         $class: "GitSCM",
                         userRemoteConfigs: [[url: "$SOURCE_CODE_URL",
                         credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID" ]],
                         branches: [[name: "refs/tags/${TAG}"]]],
                         poll: false
             }
           }
    
            stage('Build') {
                steps {
                    sh """
                    chmod +x gradlew
                    ./gradlew clean bootJar -Dspring.profiles.active=dev
                    """
                }
            }
    
            stage('Skaffold') {
                steps {
                    withDockerRegistry([ credentialsId: 'dockerhub', url: '' ]) {
                      sh "skaffold build -p dev -t ${TAG}"
    
                    }
                }
            }
    
            stage('workspace clear'){
                steps {
                    cleanWs()
                }
            }
    
            stage('GitOps Update') {
    
                steps {
                   print "GitOps Update"
    
                   withCredentials([string(credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID", variable: 'SECRET')]) {
                   //set SECRET with the credential content
    
                   git url: "https://$GIT_OPS_URL",
                       branch: "$GIT_OPS_BRANCH",
                       credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID"
                          sh '''
                            ls -la
                            cd ./demo-scg/rolling-update
                            kustomize edit set image jei0486/demo-scg:${TAG}
                            git config user.email "jei0486@gmail.com"
                            git config user.name "jei0486"
                            git add .
                            git commit -am "update image tag ${TAG}"
                            git remote set-url --push origin https://${SECRET}@$GIT_OPS_URL
                            git push origin $GIT_OPS_BRANCH
                            '''
                    }
                }
           }
    
        }
    
        post {
            always {
                cleanWs()
            }
        }
    }

     

    5. Skaffold + GitOps + CustomVersionTag

    def customVersion = "P" + env.BUILD_NUMBER
    
    pipeline {
        agent any
        environment {
            PATH = "$PATH:/usr/local/bin/"  // skaffold , argocd path
            SOURCECODE_JENKINS_CREDENTIAL_ID = 'jei0486'
            SOURCE_CODE_URL = 'https://github.com/jei0486/demo-scg'
            RELEASE_BRANCH = 'main'
            GIT_OPS_URL = 'github.com/jei0486/demo-gitops.git'
            GIT_OPS_BRANCH = 'main'
            REGISTRY = 'jei0486/demo-scg'
        }
    
        stages {
    
            stage('init') {
                steps {
                    echo 'init'
                    echo "Current workspace : ${workspace}"
                    echo "Build Number: ${env:BUILD_NUMBER}"
                    echo "customVersion: ${customVersion}"
                }
            }
    
           stage('clone') {
                 steps {
                            echo 'clone'
                            git url: "$SOURCE_CODE_URL",
                            branch: "$RELEASE_BRANCH",
                            credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID"
                            sh "ls -al"
                  }
           }
    
            stage('Build') {
                steps {
                    sh """
                    chmod +x gradlew
                    ./gradlew clean bootJar -Dspring.profiles.active=dev
                    """
                }
            }
    
           stage('Skaffold') {
                steps {
                    withDockerRegistry([ credentialsId: 'dockerhub', url: '' ]) {
                      sh "skaffold build -p dev -t ${customVersion}"
                    }
                }
            }
    
    
            stage('workspace clear'){
                steps {
                    cleanWs()
                }
            }
    
            stage('GitOps Update') {
    
                steps {
                   print "GitOps Update"
    
                   withCredentials([string(credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID", variable: 'SECRET')]) { //set SECRET with the credential content
    
                       git url: "https://$GIT_OPS_URL",
                           branch: "$GIT_OPS_BRANCH",
                           credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID"
                              sh """
                                ls -la
                                cd ./demo-scg/blue-green
                                kustomize edit set image jei0486/demo-scg:${customVersion}
                                git config user.email "jei0486@gmail.com"
                                git config user.name "jei0486"
                                git add .
                                git commit -am 'update image tag ${customVersion}'
                                git remote set-url --push origin https://${SECRET}@$GIT_OPS_URL
                                git push origin $GIT_OPS_BRANCH
                                """
                   }
                }
           }
    
        }
    
        post {
            always {
                cleanWs()
            }
        }
    
    }

    'DevOps, Infra' 카테고리의 다른 글

    [ArgoCD] ArgoCD Install  (0) 2022.12.28
    [Jenkins] 빌드 자동화 - webhook  (0) 2022.12.28
    [Jenkins] 빌드 자동화 - polling  (0) 2022.12.27
    [Jenkins] 플러그인 설치 및 준비  (0) 2022.12.27
    Git 브랜치 전략 3가지  (0) 2022.12.27