애플리케이션에 대한 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트되어 공유 리포지토리에 통합하는 것
개발자의 변경 사항을 리포지토리에서 고객이 사용 가능한 프로덕션 환경까지 자동으로 릴리스하는 것
Git Repo 프로젝트의 빌드 테스트 및 배포 파이프라인을 자동화할 수 있는 CI/CD 플랫폼
소스의 변화를 감지하고 빌드한 다음 배포를 하는 과정을 자동으로 수행할 수 있게 하는 서비스
CodePipeLine의 배포 단계에서 선택하는 배포 제공자 서비스
Github action과 AWS 서비스를 사용한 CI/CD 파이프라인 실습 프로젝트
Spring BootGithub ActionAWS EC2AWS S3AWS CodeDeployAWS CodePipeline
- main branch에 push 이벤트 감지
- Github action에서 테스트와 빌드를 수행할 수 있는 환경 세팅
- 테스트가 성공적으로 수행되면 빌드를 수행하고 .zip 형태로 압축
- AWS S3 접근 권한과 관련된 설정 정보와 AWS CLI를 사용하여 압축된 파일을 S3에 업로드
- AWS CodePipeline에서 S3의 배포 프로젝트의 변화 감지
- Build 과정은 건너뛰고 Deploy 과정 수행
- CodeDeploy에서 지정한 EC2에 빌드된 프로젝트 반영
2. AWS S3 버킷 생성
3. AWS EC2 생성
- AmazonEC2RoleforAWSCodeDeploy 역할를 생성한 인스턴스에 부여해야 한다.
- 생성한 인스턴스에 접속하여 CodeDeploy agent를 설치한다.
sudo yum update
sudo yum install ruby
sudo yum install wget
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
sudo amazon-linux-extras install java-openjdk11
chmod +x ./install
sudo ./install auto- Amazon EC2를 설정하고 Name의 Key에는 3에서 생성한 인스턴스의 이름을 입력한다.
- Source Provider로 S3를 선택한 후 2의 버킷 이름과 배포할 프로젝트 이름을 입력한다.
- Deploy Provider로 4의 CodeDeploy 애플리케이션 이름를 입력한다.
name: Java CI with Gradle & Upload to AWS S3 & Slack Notification//workflow가 시작되는 조건 정보on:
push:
branches: [ "main" ]//수행할 job 목록jobs:
//빌드와 업로드를 수행하는 jobbuild_upload:
//workflow를 수행할 서버의 운영체재 설정runs-on: ubuntu-lateststeps:
- name: setting checkoutuses: actions/checkout@v3//자바 개발 환경 설정
- name: Set up JDK 11uses: actions/setup-java@v3with:
java-version: '11'distribution: 'temurin'//gradlew에 대한 실행 권한 부여
- name: execution permission for gradlewrun: chmod +x gradlewshell: bash
- name: Build with Gradlerun: ./gradlew buildshell: bash//S3에 .zip 형태로 올려야 배포가 됨
- name: Make zip filerun: zip -qq -r ./${{secrets.PROJECT}}.zip .shell: bash//aws cli 사용을 위한 액세스 키 설정
- name: Configure AWSuses: aws-actions/configure-aws-credentials@v1with:
aws-access-key-id: ${{ secrets.KEY }}aws-secret-access-key: ${{ secrets.SECRETE }}aws-region: ${{ secrets.REGION }}
- name: Upload to S3run: aws s3 cp --region ${{ secrets.REGION }} ./${{ secrets.PROJECT }}.zip s3://${{ secrets.BUCKET }}/${{secrets.PROJECT}}.zip//slack 웹훅 이용
- name: Slack Webhookuses: 8398a7/action-slack@v3with:
status: ${{ job.status }}author_name: Github Action Testfields: repo,message,commit,author,action,eventName,ref,workflow,job,tookenv:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK }}if: always()EC2로 배포된 후 실행되어야 하는 동작을 정의한 스크립트를 작성해야 한다.
version: 0.0os: linuxfiles:
- source: /destination: /productpermissions:
- object: /product/owner: ec2-usergroup: ec2-usermode: 755hooks:
AfterInstall:
- location: deploy.shtimeout: 300runas: root#!/usr/bin/env bash
REPOSITORY=/product
cd$REPOSITORY
JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep '.jar'| head -n 1)
JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME#8080 포트를 사용하는 어플리케이션 종료
sudo kill -15 `sudo netstat -tnlp|grep 8080 |gawk '{ print $7 }'|grep -o '[0-9]*'`#배포된 파일을 백그라운드 모드로 실행하면서 로그아웃 후에도 프로세스가 죽지 않고 진행되고#실행 파일에 의해 발생되는 출력을 화면에 보이지 않게 하는 명령어
nohup java -jar $JAR_PATH> /dev/null 2> /dev/null < /dev/null &Tutorial: Create a simple pipeline (S3 bucket)
Create an Amazon EC2 Linux instance and install the CodeDeploy agent
github action과 aws code deploy를 이용하여 spring boot 배포하기