본문 바로가기

카테고리 없음

jenkins

내 PC -> github -> jar 생성 -> ssh 사용한 ec2 배포

 

내 PC에 jenkins 설치 -> github 체크 -> jenkins가 소스코드 clone -> jar 생성 및 ec2 배포

 

jenkins 다운로드

 

도커 컨테이너를 통해 설치

 

 

 

localhost8080으로 들어가서 해당 비밀번호 입력

 

install suggested plugins

 

 

 

 

Freestyle로 실습

 

Freestyle : UI 기반

Pipeline : 스크립트 기반

 

 

지금 빌드 버튼이 github에서 소스 코드를 clone해와서 jar 파일로 빌드한 후에 ec2로 넣어야 함.

jenkins는 트리거 발동(git action에서는 on:push:branch:main으로 쉽게 진행)에 따라 자동화 시키기 까다로움.

github에서 web hook을 통해 소스 코드가 변경되면 jenkins에서 clone을 다시 받으라고 알려줘야 한다.

그치만 우리 아키텍처 설계로는 어려웡... domain이 localhost가 아니고 public한 네트워킹이 가능한 공간이어야행....

= 1. jenkins를 ec2에 올려서 github webhook에 그 주소를 등록하면 된다. 추가적인 설정들이 필요하다.

= 2. polling을 통해 jenkins가 github에게 특정 시간마다 계속 변경사항이 발생했는지 물어본다.

 

 

배포할 간단한 백엔드 프로젝트 생성 및 github 연결

https://github.com/yujeong-shin/jenkins_build_test/commit/f5578c072aac45e6449402220f72bb9d6ea92d16

 

포트는 8081로 바꿔줬기 때문에 아래처럼 테스트.

 

 

github access 토큰 발급

 

jenkins에 private repo를 clone 받을 수 있는 권한을 설정해주자.

 

계정 Settings -> Developer Settings -> Personasl access tokens

 

발급된 토큰 : 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

 

 

username : github id

Password : 토큰값

ID : 구분자

 

 

 

Use Gradle Wrapper : 프로젝트 안에 involve 된 버전을 사용

Make gradlew executable은 권한 설정하는 부분을 실행해줌.

RUN chmod +x ./gradlew

 

Tasks는 실행할 jar 파일 명시

RUN ./gradlew bootJar

 

저장 !

jar 파일을 만들어보자 !

 

빌드

 

.jar 파일 다운로드

-> 나중에는 jar를 ec2에 밀어넣기

 

 

.jar 파일 실행 테스트

 

 

 

homd으로 이동 -> workspace로 이동

 

 

workspace 밑에 프로젝트 명으로 폴더가 생성되고, genkins가 그 안에서 특정 repo에 있는 코드를 clone한다.

그리고 build 과정을 수행해 build/libs 폴더 아래 jar 파일이 생성한다.

 

 

Polling 기능 써보기

 

🎈  Poll 적용 전

main 브랜치에 변경이 발생해도 자동으로 build가 안됨. 수동으로 build 시켜줘야 함.

 

README 추가

 

 

🎈 Poll 적용 후

 

genkins가 1분마다 github을 체크해, 소스 코드에 변경이 있었는지 확인한다.

README 변경

 

1분 후 2번째 Build가 자동으로 돌아간다 !!!!

 

 

 

Pipeline을 사용해보자 !

 

Freestyle은 커스텀 자유도가 떨어지기 때문에 Pipeline으로 다시 실습해보자.

 

 

Pipeline script 작성

더보기

pipeline{
    // 어떠한 agent로 실행해도 된다는 의미
    agent any
    triggers{
        pollSCM('*/1 * * * *')
    }
    stages{
        stage('Checkout'){
            steps{
                git url: 'https://github.com/yujeong-shin/jenkins_build_test.git',
                credentialsId: 'jenkins_token',
                branch: 'master'
            }
        }
        stage('Setup jdk 11'){
            steps{
                script{
                    // JAVA 11 버전을 내가 설치한 버전으로 설정하겠다고 tool에서 명시한 값 사용용
                    def javaHome = tool name: 'JDK11', type: 'jdk'
                    env.JAVA_HOME = "${javaHome}"
                    env.PATH = "${javaHome}/bin:${env.PATH}"
                }
            }
        }
        stage('Build with gradle'){
            steps{
                // ''' 사이에서 multi-line의 linux 명령어 수행
                sh '''
                chmod +x ./gradlew || true
                ./gradlew bootJar
                '''
            }
        }
        stage('Archive jar'){
            steps{
                // jar build가 성공할 때만 지정한 폴더 경로에 jar 생성
                archiveArtifacts artifacts: '**/*.jar', onlyIfSuccessful: true
            }
        }
    }
}

 

 

1. credentialsId 확인해서 credentialsId 값 넣기

 

 

2. 내가 설치할 JDK 설정하기

Tools > JDK installations > JDK11추가

 

빌드 성공 !

 

 

 

생성된 jar를 ec2로 전달하자 !

 

SSH 플러그인 설치

 

 

 

 

private key - enter directly 체크 - pemkey 복붙

 

생성 완료 !

 

 

새로운 Item 생성

이름 : Pipeline script

ec2 한대 생성 -> 생성한 ssh 키 적용 후 아래 스크립트 실행 ?????

