사이드 개발하고 있는데 ㅜㅜ FE한테 원활하게 API제공을 해주기 위해서 CI/CD 구축을 해보려고 한다.
jenkins에서 너무 잘 제공해주고 있어 설치부분은 넘어가겠다. 👉🏻 jenkins
AWS에서 제공하는 EC2 서비스를 이용하고 있는데..
- 프리티어 메모리가 1GB라서 Jenkins를 통해서 Gradle Build할 때 ㅜㅜ 자꾸 멈치고 오래걸리는 현상 때문에 AWS EC2서버를 중지하고 재시작 해야되는일이 많아서 탄력적IP를 사용해서 테스트해보다보니ㅜㅜ 좋은게 있었다.
Swap 메모리 설정을 통해서 해결하자!! 👉🏻 AWS에서 쉽게 적어주셨다.
여기서 잘 설명해주시니 밑에 링크를 참고하자!
AWS 보안 그룹 설정하기
ssh: CD부분에서 jenkins에서 복사한 .jar파일 다른 AWS EC2환경에 복사하고 접속해서 실행하기 위해서
port: 80, 443 👉🏻 gabia에서 사용한 도메인은 80,443 포트는 지원하지만 다른 포트는 지원하지 않는거 같았다.
iptables를 이용해서 redirect할 수 있지만 따로 방화벽을 설치해서 설정해주면 redis, mariaDB 도커까지 설정해줘야 되는데 나중에 Nginx를 이용해서 BLUE/GREEN 배포를 할 수 있어서 이용하려고 한다.
port: 6379 👉🏻 redis, 3306 👉🏻 mariaDB
port: 8080 👉🏻 jenkins, 8088 👉🏻 spring-server
- (이제보니 하나 더있었다.. 우선 보안 그룹해주고 필요한 EC2마다 정리할 필요가 있을거 같다,,)
jenkins를 실행하자
서버에 접속해서 8080포트로 확인해보면
Password를 입력해주자 만약 찾지 못했다면 해당 비밀번호로 접속해 가입해주자
비밀번호를 입력하고 플로그인 설치해주자 Gradle도 같이 설치될거다
유저 설정해주면 젠킨스가 제공하는 웹 인터페이스를 이용할 수 있다. 이후 Pipeline을 구축할거다.
Pipeline script를 이용하자.!! 밑에 Pipeline Syntax를 누르면 Jenkins에서 작성해주기 떄문에 쉽게 작성할 수 있다.
작성한 스크립트
- 우선 gradle이 되는지 확인하고 git Clone도 되는지 확인하고 순서대로 조금씩 짤라서 테스트하면서 해보는게 좋은거 같다.
- 처음에 테스트에 시간이 너무 지나가서 테스트는 skip했다.
pipeline {
agent any
tools {
gradle 'gradle'
}
stages {
stage('Git Clone') {
steps {
git branch: 'main', credentialsId: 'xxx.xxx', url: 'https://github.com/zizon-developers/now-where-server.git'
}
}
stage('Gradle Build') {
steps {
dir("./user-service") {
sh "./gradlew clean build --exclude-task test"
}
}
}
stage('Deploy') {
steps {
sshagent(credentials: ['aws_key']) {
sh '''
ssh -o StrictHostKeyChecking=no ec2-user@xxx.xxx uptime
scp /var/lib/jenkins/workspace/now-where-server/user-service/build/libs/user-service-0.0.1-SNAPSHOT.jar ec2-user@xxx.xxx:/home/ec2-user/app/step1
ssh -t ec2-user@xxx.xxx ./deploy.sh
'''
}
}
}
}
}
대시보드 ➡️ Jenkins 관리 ➡️ Tools에 들어가서 내리다 보면 Gradle이 있다. 없으면 밑에 SSH Agent 설치한걸로 Gradle설치해주자
- spring에서 개발할 때 사용한 gradle 버전과 맞추어주자
gradle-wrapper.properties에 들어가서 보면 distributionUrl에 버전이 적혀있다.
나는 이미 SSH Agent를 설치했기 때문에 Installed plugins에 있지만 설치가 되어있지 않으면 Available plugins에서 설치하자
이방법을 생각한 이유는 다른 프로젝트들을 보면 AWS를 이용해서 S3, CodeDeploy를 이용해서 개발하는거 같았지만,, ㅜㅜ 아직 잘 모르겠어서 급한대로 SSH를 이용해서 .Jar 파일을 복사해서 실행해주는 거만 생각이 들었다.
Credentials 설정해주자!!
밑에 경로로 들어와서 작성해보자
kind는 SSH Username With private key로 설정해주자
Private Key는
내가 인스턴스를 만들었을 때 .pem파일을 local에 저장해두었다.
이 .pem 파일에 정보를 봐보자
//입력
cat {key 이름}.pem
//결과
-----BEGIN RSA PRIVATE KEY-----
{키 값들}
-----END RSA PRIVATE KEY-----
private key에 cat 명령어 결과를 ----BEGIN 부터 --- END 줄까지 전부 다 복사해서 사용해야 된다.!!!!
이후 스프링을 실행할 곳에서 deploy.sh파일을 작성해주었다.
#!/bin/bash
REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=now-where-server/user-service
echo ">현재 경로"
cd $REPOSITORY/$PROJECT_NAME/
echo ">step1 디렉토리로 이동"
cd $REPOSITORY
echo "> 현재 구동중인 애플리케이션 pid 확인"
pid=$(pgrep -f ${REPOSITORY})
if [ -n "${pid}" ]
then
kill -15 ${pid}
echo kill process ${pid}
else
echo no process
fi
echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"
nohup java -jar -Dspring.config.location=file:/home/ec2-user/app/resources/ -Dspring.profiles.active=real1 $REPOSITORY/$JAR_NAME >> application.log 2> /dev/null &
실행중일 때 git main브랜치에 push를 해서 jenkins가 실행될 때 이미 가동중인 서버가 있으면 종료시키고 다시 서버를 올리기 위함이다.
/home/ec2-user/app/resources 디렉토리 안에 .yml 파일들을 이용할거고 active속성을 real1 설정하고 백그라운드로 실행하기 위해서 작성했다.
이동욱님 블로그를 보면서 credentials를 설정해주었다.
이후 git에 Push했다고 알람이 오면 실행하기 위해 Webhook을 등록했다.
📌 Setting ➡️ Webhook ➡️ Add webhook
Payload URL ➡️ https://{젠킨스 접속 주소}/github-webhook/ (마지막에 /게 중요하다고 들었던거 같다.)
Content type ➡️ application/json 을 선택
- 나머지는 자기가 맞는 특성을 선택하면 될거같다.
Nginx 설정을 통해서 80포트 ➡️ 내 서버포트 8088로 설정해주면
Gradle 빌드이후 deploy.sh를 실행하면서 구동중인 어플리케이션을 Kill하고 실행하는것을 볼 수 있다.
test코드가 점점 많아지면서 좀더 효율적으로 build될 수 있도록 해야겠다..! 부족한점이 많지만 서비스하기전에 FE를 위해서 나도 편해지고 좋은거 같다.
reference
'클라우드' 카테고리의 다른 글
AWS/EC2 Redis 설정하기 (2) | 2023.05.16 |
---|---|
AWS/EC2 MySQL 설정하기 (0) | 2023.05.15 |
AWS/EC2 Spring Boot 오류들... (0) | 2023.05.15 |