📌 CI/CD

CI (지속적 통합 Continuous Integration)

- 작업한 코드를 주기적(자동적)으로 빌드하고 테스트하여 레포지토리에 통합하는 것

- 코드의 변경사항이 기존 코드에 버그를 일으키지 않는지, 잘 호환되는지를 자동으로 검증

- 코드 변경사항을 작은 단위로 지속적으로 머지(병합)하여 충돌상황을 미리 예방할 수 있음

 

CD (지속적 제공 Continuous Delivery / 지속적 배포 Continuous Deployment)

- 지속적 제공 (Delivery) : 배포 전 단계까지 자동화, 수동으로 배포 승인

- 지속적 배포 (Deployment): 테스트 통과 시 운영 환경까지 자동으로 배포

 

 

 

📌 Jenkins

 

Jenkins

Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software

www.jenkins.io

 

젠킨스는 소프트웨어의 빌드, 테스트, 배포 자동화를 간편하게 만들어주는 CI/CD 도구다. 

Docker 이미지 파일, War 파일, 설치프로그램 등 다양한 형태로 배포되므로 원하는 배포 파일을 다운 받아 사용하면 된다.

 

 

📌 AWS EC2 (Amazon Linux)에 Jenkins 설치하기

0. 전제

- EC2 인스턴스가 생성되어 있으며 보안 그룹이 아래처럼 설정된 상태여야 한다. 

- 보안그룹은 인스턴스 생성 시 설정하거나 설정 후 편집할 수 있다. 

 

0.1 보안그룹 포트 설명

- 80 (HTTP) : 웹 접근용. 도메인 연결 및 HTTP를 통한 서비스 접근 허용 목적의 포트

- 8080 : 젠킨스 웹 UI 접근용 포트. 젠킨스 설치 후 초기 설정 및 플러그인 설치 시 웹 UI 필요

- 22 (SSH) : EC2 서버 원격 접속용 포트. 터미널에서 SSH 명령어 사용하여 접근 

 

0.2 EC2 인스턴스 생성 방법 참고

 

[AWS] EC2 인스턴스 생성 및 접속

📌 준비사항1. AWS 회원가입 (프리티어 이용)2. Ubuntu 설치 📌 AWS EC2 인스턴스 생성하기1. AWS 로그인 후 Amazon EC2 혹은 콘솔에 로그인 선택 Amazon EC2 선택했을 경우, Amazon EC2 시작하기 선택  2.

apricoding.tistory.com

 

 

1. EC2 인스턴스 접속

ssh -i "key.pem" ec2-user@ec2-public-ip

 

 

2. Java 설치

- 젠킨스는 Java 애플리케이션으로 Java를 먼저 설치해야한다.

- 설치 가능한 패키지 중 java를 포함한 패키지 목록 검색

sudo yum list | grep java

 

- 패키지 최신 업데이트 및 Java 설치 (Java 7, 8, 11, 17, 21 지원 가능 / 11 이상 권장) 

sudo yum update -y
sudo yum install java-17-amazon-corretto-devel.x86_64 -y

 

- Java 삭제 시

sudo yum remove "설치한버전" -y
sudo yum remove java* -y

 

 

3. Jenkins 설치

- Jenkins 레포지토리 추가

sudo wget -O /etc/yum.repos.d/jenkins.repo \
    https://pkg.jenkins.io/redhat-stable/jenkins.repo

 

- Jenkins key 파일 추가

sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key

 

- Jenkins 설치

sudo yum install jenkins -y

 

 

4. Jenkins 시작

sudo systemctl start jenkins

 

- EC2 인스턴스 시작 시 자동 실행 설정

sudo systemctl enable jenkins

 

- 상태 및 로그 확인

sudo systemctl status jenkins
sudo journalctl -u jenkins -f

 

 

5. Jenkins 구성

- 브라우저에서 ec2 public ip:8080 포트로 접속 (예: 53.231.222.xx:8080)

- 아래 페이지가 정상적으로 출력되는지 확인

 

- 터미널에 아래 명령어 입력하여 비밀번호 확인 후 복사하여 사용

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

 

- 제안된 플러그인 설치

 

- 관리자 생성

 

- Jenkins 화면 확인

 

- 좌측 메뉴 - Jenkins 관리 - 플러그인

 

- ec2 검색 후 Amazon EC2 플러그인 설치

 

- 새 클라우드 생성

 

- AWS 자격증명 (Access Key 생성 필요)

 

[AWS] IAM Access key 생성하기

1. 콘솔 접속 https://us-east-1.console.aws.amazon.com/iam us-east-1.console.aws.amazon.com  2. IAM 사용자 생성  3. 생성된 사용자 선택하여 액세스 키 만들기   4. 액세스 키 생성 완료

apricoding.tistory.com

 

- 지역 선택 후 EC2  키페어 추가

 

- 키페어 추가

 

- 테스트 연결 후 저장

 