더보기

pipeline{
    // 어떠한 agent로 실행해도 된다는 의미
    agent any
    triggers{
        pollSCM('*/1 * * * *')
    }
    stages{
        stage('Checkout'){
            steps{
                git url: 'https://github.com/yujeong-shin/jenkins_build_test.git',
                credentialsId: 'jenkins-token',
                branch: 'master'
            }
        }
        stage('setup jdk 11'){
            steps{
                script{
                    def javaHome = tool name: 'JDK11', type: 'jdk'
                    env.JAVA_HOME = "${javaHome}"
                    env.PATH = "${javaHome}/bin:${env.PATH}"
                }
            }
        }
        stage('build with gradle'){
            steps{
                sh '''
                chmod +x ./gradlew || true
                ./gradlew bootJar
                '''
            }
        }
        stage('deploy to EC2'){
            steps{
                sshagent(['ec2-ssh-key']){
                    sh '''
                    scp -o StrictHostKeyChecking=no /var/jenkins_home/workspace/pipeline_jar_build_ec2/build/libs/*.jar ubuntu@ec2-3-38-182-23.ap-northeast-2.compute.amazonaws.com:/home/ubuntu/
                    ssh -o StrictHostKeyChecking=no ubuntu@ec2-3-38-182-23.ap-northeast-2.compute.amazonaws.com 'if ! type java > dev/null; then sudo apt update && sudo apt install openjdk-11-jdk -y; fi'
                    ssh -o StrictHostKeyChecking=no ubuntu@ec2-3-38-182-23.ap-northeast-2.compute.amazonaws.com 'sudo killall java || true'
                    ssh -o StrictHostKeyChecking=no ubuntu@ec2-3-38-182-23.ap-northeast-2.compute.amazonaws.com 'sudo nohup java -jar /home/ubuntu/*.jar > /home/ubuntu/app.log 2>&1 &'
                    '''
                }
            }
        }
    }
}

 

ㅇ...일단 에러 오케이..

 

cmd에서 ssh로 로그인 후 세 가지 명령어 결과 확인

1. ps -ef | grep java

2. cat app.log

3. curl localhost:8081/test

 

이렇게 나온다옹

 

 

 

s3 배포 자동화

 

nodejs 플러그인 설치

 

tools에 nodejs 추가

 

 

github에서 spring_ordering_frontend 주소 복사 후

pipeline 새로 만들어서 스크립트 작성

더보기

pipeline{
    // 어떠한 agent로 실행해도 된다는 의미
    agent any
    triggers{
        pollSCM('*/1 * * * *')
    }
    tools{
        // nodejs 플러그인 설치 및 nodejs20에 대한 version설정
        nodejs 'nodejs20'
    }
    stages{
        stage('Checkout'){
            steps{
                git url: 'https://github.com/yujeong-shin/spring_ordering_frontend.git',
                credentialsId: 'jenkins-token',
                branch: 'master'
            }
        }
        stage('npm install'){
            steps{
                sh 'npm install'
            }
        }
        stage('npm run build'){
            steps{
                sh 'npm run build'
            }
        }
    }
}

 

성공 ~

 

 

jenkins 서버에서 홈 > workspace 아래 생성한 Item 명으로 폴더가 생성된 것을 확인

 

 

s3에 올리기위해 IAM 계정에서 access key발급

 

plugin 설치

 

IAM 사용자 생성

 

 

해당 사용자 액세스 키 만들기

 

액세스 키 : AKIASOJHOEEQI6MOK3AL

비밀 액세스 키 : sZ/LfTCikDyz/N2/v1sJMB3XheBWXfu5gB3wZy1Y

 

 

두 키에 대해 jenkins에서 credentials 생성

 

 

s3 버킷 생성 및 버킷정책 편집

 

버킷정책

더보기

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadForBucket",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::jenkins-yj-bucket/*"
        }
    ]
}

 

 

스크립트 수정

더보기

pipeline{
    // 어떠한 agent로 실행해도 된다는 의미
    agent any
    triggers{
        pollSCM('*/1 * * * *')
    }
    tools{
        // nodejs 플러그인 설치 및 nodejs20에 대한 version설정
        nodejs 'nodejs20'
    }
    environment{
        AWS_ACCESS_KEY_ID = credentials('AWS_ACCESS_KEY_ID')
        AWS_SECRET_ACCESS_KEY = credentials('AWS_SECRET_ACCESS_KEY')
        AWS_REGION = 'ap-northeast-2'
    }
    stages{
        stage('Checkout'){
            steps{
                git url: 'https://github.com/yujeong-shin/spring_ordering_frontend.git',
                credentialsId: 'jenkins-token',
                branch: 'master'
            }
        }
        stage('npm install'){
            steps{
                sh 'npm install'
            }
        }
        stage('npm run build'){
            steps{
                sh 'npm run build'
            }
        }
        stage('aws cli configure'){
            steps{
                sh '''
                aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
                aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
                aws configure set default.region $AWS_REGION
                '''
            }
        }
        stage('deploy to s3'){
            steps{
                sh 'aws s3 cp ./dist s3://jenkins-yj-bucket/ --recursive'
            }
        }
    }
}

 

위 명령어 차례대로 실행

 

 

빌드 성공 !

 

s3에 front가 잘 배포됐다 !