아무거나

Gradle Multi Project 기반 Jenkins + S3 + Codedeploy + Codecommit 을 사용한 빌드 및 배포 구성 본문

Infra/AWS

Gradle Multi Project 기반 Jenkins + S3 + Codedeploy + Codecommit 을 사용한 빌드 및 배포 구성

전봉근 2021. 7. 21. 02:22
반응형

java-example-code/sample-multi-module at master · bkjeon1614/java-example-code (github.com)

 

Project 최상위 경로에 Codedeploy로 배포에 사용할 appspec_api.yml 추가 (appspec_{원하는명칭}.yaml) 및 scripts/base-api 폴더 생성 후 deploy-before.sh 파일 생성
[appspec_api.yml]

version: 0.0
os: linux
files:
  - source:  /
    destination: /home/ec2-user/build/

permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

hooks:
  BeforeInstall:
    - location: deploy-before.sh
      runas: ec2-user
  ApplicationStart:
    - location: deploy.sh
      runas: ec2-user

[deploy-before.sh]

if [ -d /home/ec2-user/build ]; then
    sudo rm -rf /home/ec2-user/build/
fi
sudo mkdir -vp /home/ec2-user/build/    
  • Jenkins Job 추가
  • Git 설정
    • Jenkins Item > 구성 > 소스 코드 관리 항목에서 Git 선택 후 Repository URL 입력 후 Credentials 에서 Add > Jenkins 클릭 후 하기 내용 입력
      • Domain: Global credentials (unrestricted)
      • Kind: Username with password
      • Scope: Global (Jenkins, nodes, items, all child items, etc)
      • Username: Codecommit 계정정보 입력
      • Password: Codecommit 계정정보 입력
  • Gradle Build 설정
    • Jenkins Item > 구성 > Build 항목에서 Use Gradle Wrapper 선택 후 Make gradlew executable 선택한 다음 Wrapper location에서 ${workspace} 입력 ( ${workspace}는 jenkins job item location )
    • Tasks에 명령입력
      // 매개변수 예시 포함
      :base-api:clean :base-api:build -Pprofile=local -Djasypt.encryptor.password=bkjeon@! -Dmysql.aeskey=bkjeon@!
      
    • Build 시작
  • Jenkins Item > 구성 > Execute Shell 추가 (Codedeploy 관련 파일들을 미리 압축하여 S3로 Upload해야 Codedeploy로 배포 또는 배포후에 관련 스크립트 파일들을 따로 실행할 수 있다. => Gradle Multi Project인 경우는 최상위 루트에 여러 모듈이 있으므로 모듈별 appspec.yml, buildspec.yml 등의 파일들이 명칭별로 관리가 필요)
    rm -rf build
    mkdir build
    cp ./base-api/build/libs/*.jar ./build
    cp ./appspec_api.yml ./build
    cp ./scripts/base-api/deploy-before.sh ./build
    cp ./scripts/base-api/deploy.sh ./build
    
    cd build
    zip -r base-dev.zip *
    
  • S3 Upload 연동
    • S3 publisher plugin 설치
    • Jenkins 관리 > 시스템 설정 > Amazon S3 profiles 에 계정정보 입력 후 Test Connection
    • Jenkins Item > 구성 > 빌드 후 조치 > Publish artifacts to S3 Bucket 추가
    • Files to upload 추가 후 정보 입력
      • Source: Execute shell 에서 지정한 폴더위치와 파일을 입력한다. (ex: build/base-dev.zip)
      • Destination bucket: 옮겨질 S3 버킷을 지정한다. (만약 버킷이 없다면 에러발생) (ex: bk.bucket/build/base/dev)
      • Bucket Region: 버킷이 저장될 지역을 지정한다. ap-norheast-2 는 한국 리전이다.
  • Code Deploy 생성
    • Code Deploy 용도 IAM 생성
      • IAM > 엑세스 관리 > 역할 > AWS 서비스에서 Code Deploy 선택 > 선택 후 다음페이지에는 권한이 지정되어있으니 다음 다시 클릭 > 태그는 생략(향후 필요시 사용) > 역할이름(ex: codedeploy-base-service-role) 입력 후 역할 만들기 클릭하면 생성이 완료된다.
    • 배포할 EC2에 Code Deploy Agent 설치
      $ sudo yum install -y ruby
      $ wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install
      $ chmod +x ./install
      $ sudo ./install auto
      $ rm -rf install
      $ sudo service codedeploy-agent status
      
    • 애플리케이션 생성 > 애플리케이션 구성
      • 애플리케이션 이름: base-s3-ec2-deploy
      • 컴퓨팅 플랫폼: EC2/온프레미스
    • 배포그룹 생성
      • 배포그룹 이름: base-dev
      • 서비스 역할: 상기 생성한 Code Deploy codedeploy-base-service-role 선택
      • 배포유형: 현재위치(향후 필요시 변경가능)
      • 환경구성: Amazon EC2 인스턴스 > 기존 EC2에 설정한 Tag를 활용하여 지정
      • AWS Systems Manager를 사용한 에이전트 구성: 지금 업데이트 및 업데이트 일정 예약
      • 배포설정: CodeDeployDefault.OneAtATime 설정
        • CodeDeployDefault.AllAtOnce:한 번에 가급적 많은 수의 인스턴스 어플리케이션 개정을 배포시도한다. 하나 이상의 인스턴스에 애플리케이션 개정이 배포되면 전체 배포 상태가 성공으로 표시.
        • CodeDeployDefault.HalfAtATime:최대 절반의 인스턴스에 한번에 배포한다. 절반이상이 배포성공하면 전체 배포를 성공으로 표시.
        • CodeDeployDefault.OneAtATime:한 번에 한 인스턴스에만 배포한다. 하나라도 틀리면 배포실패.
      • 로드 밸런서 -> 로드 밸런싱 활성화 정책은 필요시 설정(해당 설명에서는 로드밸런싱을 안하므로 체크를 해제한다.)
    • 배포생성
      • 배포그룹: 상기 생성한 배포그룹인 base-dev 선택
      • 개정유형: 플리케이션을 Amazon S3에 저장
      • 개정위치: S3 업로드된 파일의 S3 URL 복사 후 입력 (ex: s3://bk.bucket/build/base/dev/base-dev.zip)
      • 그 외 다른 설정은 필요하면 선택하고 아니면 배포 만들기 클릭하면 배포가 진행되는것을 볼 수 있다.
반응형
Comments