🌟 AWS EC2 - Jenkins 기본 설정 완료!

 

 

 

 

 

 

참고

 

Jenkins on AWS

Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software

www.jenkins.io

 

 

EC2 OS가 Ubuntu일 경우에는 아래 순서에 따라 설치

 

Linux

Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software

www.jenkins.io

 

📌 오류 원인

  • org.springframework.context.annotation.ConflictingBeanDefinitionException
  • 패키지 이동, 파일명 변경 등으로 동일한 파일 이름이 중복되었을 때 발생

 

📌 해결 방법

  1. 프로젝트 Clean
    • IDE 메뉴에서 Project > Clean 또는 CLI에서 ./gradlew clean, mvn clean 명령어 사용
  2. 빌드 폴더 삭제 후 재빌드
    • Maven 프로젝트: target 폴더 삭제
    • Gradle 프로젝트: out 폴더 삭제
  3. 프로젝트 다시 빌드
    • IDE에서 Rebuild Project 또는 ./gradlew build, mvn package 명령어 사용

 

📍 Tip

  • Bean 이름 중복을 피하려면 패키지 구조를 체계적으로 관리하고, @Component, @Service, @Repository 등의 Bean 이름을 명시적으로 설정하는 것이 좋음

📌 1. 현재 날짜 및 시간 가져오기

- CURRENT_DATE(): 현재 날짜만 반환 (YYYY-MM-DD)

SELECT CURRENT_DATE();

 

- CURRENT_TIME(): 현재 시간만 반환 (HH:MM:SS)

SELECT CURRENT_TIME();

 

- NOW(): 현재 날짜와 시간을 모두 반환 (YYYY-MM-DD HH:MM:SS)

SELECT NOW();

 

- SYSDATE(): NOW()와 비슷하지만, 쿼리 실행 시점을 기준으로 함

SELECT SYSDATE();

 

 

📌 2. 날짜와 시간 포맷팅

- DATE_FORMAT(date, format): 날짜를 특정 형식으로 변환

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS formatted_date;

  • %Y: 4자리 연도 (2025)
  • %m: 2자리 월 (01 ~ 12)
  • %d: 2자리 일 (01 ~ 31)
  • %H: 24시간제 시 (00 ~ 23)
  • %i: 분 (00 ~ 59)
  • %s: 초 (00 ~ 59)

 

📌 3. 날짜 계산 함수

- DATE_ADD(date, INTERVAL expr unit): 날짜에 기간을 더함

SELECT DATE_ADD(NOW(), INTERVAL 7 DAY) AS next_week;

 

- DATE_SUB(date, INTERVAL expr unit): 날짜에서 기간을 뺌

SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH) AS last_month;

 

- DATEDIFF(date1, date2): 두 날짜 간의 차이(일 수)를 계산

SELECT DATEDIFF('2025-12-31', '2025-01-01') AS days_diff;

 

 

📌 4. 시간 계산 함수

- TIMEDIFF(time1, time2): 두 시간 간의 차이를 반환

SELECT TIMEDIFF('12:00:00', '08:30:00') AS time_diff;

 

- TIMESTAMPADD(unit, interval, datetime): 특정 시간 단위를 더함

SELECT TIMESTAMPADD(HOUR, 5, '2025-03-01 10:00:00') AS add_hours;

 

 

📌 5. 날짜 및 시간 추출 함수

- YEAR(date): 연도 추출

SELECT YEAR(NOW()) AS current_year;

 

- MONTH(date): 월 추출

SELECT MONTH(NOW()) AS current_month;

 

- DAY(date): 일 추출

SELECT DAY(NOW()) AS current_day;

 

- HOUR(time): 시간 추출

SELECT HOUR(NOW()) AS current_hour;

 

- MINUTE(time): 분 추출

SELECT MINUTE(NOW()) AS current_minute;

 

- SECOND(time): 초 추출

SELECT SECOND(NOW()) AS current_second;

 

 

📌 6. 날짜와 시간 비교

- DATE(): DATETIME에서 날짜 부분만 추출

SELECT DATE(NOW()) AS only_date;

 

- TIME(): DATETIME에서 시간 부분만 추출

SELECT TIME(NOW()) AS only_time;

 

- IF 날짜 비교

SELECT IF(NOW() > '2025-12-31 23:59:59', 'Expired', 'Valid') AS status;

'데이터베이스 > MariaDB' 카테고리의 다른 글

[MariaDB] 설치 및 기본 접속  (0) 2023.05.26

 

# 리액트 build 파일 생성
npm run build

# Dockerfile 생성

# nginx.conf 파일 생성

 

  • Dockerfile 생성
# nginx 이미지를 사용합니다. 뒤에 tag가 없으면 latest 를 사용합니다.
FROM nginx

# root 에 app 폴더를 생성
RUN mkdir /app

# work dir 고정
WORKDIR /app

