Infra

CircleCI로 SpringBoot+Postgresql 프로젝트 빌드 배포하기(3)

연_우리 2022. 3. 18. 17:56
반응형

CircleCI로 SpringBoot+Postgresql 프로젝트 빌드 배포하기(1)

빌드 배포 흐름
사전준비
AWS IAM 역할(Role) 설정
     EC2CodeDeployRole 생성
     CodeDeployRole 생성
AWS EC2 IAM 역할 수정
AWS IAM 사용자 추가

CircleCI로 SpringBoot+Postgresql 프로젝트 빌드 배포하기(2)

AWS S3 버킷 생성
AWS CodeDeploy 생성
AWS EC2 접속하여 CodeDeploy Agent 설치
AWS EC2 Postgresql 설치

CircleCI로 SpringBoot+Postgresql 프로젝트 빌드 배포하기(3)

소스코드 수정
     .circleci > config.yml파일
     프로젝트폴더 > appspec.yml
     프로젝트폴더 > scripts > deploy.sh
     프로젝트폴더 > src > main > resources > application.yml
CircleCI Context설정
     AWS 환경변수 저장
     프로젝트 환경변수 저장
깃허브 소스코드 push하여 빌드 배포 확인

 

팀플하면서 공부한 내용이다 (사실 공부도 아니고 어떻게 동작하는지만 찍어먹어본 정도..)
잘 이해하지 못한 부분도 많고 엄청 헤매었다. 일단 어떻게 동작되었는지 남겨놓는 용도로 작성하는 글이다

 

 

 

 

 

 

 

소스코드 수정

.circleci > config.yml파일

version: 2.1
orbs:
  aws-s3: circleci/aws-s3@1.0.13
  aws-code-deploy: circleci/aws-code-deploy@0.0.12

jobs:
  build:
    docker:
      - image: circleci/openjdk:11-jdk
        environment:
          DATABASE_URL: ${MY_POSTGRES_URL} #CircleCI Project Settings > Environment의 내용

    steps:
      - checkout  
      - run:
          name: gradlew 권한 부여
          command: chmod +x ./gradlew
      - run:
          name: gradle 빌드
          command: ./gradlew build
      - run:
          name: 소스 압축
          command: |
            zip back.zip -r ./* 	#현재 폴더의 하위내용까지 포함하여 back.zip파일 생성
            mkdir -p deploy	
            mv back.zip deploy/back.zip		#back.zip파일 deploy폴더로 이동
            
      - persist_to_workspace:	#build와 deploy 단계가 나뉘어졌기때문에 압축한 파일이 deploy단계에서 사라질 수 있다
          root: .
          paths: deploy		#deploy 폴더는 그대로 유지하겠다

  deploy:
    docker:
      - image: circleci/python:2.7

    steps:
      - attach_workspace:	#저장한 폴더 가져오기
          at: .

      - aws-s3/copy:
          from: deploy/*					#deploy 내부의 모든 파일을 aws s3로 보낸다
          to: 's3://ec2-s3-mybucket'		#s3://생성한 버킷명
          aws-region: AWS_DEFAULT_REGION	#CircleCI에 설정한 Context의 내용이 들어갈것이다

      - aws-code-deploy/deploy-bundle:
          application-name: EC2CodeDeployTest			#CodeDeploy 애플리케이션 이름 작성
          deployment-group: EC2CodeDeployTestGroup		#EC2CodeDeployTest가 속한 배포그룹명 작성
          deployment-config: CodeDeployDefault.AllAtOnce	#EC2CodeDeployTestGroup의 배포그룹세부정보의 배포구성의 값 작성
          bundle-bucket: ec2-s3-mybucket			#s3://생성한 버킷명
          bundle-key: back 					#보내는 파일 이름
          bundle-type: zip 					#보내는 파일 확장자


workflows:
  version: 2.1

  build-deploy:
    jobs:
      - build
      - deploy:
          context: test #CircleCI에 설정한 Context 이름을 작성한다 (aws 계정정보 들어있는)
          requires:
            - build

 

 

프로젝트폴더 > appspec.yml

version: 0.0
os: linux
files:
  - source: / 			#CodeDeploy에서 전달해 준 파일 전부를 destination으로 전달하겠다
    destination: /home/ubuntu/deploy        
    overwrite: yes

permissions:  	#CodeDeploy에서 받은 파일의 권한을 설정한다 (ubuntu는 aws ec2 기본사용자)
  - object: /
    pattern: "**"
    owner: ubuntu
    group: ubuntu

hooks:  	#CodeDeploy배포 단계에서 실행할 명령어를 지정합니다.
  ApplicationStart: 	#deploy.sh를 ubuntu권한으로 실행합니다.
    - location: scripts/deploy.sh
      timeout: 60 		#스크립트 실행 60초 이상 수행되면 실패가 됩니다.
      runas: ubuntu

 

프로젝트폴더 > scripts > deploy.sh

#!/bin/bash

cd /home/ubuntu/deploy/build/libs

nohup java -jar jlpt-0.0.1-SNAPSHOT.jar > /home/ubuntu/jlpt/nohup.out 2>&1 &
# nohup실행 시 CodeDeploy는 무한 대기 합니다. 이 이슈를 해결하기 위해 nohub.out파일을 표준 입출력용으로 별도로 사용합니다.
# 이렇게 하지 않으면 nohup.out파일이 생기지 않고, CodeDeploy 로그에 표준 입출력이 출력됩니다. nohub이 끝나기 전까지 CodeDeploy도 끝나지 않으니 꼭 이렇게 해야합니다.

 

 

프로젝트폴더 > src > main > resources > application.yml

spring:
  datasource:
    url: ${MY_POSTGRES_URL} 	#jdbc:postgresql://~~:5432/jlpt
    username: ${MY_POSTGRES_USER}	
    password: ${MY_POSTGRES_PASSWORD}
    #CircleCI Project Settings > Environment에 정의된 값들이 들어올 것이다

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQL10Dialect
        show_sql: true
        format_sql: true

 

 

CircleCI Context설정

AWS 환경변수 저장

1. CircleCI > Organization Settings > Contexts > Create Context

 

2. Add Environment Variable 클릭하여 3가지 변수를 추가해준다.

default region은 ap-northeast-2(서울)로 작성하고, accesskey와 secretkey는 [AWS IAM 사용자 추가] 에서 저장한 csv파일의 내용을 작성해준다.

 

프로젝트 환경변수 저장

Project로 넘어와서 Project Settings > Environment Variables에 데이터베이스 내용을 추가해준다

 

 

 

깃허브 소스코드 push하여 빌드 배포 확인

 

 

 

 

 

 

 

 

참고

https://velog.io/@hwany/AWS-EC2-CodeDeploy-연동하기

https://jojoldu.tistory.com/281

https://stackoverflow.com/questions/46195725/accessing-postgresql-9-6-from-spring-boot-in-circleci

https://www.sunny-son.space/AWS/Github%20Action%20CICD/

https://jinmay.github.io/2020/05/13/aws/how-to-install-code-deploy-agent-ubuntu/

https://backtony.github.io/spring/aws/2021-08-22-spring-cicd-2/

 

 

반응형
  • 네이버 블러그 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 구글 플러스 공유하기
  • 카카오톡 공유하기