MSA 학습(10) - CI/CD

엉무개·2021년 8월 31일
0

MSA

목록 보기
11/12

1. Travis CI 설정

  1. http://travis-ci.com 에서 깃허브로 로그인 하고 -> Settings


  2. 저장소 선택
  • 원래 on/off하는 것이 있는데 지금은 없음

2. .travis.yml 작성

  • build.gradle과 같은 위치에 작성(루트)
language: java
jdk:
  - openjdk8
branches:
  only:
    - master
//   Travis CI 서버의 Home
cache:
  directories:
    - '$HOME/.m2/repository'
    - '$HOME/.gradle'
script: "./gradlew clean build"
before_install: 
  - chmod +x gradlew
//  완료 시 메일 알람
notifications:
  email:
    recipients:
      - "메일"

3. 깃 푸시 후 Travis, 이메일 확인


4. Travix CI ,AWS S3 연동

  1. AWS 콘솔에서 IAM 이동

  2. 사용자 -> 사용자 추가


  3. 생성할 사용자명 입력, 프로그래밍 방식 엑세스


  4. s3full, codedeployf 검색하여 권한 체크



  5. 키:Name으로 하여 값 설정


  6. 모든 단계가 완료되면 엑세스 키ID, 비밀 엑세스 키 발급


  7. TravicCI - 프로젝트 - 설정화면으로 이동


  8. Environment Variables 항목에서
    AWS_ACCESS_KEY, AWS_SECRET_KEY 이름으로 하여 발급된 엑세스키 입력

    등록된 변수들은 .travis.tml에서 $AWS_ACCESS_KEY, $AWS_SECRET_KEY로 사용 가능

5. S3 버킷 생성

  1. AWS 콘솔에서 S3 이동 후 버킷 생성


  2. 버킷 이름 입력, 모든 퍼블릭 엑세스 차단 체크


  3. .travis.yml에 추가
before_deploy:
#  - 현재 모든 파일을 압축
  - zip -r spring-boot-project *
  - mkdir -p deploy
  - mv spring-boot-project.zip deploy/spring-boot-project.zip
deploy:
  - provider: s3
    access_key_id: $AWS_ACCESS_KEY # travis에서 설정된 변수
    secret_access_key: $AWS_SECRET_KEY # travis에서 설정된 변수
    bucket: spring-boot-project-build # s3 버킷 명
    region: ap-northeast-2
    skip_cleanup: true
    acl: private # zip 접근 private
    local_dir: deploy # before_deploy에서 생성한 디렉토리
    wait-until-deployed: true
  1. 깃 푸시 후 Travic 빌드 성공, S3 업로드 성공 여부 확인

6. Travis CI, AWS S3, CodeDeploy 연동

  1. AWS 콘솔 -> IAM -> 역할 -> 역할 만들기

    앞에서 만들었던 IAM 사용자역할 차이
  • 역할
    • AWS서비스에만 할당가능한 권한
    • EC2, CodeDeploy 등
  • 사용자
    • AWS 서비스 외에 사용할 수 있는 권한
    • 로컬PC, IDC 서버

  1. AWS서비스 -> EC2


  2. EC2RoleForA 검색 후 AmazonEC2RoleforAWSCodeDeploy체크


  3. 키는 Name, 값은 원하는대로 입력 후 생성 완료


  4. EC2 인스턴스 목록에서 인스턴스 우클릭 -> 보안 -> IAM 역할 수정


  5. 방금 생성한 역할 선택 후 저장


  6. EC2 인스턴스 재부팅


  7. ec2에 접속하여 다음 명령어로 CodeDeploy 설치
  • sudo yum install ruby
  • sudo yum install wget
  • chmod +x ./install
  • sudo ./install auto
  • sudo service codedeploy-agent status 로 정상실행 확인

  1. IAM 역할 생성위해 AWS 콘솔 -> IAM -> 역할 -> 역할 만들기 -> AWS 서비스 -> CodeDeploy


  2. 태그로 바로 이동하여 키:Name 값: 원하는 이름 입력 후 생성



  3. AWS 콘솔 -> CodeDeploy 이동 후 생성


  4. 이름 입력, EC2/온프레미스 선택


  5. 배포 그룹 생성


  6. 생성한 서비스, 현재위치, EC2 인스턴스, 태그추가
    (배포할 서비스가 2대 이상이면 블루/그린 선택)
    (EC2 인스턴스 이름이 해당 이름인지 확인 이거 때문에 3시간 날림)


  7. 배포 구성 및 로드밸런서 해제
  8. EC2 서버에 S3에서 넘어올 zip를 저장할 디렉토리 생성
    mkdir ~/app/step2 && mkdir ~/app/step2/zip
  9. appspec.yml 생성(build.gradle과 같은 위치)