# work dir 에 build 폴더 생성 /app/build
RUN mkdir ./build

# host pc의 현재경로의 build 폴더를 workdir 의 build 폴더로 복사
ADD ./build ./build

# nginx 의 default.conf 를 삭제
RUN rm /etc/nginx/conf.d/default.conf

# host pc 의 nginx.conf 를 아래 경로에 복사
COPY ./nginx.conf /etc/nginx/conf.d

# 3000 포트 오픈
EXPOSE 3000

# container 실행 시 자동으로 실행할 command. nginx 시작함
CMD ["nginx", "-g", "daemon off;"]

 

  • nginx.conf 파일 생성
server {
    listen 3000;
    location / {
        root    /app/build;
        index   index.html index.html;
        try_files $uri $uri/ /index.html;
    }
}

 

  • 윈도우에서 리눅스 서버로 파일 업로드
# 여러 가지 파일을 보낼 경우 -r 옵션 필수
# -r 옵션 없을 경우 not a regular file 에러 발생
scp -i {키페어경로/키페어.pem} -r {유저명}@{주소}:{파일저장경로}

# /home/ec2-user/home 폴더에 리드미파일 저장
scp -i ~/.ssh/{키} ./README.md {인스턴스주소}:~/home/

# /home/ec2-user/ 폴더에 GG폴더 저장
scp -i ~/.ssh/{키} -r ./GG {인스턴스주소}:~/home/

# error: permission denied
# 디렉토리 권한 변경
sudo chmod 766 home

 

  • nvm(node version manager) 설치
curl -o- <https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh> | bash

# .bashrc에 반영
source ~/.bashrc
source ~/.bash_profile

# nvm 명령어로 설치 확인

 

  • node 설치 (npm도 함께 설치 됨)
# node v9.4.0 설치
nvm install v9.4.0
nvm install v17.9.1

# node 사용 선언
nvm use v9.4.0
[root@ip-{아이피} home]# nvm use 17
Now using node v17.9.1 (npm v8.11.0)

# 반영
source ~/.bashrc

 

  • node.js 업그레이드
# 캐시 삭제
npm cache clean --force

# n모듈 설치
npm install -g n

# node.js 설치
npm install -g npm

 

  • 리액트 빌드 (로컬에서 빌드 후 서버에 올리는 방법)
# 1. npm run build로 리액트 파일 빌드

# 2. build된 디렉토리로 이동 (build 폴더 안으로 이동)

# 3. build 폴더 안의 파일들을 tar 파일로 압축 (build 폴더가 아니라 build 폴더 안 파일들만 압축)
$ tar cvfz web.0.1.tar .

# 3-1. tar 없을 경우 설치 필요
$ sudo apt-get install tar

# 4. aws 서버에 빌드 파일 업로드 (~/.ssh/thispotsvr.pem : aws 접속키 경로)
$ scp -i ~/.ssh/{키} ./web.0.1.tar {인스턴스주소}:{폴더경로}

# 4-1. .ssh 폴더 없을 경우 SSH Key 생성 후 .ssh 폴더에 가지고 있는 접속키를 넣어주기
$ cd ~
$ ssh-keygen -t rsa

# 5. 서버 접속
$ ssh -i ~/.ssh/{키} {인스턴스주소}

# 6. 빌드 파일이 업로드된 디렉토리로 이동
$ cd {폴더경로}

# 7. 이동한 디렉토리에서 압축 해제
$ tar xvfz web.0.1.tar

# 끝

 

 

인스턴스에 바로 깃을 연동하여 내려받은 후 빌드하거나

젠킨스를 사용하여 깃에 업로드하면 서버에 자동 빌드 되도록 설정하는 방법도 있다.

'배포 & 운영 > AWS' 카테고리의 다른 글

[AWS] IAM Access key 생성하기  (0) 2024.05.27
[AWS] 젠킨스 설정하기  (0) 2024.05.07
[AWS] 인스턴스에 도커 설치하기  (0) 2023.09.04
[AWS] EC2 인스턴스 생성 및 접속  (0) 2023.08.29
# 인스턴스 패키지 업데이트
sudo yum update -y

# 도커 설치
sudo yum install docker -y

# 도커 버전 확인
docker -v

# 도커 실행
sudo service docker start

# 도커 그룹 권한 설정(ec2-user 추가)
sudo usermod -a -G docker ec2-user

# 권한 확인
docker ps

# 권한 에러 메시지
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied

# Docker daemon socket 파일 권한 변경
sudo chmod 666 /var/run/docker.sock

 

 

'배포 & 운영 > AWS' 카테고리의 다른 글

[AWS] IAM Access key 생성하기  (0) 2024.05.27
[AWS] 젠킨스 설정하기  (0) 2024.05.07
[AWS] 도커로 리액트 배포하기  (0) 2023.09.05
[AWS] EC2 인스턴스 생성 및 접속  (0) 2023.08.29

+ Recent posts