흰 스타렉스에서 내가 내리지

Github Actions :: 깃허브 액션, CodeDeploy&Docker 본문

web.etc

Github Actions :: 깃허브 액션, CodeDeploy&Docker

주씨. 2023. 5. 25. 10:43
728x90

1.

spring boot 니까 Java with Gradle

2.

기본적으로 제공되는 gradle.yml 파일이 제공된다.

 

3. gradle.yml 수정

 

이거 됨 됨 됨!!!!

name: Deploy to Amazon EC2

on:
  push:
    branches:
      - main

permissions:
  contents: read

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    env :
      working-directory: ./
      APPLICATION: ${{ secrets.APPLICATION }}

    steps:
    # (1) 기본 체크아웃
    - name: Checkout
      uses: actions/checkout@v3

    # (2) JDK 11 세팅
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        distribution: 'temurin'
        java-version: '11'
              
              
    - uses: actions/checkout@v3
    - run: touch ./src/main/resources/application.yml
    - run: echo "${{env.APPLICATION}}" > ./src/main/resources/application.yml
    - uses: actions/upload-artifact@v3
      with:
        name: application.yml
        path: ./src/main/resources/application.yml


    - name: Grant execute permission for gradlew
      run: chmod +x ./gradlew
      shell: bash

    - name: Make zip file
      run: zip -r ./$GITHUB_SHA.zip .
      shell: bash

    # (3) Gradle build (Test 제외)
    - name: Build with Gradle
      uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
      with:
        arguments: clean build -x test

    - name: Make zip file
      run: zip -r ./$GITHUB_SHA.zip .
      shell: bash

    # (4) AWS 인증 (IAM 사용자 Access Key, Secret Key 활용 )
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ secrets.AWS_REGION }}

    # (5) 빌드 결과물을 S3 버킷에 업로드
    - name: Upload to AWS S3
      run: |
        aws s3 cp --region ${{ secrets.AWS_REGION }} ./$GITHUB_SHA.zip s3://${{ secrets.S3_BUCKET_NAME }}/$GITHUB_SHA.zip

    # (6) S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행
    - name: Deploy to AWS EC2 from S3
      run: |
        aws deploy create-deployment \
          --application-name ${{ secrets.CODE_DEPLOY_APPLICATION_NAME }} \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --deployment-group-name ${{ secrets.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
          --s3-location bucket=${{ secrets.S3_BUCKET_NAME }},key=$GITHUB_SHA.zip,bundleType=zip
name: Deploy to Amazon EC2

on:
  push:
    branches:
      - main

permissions:
  contents: read

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    env :
      working-directory: ./
      APPLICATION: ${{ secrets.APPLICATION }}

    steps:
    # (1) 기본 체크아웃
    - name: Checkout
      uses: actions/checkout@v3

    # (2) JDK 11 세팅
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        distribution: 'temurin'
        java-version: '11'
              
              
    - uses: actions/checkout@v3
    - run: touch ./src/main/resources/application.yml
    - run: echo "${{env.APPLICATION}}" > ./src/main/resources/application.yml
    - uses: actions/upload-artifact@v3
      with:
        name: application.yml
        path: ./src/main/resources/application.yml


    - name: Grant execute permission for gradlew
      run: chmod +x ./gradlew
      shell: bash

    - name: Make zip file
      run: zip -r ./$GITHUB_SHA.zip .
      shell: bash

    # (3) Gradle build (Test 제외)
    - name: Build with Gradle
      uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
      with:
        arguments: clean build -x test

    - name: Cleanup Gradle Cache
      if: ${{ always() }}
      run: |
        rm -f ~/.gradle/caches/modules-2/modules-2.lock
        rm -f ~/.gradle/caches/modules-2/gc.properties

    - name: Docker build
      run: |
        sudo docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
        sudo docker build -t ${{ secrets.PROJECT_NAME }} .
        sudo docker tag ${{ secrets.PROJECT_NAME }} ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7}
        sudo docker push ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7}

    - name: Deploy
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.EC2_SERVER_HOST }}
        username: ec2-user
        key: ${{ secrets.KEY }}
        envs: GITHUB_SHA
        script: |
          sudo docker stop $(sudo docker ps -a -q)
          sudo docker rm $(sudo docker ps -a -q)
          sudo docker rmi $(sudo docker images -q)
          sudo docker pull ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7}
          sudo docker tag ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7} ${{ secrets.PROJECT_NAME }}
          sudo docker stop ${{ secrets.PROJECT_NAME }}
          sudo docker rm ${{ secrets.PROJECT_NAME }}
          sudo docker run -d -p 80:8080 --name ${{ secrets.PROJECT_NAME }} ${{ secrets.PROJECT_NAME }}

#    - name: Make zip file
#      run: zip -r ./$GITHUB_SHA.zip .
#      shell: bash

