반응형

들어가기 전

  • spring boot 애플리케이션을 jar로 빌드하고 docker image로 빌드해서 docker private registry로 push하는 과정을 소개

docker private registry 서버 실행

  • 빌드한 docker image를 관리하는 registry 서버를 먼저 실행
  • 해당 예제에서 registry 주소는 192.168.56.12:5000
  • 참고 : https://sg-choi.tistory.com/625

docker가 포함된 jenkins 서버 실행

jenkins 서버에 daemon.json 설정

jenkins git 프로젝트 빌드 설정

프로젝트에 파일 추가 후 commit & push

{프로젝트}/.jenkins/build.groovy

context = [:]

pipeline {
    agent any

    stages {
        stage('select branch') {
            steps {
                script {
                    sshagent(credentials: ["demo-api-github-sshkey"]) {
                        sh "git fetch --prune"
                        def branches = sh(script: "git branch -r", returnStdout: true).split("\n").collect { it.trim().replace("origin/", "") }.sort().reverse()
                        def branch = input(message: 'BRANCH', parameters: [choice(description: "BRANCH", name: "BRANCH", choices: branches,)])
                        sh "git checkout ${branch}"
                        sh "git pull"
                        context.tag = "${new Date().format("yyyyMMddHHmmss")}-${branch.replaceAll("/|-", "_")}"
                    }
                }
            }
        }

        stage('build jar') {
            steps {
                sh "docker run -v /var/jenkins_home/.gradle:/home/gradle/.gradle -v \${PWD}:/project -w /project gradle:7.6.0-jdk17-alpine gradle clean bootJar -x test"
            }
        }

        stage('build docker image') {
            steps {
                sh "docker build -t 192.168.56.12:5000/demo-api:${context.tag} -f .jenkins/Dockerfile ."
            }
        }

        stage('test docker image') {
            steps {
                script {
                    try {
                        sh "docker run --rm -dit -p 9090:9090 --name demo-api 192.168.56.12:5000/demo-api:${context.tag}"
                        sh "docker run --rm -i --add-host host.docker.internal:host-gateway alpine/curl --retry-all-errors --max-time 5 --retry-delay 3 --retry 2 http://host.docker.internal:9090/api/health"
                    } finally {
                        sh "docker stop demo-api || exit 0"
                    }
                }
            }
        }

        stage('push docker image') {
            steps {
                sh "docker image push 192.168.56.12:5000/demo-api:${context.tag}"
            }
        }
    }
}

{프로젝트}/.jenkins/Dockerfile

FROM openjdk:17
LABEL app_name="demo-api"
COPY build/libs/*.jar /deploy/app.jar
EXPOSE 9090
CMD java -jar -Dserver.port=9090 /deploy/app.jar

jenkins 빌드 실행 및 확인

  • 성공시 docker private registry에 잘 push가 되었는지 확인
curl http://192.168.56.12:5000/v2/_catalog
{"name":"example","tags":["latest"]}
http://192.168.56.12:5000/v2/demo-api/tags/list
{
  "name": "demo-api",
  "tags": [
    "20230123155634-develop",
    "20230123155840-develop"
  ]
}
반응형

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

[Jenkins] docker container 무중단 배포  (0) 2023.01.23
[Jenkins] Ansible 연동  (0) 2020.12.28
[Jenkins] Jenkins Pipeline  (0) 2020.12.28
[Jenkins] Jenkinsfile  (0) 2020.12.28
[Jenkins] Selenium 테스트 설정  (0) 2019.11.24

+ Recent posts