사이드 개발하고 있는데 ㅜㅜ FE한테 원활하게 API제공을 해주기 위해서 CI/CD 구축을 해보려고 한다.
jenkins에서 너무 잘 제공해주고 있어 설치부분은 넘어가겠다. 👉🏻 jenkins
AWS에서 제공하는 EC2 서비스를 이용하고 있는데..
- 프리티어 메모리가 1GB라서 Jenkins를 통해서 Gradle Build할 때 ㅜㅜ 자꾸 멈치고 오래걸리는 현상 때문에 AWS EC2서버를 중지하고 재시작 해야되는일이 많아서 탄력적IP를 사용해서 테스트해보다보니ㅜㅜ 좋은게 있었다.
Swap 메모리 설정을 통해서 해결하자!! 👉🏻 AWS에서 쉽게 적어주셨다.
여기서 잘 설명해주시니 밑에 링크를 참고하자!
[AWS] Swap File을 이용해 EC2 메모리 부족 현상을 해결해보자
작업을 하던 중 aws ec2 메모리 부족현상이 발생했다. 우리가 사용하고 있는 t4g.micro 인스턴스 유형은 램이 1GB였고, 이는 메모리 부족현상을 충분히(?) 볼 수 있을 정도로 작은 양의 메모리였다. 이
kth990303.tistory.com
AWS 보안 그룹 설정하기
ssh: CD부분에서 jenkins에서 복사한 .jar파일 다른 AWS EC2환경에 복사하고 접속해서 실행하기 위해서
port: 80, 443 👉🏻 gabia에서 사용한 도메인은 80,443 포트는 지원하지만 다른 포트는 지원하지 않는거 같았다.
iptables를 이용해서 redirect할 수 있지만 따로 방화벽을 설치해서 설정해주면 redis, mariaDB 도커까지 설정해줘야 되는데 나중에 Nginx를 이용해서 BLUE/GREEN 배포를 할 수 있어서 이용하려고 한다.
[tomcat] 가비아 포트번호, url 포트번호 숨기기 redirect
환경 centos7 spring 서버 톰캣 gcp 가비아도메인 문제점 솔직히 원인은 잘 모르겠다. ( 아직 제대로 파악하려 노력하지 않음 ) 80포트로 서버를 구동해두면 이틀정도 후에 서버가 죽었다. 서버의 성능
wfreud.tistory.com
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를 설정해주었다.
젠킨스와 Github ssh 연동하기
젠킨스와 Github 연동시에 사용자명과 비밀번호 인증방식은 보안상 추천하지 않는 방식입니다. 물론 테스트 용도로만 사용하는건 문제 없지만, 실제 서비스에서 그렇게 사용하는 회사는 없습니
jojoldu.tistory.com
이후 git에 Push했다고 알람이 오면 실행하기 위해 Webhook을 등록했다.
📌 Setting ➡️ Webhook ➡️ Add webhook
Payload URL ➡️ https://{젠킨스 접속 주소}/github-webhook/ (마지막에 /게 중요하다고 들었던거 같다.)
Content type ➡️ application/json 을 선택
- 나머지는 자기가 맞는 특성을 선택하면 될거같다.
Nginx 설정을 통해서 80포트 ➡️ 내 서버포트 8088로 설정해주면
[혼자 구현하는 웹서비스] 10. 24시간 365일 중단 없는 서비스를 만들자
*이 글은 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스' (프리렉, 이동욱 저) 를 공부하며 내용을 정리한 글입니다. *내용을 따라가며 쓴 글이라 책과 흐름이 겹칠 수 있으나, 최대한 내용을 이해
katfun.tistory.com
Amazon Linux 2에 nginx 설치
Amazon Linux 2 OS의 EC2에서 nginx 설치하는 방법에 대해서 알아보겠습니다. Amazon Linux 2에서는 yum을 통한 nginx 설치가 지원되지 않습니다. 일반적인 yum 을 통한 설치 시 에러가 발생하는 것을 볼 수 있
longtermsad.tistory.com
Gradle 빌드이후 deploy.sh를 실행하면서 구동중인 어플리케이션을 Kill하고 실행하는것을 볼 수 있다.
test코드가 점점 많아지면서 좀더 효율적으로 build될 수 있도록 해야겠다..! 부족한점이 많지만 서비스하기전에 FE를 위해서 나도 편해지고 좋은거 같다.
reference
[DevOps] Jenkins를 통한 CI/CD 구축기 2편 (Backend CI/CD 구축)
🔗 연관 게시글 CI/CD란? [DevOps] Jenkins를 통한 CI/CD 구축기 1편 (Jenkins 설치) [DevOps] Jenkins를 통한 CI/CD 구축기 2편 (Backend CI/CD 구축) [DevOps] Jenkins를 통한 CI/CD 구축기 3편 (Frontend CI/CD 구축) [DevOps] Jenkins
seongwon.dev
'클라우드' 카테고리의 다른 글
AWS/EC2 Redis 설정하기 (2) | 2023.05.16 |
---|---|
AWS/EC2 MySQL 설정하기 (0) | 2023.05.15 |
AWS/EC2 Spring Boot 오류들... (0) | 2023.05.15 |