Git Actions

개발 공부 중·2022년 9월 27일
0

CI/CD

목록 보기
1/1
  1. EC2 인스턴스 생성

  2. IAM 사용자 생성




3. 권한 추가
AmazonS3FullAccess, AWSCodeDeployFullAccess 2가지를 추가
(안 될 경우 정책에 AmazonEC2FullAccess, AmazonS3FullAccess, AWSCodeDeployFullAccess 3가지를 추가)


4. s3 생성
5. Amazon S3 권한 해제


6. CodeDeploy 애플리케이션 생성


7. 이름을 입력, 컴퓨터 플랫폼에 EC2/온프레미스를 입력 후 생성


8. Git -> Actions -> JAVA with Gradle Configure 클릭

name: clone instar CI/CD

on:
  pull_request:
    branches: [ main ]
    types: [closed]

env:
  S3_BUCKET_NAME: mysparta00

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'  
        
    # gradle caching
    - name: Gradle Caching
      uses: actions/cache@v3
      with:
        path: |
          ~/.gradle/caches
          ~/.gradle/wrapper
        key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
        restore-keys: |
          ${{ runner.os }}-gradle-
          
    # create application-dev.properties
    - name: make application.properties
      run: |
        cd ./src/main/resources
        touch ./application.properties
        echo "${{ secrets.PROPERTIES }}" > ./application.properties
      shell: bash

        
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    
    - name: Build with Gradle
      run: ./gradlew build -x test  
      
    # 디렉토리 생성
    - name: Make Directory
      run: mkdir -p deploy
        
    # Jar 파일 복사
    - name: Copy Jar
      run: cp ./build/libs/*.jar ./deploy
          

    # appspec.yml 파일 복사
    - name: Copy appspec.yml
      run: cp appspec.yml ./deploy


    # script files 복사
    - name: Copy script
      run: cp ./scripts/*.sh ./deploy

    - name: Make zip file
      run: zip -r ./planit.zip ./deploy
      shell: bash
          
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.IAMACCESSKEY }}
        aws-secret-access-key: ${{ secrets.IAMSECRETKEY }}
        aws-region: ap-northeast-2

    - name: Upload to S3
      run: aws s3 cp --region ap-northeast-2 ./planit.zip s3://$S3_BUCKET_NAME/
      
    # Deploy
    - name: Deploy
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.IAMACCESSKEY }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.IAMSECRETKEY }}
      run: 
        aws deploy create-deployment 
        --application-name planit
        --deployment-group-name planit
        --file-exists-behavior OVERWRITE 
        --s3-location bucket=springbucketss,bundleType=zip,key=planit.zip
        --region ap-northeast-2
  1. 내용을 입력

(S3_BUCKET_NAME에 아마존 S3 버킷 이름을 입력 내용을 하나 하나 잘 보고 자신에게 맞게 입력해야한다.)


10. Settiongs -> Actions -> New repository secret 클릭


11. Name에 아까 JAVA with Gradle파일에 넣을 이름을 입력(accesskey, secretkey, properties), Secret에 키내용 및 properties내용을 입력, add를 클릭
(S3


12. add를 클릭하면 생성이 되는데 필요한 것만 생성하면 된다.
(현재 프로젝트에 3가지가 필요하여 3가지만 입력 : 1번과 2번은 S3의 키, 3번은 보안을 위해 깃에 올리지 않는 properties이다.)
한 번 생성하면 다시 들어가서 볼 수 없다.



13. 2번으로 생성한 부분이 .github/workflows이고 scripts와 appspec.yml, main에 resources/static을 생성

#!/usr/bin/env bash

REPOSITORY=/home/ubuntu/app

echo "> 현재 구동 중인 애플리케이션 pid 확인"

JAR_NAME=$(ls -tr $REPOSITORY/*SNAPSHOT.jar | tail -n 1)

CURRENT_PID=$(pgrep -f $JAR_NAME)
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/*SNAPSHOT.jar | tail -n 1)

echo "> JAR NAME: $JAR_NAME"

echo "> $JAR_NAME 에 실행권한 추가"

chmod +x $JAR_NAME

echo "> $JAR_NAME 실행"
#-Duser.timezone=Asia/Seoul
nohup java -jar  $JAR_NAME >> $REPOSITORY/nohup.out 2>&1 &
  1. deploy.sh 파일을 생성하여 위의 코드를 입력
version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/app/
    overwrite: yes

permissions:
  - object: /
    pattern: "**"
    owner: ubuntu
    group: ubuntu

hooks:
  ApplicationStart:
    - location: deploy.sh
      timeout: 60
      runas: ubuntu
  1. appspec.yml 파일을 생성하여 위의 코드를 입력
sudo apt update
sudo apt install ruby-full
sudo apt install wget

cd /home/ubuntu

sudo apt install awscli
aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2

chmod +x ./install
sudo ./install auto

아래 코드로 설치 확인
sudo service codedeploy-agent status
  1. 윈도우에서는 Git Bash, 맥에서는 터미널을 켜서 EC2에 들어가 위의 커맨드를 입력


https://aws.amazon.com/ko/premiumsupport/knowledge-center/s3-locate-credentials-error/
17. 중간에 오류가 발생했을 경우 위의 자료를 참고하여 입력
(aws configure list 입력하고 access_key, secret_key, region을 입력하고 마지막은 넘긴다.)


18. 설치가 잘 된 경우 위와 같은 내용이 뜬다.


19. 메인에 Pull requests를 하면 Actions에서 build가 되며 배포가 된다.
(시간은 1분 내외 정도 걸린다.)

내용이 뒤죽박죽이고 딱 순서가 정해진 거 같지 않아 아직 머리 속에서 정리가 되지 않았다.
중간 중간 EC2, IAM, S3 등 생성을 자세히 넣으면 엄청나게 길어져 뺏다.
무중단 배포를 원할 경우 AWS 로드밸런서를 활용하여 할 수 있다.
이 때, 서버를 2개 이상 사용하여 하나가 빌드 중일 때 다른 서버를 이용하는 방식이다.

참고 자료 :
https://zzang9ha.tistory.com/404?category=954133
https://be-developer.tistory.com/51?category=1062619
https://gist.github.com/ninanung/9d63304cb0d070642e89f9b94b6fe24b

profile
개발 공부 중

0개의 댓글