[ AWS ec2로 자동배포 ] 프로세스화

최수정·2022년 10월 17일
0

자바프로그래밍

목록 보기
10/15

인스턴스 스팟이 종료 될 때마다 편하게 다시 연결하기 위해 미리 작성해 놓는 프로세스 게시글

📌 주의

  • DB명에 _❌ 언더바 넣지 않을 것 ❌

✅ 목차

1 인스턴스 생성
2 Xshell ( 코드 아래 참고 )

  • git clone 해서 docker 설치
  • sql 컨테이너 실행

3 IntelliJ 와 DB 연동
4 DockerFile 제작
5 GitLab 이용해서 자동배포화 - CI.yml, deploy.sh, Crontab


1 ~ 3 ➡ { https://velog.io/@sj9802/221011 }
4 ~ 5 ➡ { https://velog.io/@sj9802/EC2-무중단-배포 }


💻 2. Xshell 코드

// 관리자 권한으로 실행
sudo su -

mkdir git
cd git
git clone https://github.com/S2uJeong/docker_install.git

// docker 설치

cd docker_install/

sh docker_install.sh

docker run -p 80:80 nginx // 웹 주소창 입력해서 연결확인

// sql 연동
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password(내가입력) -d mysql

docker ps // 입력해서 연동 확인.

💻 3. IntelliJ 와 DB 연동

  1. SQL 워크밴치에 커낵션 연결해서 사용하거나, IntelliJ 자체 기능으로 DB 연동해서 사용할 수 있다. ➡ 스키마 생성을 해서 DB를 생성해준다.
  2. IntelliJ에서 Edit configlation기능을 통해 환경변수에 host 내용을 바꿔준다.
SPRING_DATASOURCE_URL
SPRING_DATASOURCE_USERNAME
SPRING_DATASOURCE_PASSWORD

📌 위 이름들로 변수명을 해주어야 SPRING이 인식함으로, 에러가 나지 않게 스펠링 꼭 지켜서 설정해주자. DB 환경변수 입력시, 아래와 같이 입력 해주어야 한다.

SPRING_DATASOURCE_URL=jdbc:mysql://{host명}:3306/{db명}

ex)
SPRING_DATASOURCE_URL=jdbc:mysql://ec2-15-164-208-176.ap-northeast-2.compute.amazonaws.com:3306/likelion-db

💻 4. Dockerfile 제작

📌 Dockerfile ⬅ 이 이름은 바꾸지 않고 무조건 철자 그대로 해야한다.

FROM gradle:7.4-jdk11-alpine as builder
WORKDIR /build

# 그래들 파일이 변경되었을 때만 새롭게 의존패키지 다운로드 받게함.
COPY build.gradle settings.gradle /build/
RUN gradle build -x test --parallel --continue > /dev/null 2>&1 || true

# 빌더 이미지에서 애플리케이션 빌드
COPY . /build
RUN gradle build -x test --parallel

# APP
FROM openjdk:11.0-slim
WORKDIR /app

# 빌더 이미지에서 jar 파일만 복사
COPY --from=builder /build/build/libs/*-SNAPSHOT.jar ./app.jar

EXPOSE 8080

# root 대신 nobody 권한으로 실행
USER nobody
ENTRYPOINT [                                                \
    "java",                                                 \
    "-jar",                                                 \
    "-Djava.security.egd=file:/dev/./urandom",              \
    "-Dsun.net.inetaddr.ttl=0",                             \
    "app.jar"              \
]

💻 5. GitLab 이용해서 자동배포화

📌 GitLab에서 환경변수 등록 해준다 - $GITLAB_USER , $PROJECT_NAME , $GITLAB_PASSWORD

이때, 대문자❌, 일부 특수기호❌ ( !, ~ 등) 마스크 기능 사용 시 제대로 해석이 안되므로, @와 같은 특수기호를 사용하고 소문자를 사용한다.

  • .gitlab-ci.yml
 stages:
  - dockerbuild-push

package:
  image: docker:latest
  stage: dockerbuild-push
  services:
    - docker:dind
  before_script:
    - docker login registry.gitlab.com -u $GITLAB_USER -p $GITLAB_PASSWORD
  script:
    - docker build -t registry.gitlab.com/$GITLAB_USER/$PROJECT_NAME .
    - docker push registry.gitlab.com/$GITLAB_USER/$PROJECT_NAME
  after_script:
    - docker logout
    
  • deploy.sh
    ➡ 예시 작성임. 프로젝트 해당 값으로 다 바꿔서 넣어야 한다.
#set value  // 띄어쓰기 넣으면 인식못함 주의 NAME= gitlab (X)
PROJECT_NAME={프로젝트 이름} 

#!/bin/bash
set -ex

docker pull registry.gitlab.com/s2ujeong1/$PROJECT_NAME:latest | grep "Image is up to date" && pull_status="already_pulled" || pull_status="newly_pulled"

echo $pull_status

if [ "$pull_status" = "newly_pulled" ]; then
        docker stop $PROJECT_NAME
        docker rm -f $PROJECT_NAME
        docker run -p 8080:8080 --name $PROJECT_NAME -e SPRING_DATASOURCE_URL=jdbc:mysql//ec2-3-36-64-158.ap-northeast-2.compute.amazonaws.com:3306/project-db -e SPRING_DATASOURCE_PASSWORD=0000 -d registry.gitlab.com/s2ujeong1/$PROJECT_NAME
        docker image prune -f
fi
  • crontab -e

이 과정 해주기 전에, 직접 sh deploy.sh 명령해서 스크립트 잘 돌아가는지 확인해보기

* * * * * sh /home/ubuntu/deploy.sh >> /home/ubuntu/deploy.log

💻 기타

  • DOCKER RUN
docker run -p 8080:8080 --name {gitlab 프로젝트명 } -e SPRING_DATASOURCE_URL={} -e SPRING_DATASOURCE_PASSWORD={} -d {registry path}
  
 ex) docker run -p 8080:8080 --name gitlab-exercise -e SPRING_DATASOURCE_URL=jdbc:mysql://ec2-3-36-64-158.ap-northeast-2.compute.amazonaws.com:3306/likelion_db2 -e SPRING_DATASOURCE_PASSWORD=passward -d registry.gitlab.com/s2ujeong1/gitlab-exercise
  • DOCKER LOG 확인
docker logs {containner id}
  • deniend acssess ➡ DOCKER LOGIN
docker login registry.gitlab.com/{userName}/{projectName} -p {password} 

0개의 댓글