본문 바로가기

Docker,Jenkins

Jenkins를 이용한 PIPELINE구축 및 설계

728x90

어딜 찾아봐도 sh shell을 이용해서 파이프라인을 구축을하였다.

즉 , EC2서버에 jenkins를 올려서 사용한것 같다. 하지만 나는 다른방법으로 구축을 해보았다.

Plain하게 window환경에서 jenkins를 설치하고 github에서 변경사항이 발생할 시 webwook을 이용해서 

작동하게 해놓았다.

 

위에 있는 Jenkins 위치만 변경해주면 내가 만든 pipe라인과 흡사한 구조를 갖게된다.

 

 

1.GitHub access token 생성

2.GitHub 개인 레포지토리 webhook설정

  • Payload URL - 젠킨스 서버 주소에 /github-webhook/ 경로를 추가하여 입력합니다.
  • http://locahost:8080를 입력하시면 정상적으로 동작하지 않습니다.
  • http://public-ip:8080 같이 공개 IP를 사용하는 경우에도 정상적으로 동작하지 않습니다.
  • ngrok 어플리케이션을 통해 외부에서 접근할 수 있는 도메인을 사용합니다.
  • Content type - application/json 타입을 사용합니다.

3. Gredentials 만들기

  • 패스워드 영역에 GitHub 비밀번호가 아닌 액세스 토큰 정보를 입력합니다.
  • GitHub 연결시 UserName과 Password로 만든 Credential만 사용 가능한 경우가 있습니다.
  • Credential 관련 이슈 - jenkinsci/ghprb-plugin#534

4.젠킨스 파이프라인 프로젝트 생성

  • 파이프라인 설정Permalink 체크 박스를 선택합니다.
  • GitHub project
  • GitHub hook trigger for GITScm polling
  • 아래 스크립트를 Pipeline 스크립트 영역에 붙여넣습니다. (Declarative 방식)
  • Github에서 다운받을 브랜치와 레포지토리 정보를 입력합니다.
  • 이전 단계에서 만든 github_access_token Credential을 추가합니다.

5. 파이프라인 생성에 성공하였으면 Build Now 버튼을 눌러 빌드를 실행합니다.

 

docker push 중 denied: requested access to the resource is denied 다음과 같은오류가 발생하였다

 

해결방안

  • docker login -u "아이디" -p "비번!" docker.io 해당하는명령어를 입력해주면 정상적으로 작동 !

 

작동순서를 간단하게 요약하자면

 

  • 깃허브 main 브랜치에 변경사항 발생
  • 깃허브가 웹훅을 Jenkins 서버에 전달
  • Jenkins 서버는 main 브랜치를 pull 받아 gradle을 통해 test 및 build 명령 실행
  • Gradle이 test 및 build 수행 후 Jar 파일 생성
  • 생성된 Jar 파일을 Docker image로 build
  • 생성된 Docker image를 Dockerhub로 전송
  • Jenkins가 SSH를 통해 API 서버가 존재하는 EC2 Instance에 접속, SSH 상에서 Dockerhub를 통해 image를 pull
  • 계속해서 SSH 상에서 Docker를 통해 컨테이너 실행

 

전체 다올리면 너무 방대하니 ... build 부분과 ssh서버 접속 및 push하는 부분 소스코드 

 

Window 환경 Jenkins 파이프라인

 

Docker build

  // gradle build
        stage('Bulid Gradle') {
          agent any
          steps {
            echo 'Bulid Gradle'
            dir ('.'){
                bat """
                ./gradlew clean build --exclude-task test
                """
            }
          }
          post {
            failure {
              error 'This pipeline stops here...'
            }
          }
        }

 

 

Docker push

저는 ssh접속하는데 시간이 꽤걸렸습니다. bat으로 들어가는 방법이 서칭을 해도 잘 나오질 않더군요 ...

   // docker push
        stage('docker push') {
          agent any
          steps {
            echo 'docker push'


           
            bat """
                ssh -T -i "authorized_keys.pem" ec2 ssh 클라이언트 접속주소 whoami


               
               
            """
             bat """
                ssh -T -i "authorized_keys.pem"  docker pull kimminwoo1234/simple-spring-boot:5
ec2 ssh 클라이언트 접속주소

               
               
            """

           
          }
          post {
            failure {
              error 'This pipeline stops here...'
            }
          }
        }

EC2 위에 jenkins 를 올려 사용한 shell script파일

 

pipeline {
    agent any

    environment {
        imagename = "이미지이름"
        registryCredential = 'docker-hub'
        dockerImage = ''
    }

    stages {
        stage('Prepare') {
          steps {
            echo 'Clonning Repository'
            git url: '깃헙주소',
              branch: 'main',
              credentialsId: 'github'
            }
            post {
             success {
               echo 'Successfully Cloned Repository'
             }
           	 failure {
               error 'This pipeline stops here...'
             }
          }
        }
       
        stage('Bulid Gradle') {
          steps {
            echo 'Bulid Gradle'
            dir('.'){
                sh '''
                    cd /var/jenkins_home/workspace/jobhunt/devTest
                    chmod +x gradlew
                    ./gradlew clean build
               
                '''
            }
          }
          post {
            failure {
              error 'This pipeline stops here...'
            }
          }
        }

       
        stage('Bulid Docker') {
          steps {
            echo 'Bulid Docker'
            sh"""
                cd /var/jenkins_home/workspace/jobhunt/devTest
                docker build -t kimminwoo1234/simple-spring-boot:6 .  
            """
           
           
          }
          post {
            failure {
              error 'This pipeline stops here...'
            }
          }
        }
       
        stage('Push Docker') {
          steps {
            echo 'Push Docker'
             sh"""
                 docker login -u 아이디 -p 비밀번호
                 docker push kimminwoo1234/simple-spring-boot:6
             """
          }
          post {
            failure {
              error 'This pipeline stops here...'
            }
          }
        }
       
         stage('Docker Run') {
            steps {
                echo 'Pull Docker Image & Docker Image Run'
                sshagent (credentials: ['ssh']) {
                     sh "ssh -o StrictHostKeyChecking=no 우분투@ip주소 'docker pull kimminwoo1234/simple-spring-boot:6'"
                   
                    sh "ssh -o StrictHostKeyChecking=no 우분투@ip주소 'docker ps -q --filter name=simple-spring-boot'"

                    sh "ssh -o StrictHostKeyChecking=no 우분투@ip주소 'docker rm -f \$(docker ps -aq --filter name=simple-spring-boot)'"

                    sh "ssh -o StrictHostKeyChecking=no 우분투@ip주소 'docker run -d --name simple-spring-boot -p 8888:8080 --restart=unless-stopped kimminwoo1234/simple-spring-boot:6'"
                   
                    sh "ssh -o StrictHostKeyChecking=no 우분투@ip주소 'docker rmi -f \$(docker images -q -f dangling=true)'"
                }
            }
        }

    }
}
728x90