#    # (4) AWS 인증 (IAM 사용자 Access Key, Secret Key 활용 )
#    - name: Configure AWS credentials
#      uses: aws-actions/configure-aws-credentials@v1
#      with:
#        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
#        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
#        aws-region: ${{ secrets.AWS_REGION }}
#
#    # (5) 빌드 결과물을 S3 버킷에 업로드
#    - name: Upload to AWS S3
#      run: |
#        aws s3 cp --region ${{ secrets.AWS_REGION }} ./$GITHUB_SHA.zip s3://${{ secrets.S3_BUCKET_NAME }}/$GITHUB_SHA.zip
#
#    # (6) S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행
#    - name: Deploy to AWS EC2 from S3
#      run: |
#        aws deploy create-deployment \
#          --application-name ${{ secrets.CODE_DEPLOY_APPLICATION_NAME }} \
#          --deployment-config-name CodeDeployDefault.AllAtOnce \
#          --deployment-group-name ${{ secrets.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
#          --s3-location bucket=${{ secrets.S3_BUCKET_NAME }},key=$GITHUB_SHA.zip,bundleType=zip

 

on 에서는 워크플로우를 수행할 이벤트를 결정한다. 

위 코드는 main을 베이스 브랜치로 한 pull request를 생성하였을 때 수행된다는 뜻이다. 

jobs 에서는 수행할 워크플로우를 차례대로 입력하면 된다. 

 

4. commit 하고 pull request 까지 한다.

PR을 하면 자동으로 Github Actions가 동작하여 빌드를 실행한다. 

모든 워크 플로우가 성공하면 녹색으로 성공 여부를 알려준다. 

근데 나는 에러가 발생했는데, 

당연한거다. application.yml이 깃허브에 업로드 되어 있지 않으니.

 

5. application.yml 넣기

settings → Security.Actions

APPLICATION 에 application.yml 넣고, 각종 환경변수 넣기

 

# AWS

0. EC2에서 Tag 추가 (CodeDeploy 에서 어떤 인스턴스에 실행할 지 구분하는 값)

 

1. IAM에서 CodeDeploy, S3 권한 주기

- EC2 전용 role 추가

- ec2 인스턴스로 가서 IAM ROLE 수정 

2.3. 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
chmod +x ./install
sudo ./install auto > /tmp/logfile
sudo service codedeploy-agent status

CodeDeploy 에이전트가 설치되어 실행 중이면 "The AWS CodeDeploy agent is running"와 같은 메시지가 표시되어야 합니다.

 

CodeDeploy 전용 IAM 역할 만들기

 

 

 

2. jar 파일을 담을 S3 버킷을 새로 만듦

3. aws CodeDeploy 이동 → Deploy.Applications.[Create application]

4. create deployment group

 

5. Github Actions 에서 사용할 IAM 사용자 추가

- S3FullAccess, CodeDeployFullAccess 권한을 주는 user를 생성한 후, 키 발급. 

받은 키를 깃허브 레포 환경변수로 저장

 

 

7.3. build.gradle 파일 수정

위 스크립트를 보면 /build/libs/*.jar 파일을 $JAR_FILE 파일로 복사합니다.

그런데 Spring Boot 2.5 버전부터는 빌드 시 일반 jar 파일 하나와 -plain.jar 파일 하나가 함께 만들어집니다.

그래서 빌드 시 plain jar 파일은 만들어지지 않도록 build.gradle 파일에 다음 내용을 추가해야 합니다.

jar {
    enabled = false
}

 

 

6. AppSpec 파일 작성

이제 CodeDeploy 에서 배포를 위해 참조할 appspec.yml 작성합니다.

version: 0.0
os: linux

files:
  - source:  /
    destination: /home/ec2-user/action
    overwrite: yes

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

hooks:
  ApplicationStart:
    - location: scripts/deploy.sh
      timeout: 60
      runas: ec2-user

 

파일위치

scripts/deploy.sh 를 안에 둔다. 

appspec.yml도 위에.

application-prod.yml 에 로그찍는 부분 다음과 같이 수정 

 

 

 

 

 

🤬 도커 해보자.....ㅡㅡ

환경변수 KEY에는 .pem 내용 넣어주고, 

DOCKER_PASSWORD는 도커 허브에서 받은 access_token을 넣어줬음 

$ sudo systemctl start docker
$ sudo systemctl enable docker

ec2에서 도커 켜주고 (설치하고)

 

 

<<<<에러 이거 뜨면요>>>>

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/auth": dial unix /var/run/docker.sock: connect: permission denied

sudo chmod 666 /var/run/docker.sock

ec2에서 이거 하시면 됩니다. 

docker login 커맨드로 오류 안뜨는지 확인!

 

Dockerfile

FROM openjdk:11
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

 

build.gradle 에 이거 넣어줘야함

jar {
	enabled = false
}