EC2 두개로 CI 구성

덤벨로퍼·2024년 2월 22일
0

개인공부

목록 보기
3/11
post-thumbnail

instance 2개
1. jenkins server - t2.2xlarge

  • jenkins 설치
  1. web server (jenkins 설치 X ) - t2.micro
  • jre 설치
  • jar 실행

인스턴스 2개 생성

jenkins server 서버용 인스턴스에 jenkins 설치

docker run --name myjenkins --privileged -p 8080:8080 jenkins/jenkins:lts-jdk17

젠킨스 설정

Deshboard -> 젠킨스관리 -> System 에서 Publish over SSH 설정 !

  • Publish over SSH는 플러그인에서 설치가능

web server 용 ec2의 키를 넣어줌

ec2_micro (web server 용 ec2)

젠킨스 item 구성

github 연동과 webhooks 를 위해 체크

ec2_micro (web server 용 ec2) 에서 설정

  1. 우선 실행을 위해 jdk 설치 ( jps 명령어를 위해 jre가 아닌 jdk를 설치)
  2. jar 파일을 실행하기 위한 스크립트 작성
#!/bin/bash

echo "Start Spring Boot Application!"
CURRENT_PID=$(ps -ef | grep java | grep dokotlin | awk '{print $2}')
echo "$CURRENT_PID"

 if [ -z $CURRENT_PID ]; then
echo ">현재 구동중인 어플리케이션이 없으므로 종료하지 않습니다."

else
echo "> kill -9 $CURRENT_PID"
kill -9 $CURRENT_PID
sleep 10
fi
 echo ">어플리케이션 배포 진행!"
nohup java -jar /home/ubuntu/deploy/step06_citest-0.0.1-SNAPSHOT.jar >> /home/ubuntu/deploy/logs/javaApp.log &

파이프라인 스크립트

고급 버튼을 클릭후 Verbose를 체크하면 빌드할 때 상세 내역이 표시되므로 유용!

  • Source files: 내가 전송할 파일의 위치를 적습니다. Jenkins의 workspace 기준으로 적게 되는데 git pull로 당겨온 스프링 부트 앱의 루트 경로라고 생각하면 됩니다. jar 파일의 위치는 build/libs 하위에 있습니다. 이 경로를 jar 파일이라고 명시를 해줍니다.
  • Remote Directory: 파일을 전송할 원격 서버의 디렉토리를 명시하는 부분입니다. 여기서 주의할 점은 위에서 SSH 서버 설정하는 부분에서 이미 경로(/home/ubuntu)를 적어줬기 때문에 그 밑의 경로부터 적어야 합니다. 저는 /deploy로 적었기 때문에 빌드 후에 ec2 서버의 /home/ubuntu/deploy 하위로 jar 파일이 배포가 됩니다.
  • Exec command: 파일 전송 후 실행할 명령어를 입력합니다. 절대 경로로 ec2 루트경로(/home/ubuntu/start_server.sh)부터 적었습니다.

최종 스크립트

pipeline {
    agent any

    stages {
        stage('git 연동') {
            steps {
                echo 'start **********'
                git branch: 'main', 
                credentialsId: '아이디Id', 
                url: 'https://github.com/Dumbveloper/fisa240220.git'
                echo 'end **********'
            }
        }
        stage('list view') {
            steps {
                echo 'view list *****'
                sh 'whoami'
                sh 'pwd'
                sh 'ls -al'
                echo 'view list *****'
            }
        }
        stage('build') {
            steps {
                echo 'build start *****'
                sh './gradlew build'
                echo 'build end *****'
            }
        }
        stage('execute on ec2') {
            steps {
                script {
                    sshPublisher(
                        publishers: [
                            sshPublisherDesc(
                                configName: 'ec2_micro',
                                transfers: [
                                    sshTransfer(
                                        cleanRemote: false,
                                        excludes: '',
                                        execCommand: 'sh /home/ubuntu/start_server.sh',
                                        execTimeout: 120000,
                                        flatten: false,
                                        makeEmptyDirs: false,
                                        noDefaultExcludes: false,
                                        patternSeparator: '[, ]+',
                                        remoteDirectory: '/deploy',
                                        remoteDirectorySDF: false,
                                        removePrefix: 'build/libs',
                                        sourceFiles: 'build/libs/*SNAPSHOT.jar'
                                    )
                                ],
                                usePromotionTimestamp: false,
                                useWorkspaceInPromotion: false,
                                verbose: true
                            )
                        ]
                    )
                }
            }
        }
    }
}

결과가 잘 돌고 있는 것을 확인 할 수 있음


결과확인


jps 명령어 실행시 정상작동 확인

profile
💪 점진적 과부하로 성장하는 개발자

0개의 댓글