version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/app/step2/zip/
    overwrite: yes
  1. .travis.yml에도 deploy 항목에 다음 코드 추가
  - provider: codedeploy
    access_key_id: $AWS_ACCESS_KEY # travis에서 설정된 변수
    secret_access_key: $AWS_SECRET_KEY # travis에서 설정된 변수
    bucket: spring-boot-project-build # s3 버킷 명
    key: spring-boot-project.zip # 빌드파일 압축해서 전달
    bundle_type: zip # 압축 확장자
    application: spring-boot-project #웹 콘솔에서 등록한 codeDeploy 앱 이름
    deployment_group: spring-boot-project # 웹 콘솔에서 등록한 codeDeploy 배포 그룹 이름
    region: ap-northeast-2
    wait-until-deployed: true

19. 푸시 - CodeDeploy 배포 여부 확인 - step2/zip 폴더에 파일 확인

7. 배포 자동화

  • yml 설정파일을 /home/ec2-user/app/ 에 복사
  1. step2 환경에 실행될 deploy.sh 생성
  • 루트 디렉토리에 scripts 디렉토리 생성 후 deploy.sh 작성
REPOSITORY=/home/ec2-user/app/step2
PROJECT_NAME=spring-boot-project
echo "> Build File Copy"
cp $REPOSITORY/zip/*.jar $REPOSITORY/
echo "> 현재 구동 중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -fl spring-boot-project(git에 등록된 플젝이름) | grep jar(찾을 수 없으면 java로 수정) | awk '{print $1}')
echo "현재 구동 중인 애플리케이션 pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
  echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
  echo "> kill -15 $CURRENT_PID"
  kill -15 $CURRENT_PID
  sleep 5
fi
echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"
echo "> $JAR_NAME 에 실행권한 추가"
chmod +x $JAR_NAME
echo "> $JAR_NAME 실행"
nohup java -jar -Dspring.config.location=/home/ec2-user/app/application-real.yml -Dspring.profiles.active=real $JAR_NAME > $REPOSITORY/nohup.out 2>&1 &

2. travis.yml 파일 before_deploy수정
before_deploy:
  - mkdir -p before-deploy # zip에 포함시킬 파일들을 담을 DIR 생성
  - cp scripts/*.sh before-deploy/
  - cp appspec.yml before-deploy/
  - cp build/libs/*.jar before-deploy/
  - cd before-deploy && zip -r before-deploy * # before-deploy로 이동 후 전체 압축
  - cd ../ && mkdir -p deploy # 상위 디랙토리 이동 후 deploy 디렉토리 생성
  - mv before-deploy/before-deploy.zip deploy/spring-boot-project.zip # deploy로 zip 파일 이동
  • Travis CI는 특정파일 업로드 불가능. 항상 디렉토리 단위로 생성하여 업로드
  • before-deploy는 zip파일에 포함시킬 파일들 저장
  • zip -r 명령어로 before-deploy DIR 전체 압축

  1. appspec.yml 에 추가
permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user  
hooks:
  ApplicationStart:
    - location: deploy.sh
      timeout: 60
      runas: ec2-user
  • CodeDeploy에서 EC2로 넘겨준 파일들을 ec2-user 권한 갖도록 함
  • hooks: CodeDeploy 배포 단계에서 실행할 명령어 지정

  1. 푸시하여 Travis, CodeDeploy 성공여부 확인
  • no Manifest 관련 에러 뜰 때
    1. Project Structure 에서 메인클래스 설정

    2. build.gradle에 다음 코드 추가
      // 메인클래스 추가
      manifest {
        attributes 'Main-Class': 'com.example.ec2project.Ec2ProjectApplication' //메인클래스
      }

  • connect ECONNREFUSED 관련 에러 시
    • EC2 에 있는 application-real.yml의 server address를 EC2 인스턴스 Private IP로 변경
profile
엉덩이가 무거운 개발자

0개의 댓글