내 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 연결
포트는 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은 권한 설정하는 부분을 실행해줌.
Tasks는 실행할 jar 파일 명시
저장 !
jar 파일을 만들어보자 !
빌드
.jar 파일 다운로드
-> 나중에는 jar를 ec2에 밀어넣기
.jar 파일 실행 테스트
homd으로 이동 -> workspace로 이동
workspace 밑에 프로젝트 명으로 폴더가 생성되고, genkins가 그 안에서 특정 repo에 있는 코드를 clone한다.
그리고 build 과정을 수행해 build/libs 폴더 아래 jar 파일이 생성한다.
Polling 기능 써보기
🎈 Poll 적용 전
main 브랜치에 변경이 발생해도 자동으로 build가 안됨. 수동으로 build 시켜줘야 함.
🎈 Poll 적용 후
genkins가 1분마다 github을 체크해, 소스 코드에 변경이 있었는지 확인한다.
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'
}
}
}
}
- jenkins를 통한 s3 배포
- nodejs plugin 설치
- AWS CLI 수동 설치
- 내부 접속 : docker exec -u 0 -it jenkins-server /bin/bash
- mkdir awscli && cd awscli
- curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
- unzip awscliv2.zip
- ./aws/install
위 명령어 차례대로 실행
빌드 성공 !
s3에 front가 잘 배포됐다 !