diff --git a/.github/workflows/aws-dev.yml b/.github/workflows/aws-dev.yml deleted file mode 100644 index f4089536..00000000 --- a/.github/workflows/aws-dev.yml +++ /dev/null @@ -1,123 +0,0 @@ -# This workflow will build and push a new container image to Amazon ECR, -# and then will deploy a new task definition to Amazon ECS, when there is a push to the "develop" branch. -# -# To use this workflow, you will need to complete the following set-up steps: -# -# 1. Create an ECR repository to store your images. -# For example: `aws ecr create-repository --repository-name my-ecr-repo --region us-east-2`. -# Replace the value of the `ECR_REPOSITORY` environment variable in the workflow below with your repository's name. -# Replace the value of the `AWS_REGION` environment variable in the workflow below with your repository's region. -# -# 2. Create an ECS task definition, an ECS cluster, and an ECS service. -# For example, follow the Getting Started guide on the ECS console: -# https://us-east-2.console.aws.amazon.com/ecs/home?region=us-east-2#/firstRun -# Replace the value of the `ECS_SERVICE` environment variable in the workflow below with the name you set for the Amazon ECS service. -# Replace the value of the `ECS_CLUSTER` environment variable in the workflow below with the name you set for the cluster. -# -# 3. Store your ECS task definition as a JSON file in your repository. -# The format should follow the output of `aws ecs register-task-definition --generate-cli-skeleton`. -# Replace the value of the `ECS_TASK_DEFINITION` environment variable in the workflow below with the path to the JSON file. -# Replace the value of the `CONTAINER_NAME` environment variable in the workflow below with the name of the container -# in the `containerDefinitions` section of the task definition. -# -# 4. Store an IAM user access key in GitHub Actions secrets named `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`. -# See the documentation for each action used below for the recommended IAM policies for this IAM user, -# and best practices on handling the access key credentials. - -name: Deploy to Amazon ECS - -on: - push: - branches: [ "develop"] - -env: - AWS_REGION: ${{ secrets.AWS_ECS_REGION }} # set this to your preferred AWS region, e.g. us-west-1 - ECR_REPOSITORY: ${{ secrets.ECR_REPO }} # set this to your Amazon ECR repository name - ECS_SERVICE: dev-kodaero # set this to your Amazon ECS service name - ECS_CLUSTER: ${{ secrets.ECS_CLUSTER }} # set this to your Amazon ECS cluster name - ECS_TASK_DEFINITION: .aws/task-definition.json # set this to the path to your Amazon ECS task definition - # file, e.g. .aws/task-definition.json - CONTAINER_NAME: dev-kodaero # set this to the name of the container in the - # containerDefinitions section of your task definition - -permissions: - contents: read - -jobs: - deploy: - name: Deploy - runs-on: ubuntu-latest - environment: production - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'corretto' - - - name: make application-prod.yml - if: contains(github.ref, 'develop') || contains(github.ref, 'main') - run: | - cd ./src/main/resources - touch ./application-prod.yml - echo "${{ secrets.YML_DEV_PROD }}" > ./application-prod.yml - shell: bash - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - - name: Build with Gradle - env: - SPRING_PROFILES_ACTIVE: prod - run: ./gradlew clean build --stacktrace - shell: bash - - - 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: ${{ env.AWS_REGION }} - - - name: Login to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 - - - name: Build, tag, and push image to Amazon ECR - id: build-image - env: - ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} - IMAGE_TAG: ${{ github.sha }} - run: | - # Build a docker container and - # push it to ECR so that it can - # be deployed to ECS. - docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f ./Dockerfile . - docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG - echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT - - - name: Create task definition file - run: | - mkdir -p .aws # 디렉토리 없으면 생성 - echo '${{ secrets.DEV_TASK_DEFINITION_JSON }}' > .aws/task-definition.json - - - - name: Fill in the new image ID in the Amazon ECS task definition - id: task-def - uses: aws-actions/amazon-ecs-render-task-definition@v1 - with: - task-definition: ${{ env.ECS_TASK_DEFINITION }} - container-name: ${{ env.CONTAINER_NAME }} - image: ${{ steps.build-image.outputs.image }} - - - name: Deploy Amazon ECS task definition - uses: aws-actions/amazon-ecs-deploy-task-definition@v1 - with: - task-definition: ${{ steps.task-def.outputs.task-definition }} - service: ${{ env.ECS_SERVICE }} - cluster: ${{ env.ECS_CLUSTER }} - wait-for-service-stability: true diff --git a/.github/workflows/aws.yml b/.github/workflows/aws.yml deleted file mode 100644 index 31a4e5f5..00000000 --- a/.github/workflows/aws.yml +++ /dev/null @@ -1,123 +0,0 @@ -# This workflow will build and push a new container image to Amazon ECR, -# and then will deploy a new task definition to Amazon ECS, when there is a push to the "develop" branch. -# -# To use this workflow, you will need to complete the following set-up steps: -# -# 1. Create an ECR repository to store your images. -# For example: `aws ecr create-repository --repository-name my-ecr-repo --region us-east-2`. -# Replace the value of the `ECR_REPOSITORY` environment variable in the workflow below with your repository's name. -# Replace the value of the `AWS_REGION` environment variable in the workflow below with your repository's region. -# -# 2. Create an ECS task definition, an ECS cluster, and an ECS service. -# For example, follow the Getting Started guide on the ECS console: -# https://us-east-2.console.aws.amazon.com/ecs/home?region=us-east-2#/firstRun -# Replace the value of the `ECS_SERVICE` environment variable in the workflow below with the name you set for the Amazon ECS service. -# Replace the value of the `ECS_CLUSTER` environment variable in the workflow below with the name you set for the cluster. -# -# 3. Store your ECS task definition as a JSON file in your repository. -# The format should follow the output of `aws ecs register-task-definition --generate-cli-skeleton`. -# Replace the value of the `ECS_TASK_DEFINITION` environment variable in the workflow below with the path to the JSON file. -# Replace the value of the `CONTAINER_NAME` environment variable in the workflow below with the name of the container -# in the `containerDefinitions` section of the task definition. -# -# 4. Store an IAM user access key in GitHub Actions secrets named `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`. -# See the documentation for each action used below for the recommended IAM policies for this IAM user, -# and best practices on handling the access key credentials. - -name: Deploy to Amazon ECS - -on: - push: - branches: [ "main" ] - -env: - AWS_REGION: ${{ secrets.AWS_ECS_REGION }} # set this to your preferred AWS region, e.g. us-west-1 - ECR_REPOSITORY: ${{ secrets.ECR_REPO }} # set this to your Amazon ECR repository name - ECS_SERVICE: ${{ secrets.ECS_SERVICE }} # set this to your Amazon ECS service name - ECS_CLUSTER: ${{ secrets.ECS_CLUSTER }} # set this to your Amazon ECS cluster name - ECS_TASK_DEFINITION: .aws/task-definition.json # set this to the path to your Amazon ECS task definition - # file, e.g. .aws/task-definition.json - CONTAINER_NAME: kodaero # set this to the name of the container in the - # containerDefinitions section of your task definition - -permissions: - contents: read - -jobs: - deploy: - name: Deploy - runs-on: ubuntu-latest - environment: production - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'corretto' - - - name: make application-prod.yml - if: contains(github.ref, 'develop') || contains(github.ref, 'main') - run: | - cd ./src/main/resources - touch ./application-prod.yml - echo "${{ secrets.YML_PROD }}" > ./application-prod.yml - shell: bash - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - - name: Build with Gradle - env: - SPRING_PROFILES_ACTIVE: prod - run: ./gradlew clean build --stacktrace - shell: bash - - - 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: ${{ env.AWS_REGION }} - - - name: Login to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 - - - name: Build, tag, and push image to Amazon ECR - id: build-image - env: - ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} - IMAGE_TAG: ${{ github.sha }} - run: | - # Build a docker container and - # push it to ECR so that it can - # be deployed to ECS. - docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f ./Dockerfile . - docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG - echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT - - - name: Create task definition file - run: | - mkdir -p .aws # 디렉토리 없으면 생성 - echo '${{ secrets.TASK_DEFINITION_JSON }}' > .aws/task-definition.json - - - - name: Fill in the new image ID in the Amazon ECS task definition - id: task-def - uses: aws-actions/amazon-ecs-render-task-definition@v1 - with: - task-definition: ${{ env.ECS_TASK_DEFINITION }} - container-name: ${{ env.CONTAINER_NAME }} - image: ${{ steps.build-image.outputs.image }} - - - name: Deploy Amazon ECS task definition - uses: aws-actions/amazon-ecs-deploy-task-definition@v1 - with: - task-definition: ${{ steps.task-def.outputs.task-definition }} - service: ${{ env.ECS_SERVICE }} - cluster: ${{ env.ECS_CLUSTER }} - wait-for-service-stability: true diff --git a/.github/workflows/cd-dev.yml b/.github/workflows/cd-dev.yml new file mode 100644 index 00000000..a0450d6a --- /dev/null +++ b/.github/workflows/cd-dev.yml @@ -0,0 +1,72 @@ +name: CI/CD using github actions & docker + +on: + push: + branches: + - develop + +permissions: + contents: read + +jobs: + push_to_registry: + name: Push to aws container registry + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'corretto' + + - name: make application-prod.yml + if: contains(github.ref, 'develop') || contains(github.ref, 'main') + run: | + cd ./src/main/resources + touch ./application-prod.yml + echo "${{ secrets.YML_PROD }}" > ./application-prod.yml + shell: bash + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Build with Gradle + env: + SPRING_PROFILES_ACTIVE: prod + run: ./gradlew clean build --stacktrace + shell: bash + + - name: Docker build & push to prod + if: contains(github.ref, 'develop') || contains(github.ref, 'main') + run: | + docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASSWORD }} + docker build -t kodaero -f ./Dockerfile . + docker tag kodaero:latest ${{ secrets.DOCKER_USER }}/kodaero:latest + docker push ${{ secrets.DOCKER_USER }}/kodaero:latest + + + pull_from_registry: + name: Connect server ssh and pull from container registry + needs: push_to_registry + runs-on: ubuntu-latest + steps: + - name: Get Github action IP + id: ip + uses: haythem/public-ip@v1.2 + + - name: Deploy to prod + if: contains(github.ref, 'develop') || contains(github.ref, 'main') + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.HOST_NAME }} + username: ${{ secrets.USER_NAME }} + password: ${{ secrets.USER_PASSWORD }} + port: ${{ secrets.PORT }} + script: | + docker pull ${{ secrets.DOCKER_USER }}/kodaero:latest + chmod +x ./deploy.sh + ./deploy.sh dev + docker image prune -f diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 00000000..b4389eb1 --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,72 @@ +name: CI/CD using github actions & docker + +on: + push: + branches: + - main + +permissions: + contents: read + +jobs: + push_to_registry: + name: Push to aws container registry + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'corretto' + + - name: make application-prod.yml + if: contains(github.ref, 'develop') || contains(github.ref, 'main') + run: | + cd ./src/main/resources + touch ./application-prod.yml + echo "${{ secrets.YML_PROD }}" > ./application-prod.yml + shell: bash + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Build with Gradle + env: + SPRING_PROFILES_ACTIVE: prod + run: ./gradlew clean build --stacktrace + shell: bash + + - name: Docker build & push to prod + if: contains(github.ref, 'develop') || contains(github.ref, 'main') + run: | + docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASSWORD }} + docker build -t kodaero -f ./Dockerfile . + docker tag kodaero:latest ${{ secrets.DOCKER_USER }}/kodaero:latest + docker push ${{ secrets.DOCKER_USER }}/kodaero:latest + + + pull_from_registry: + name: Connect server ssh and pull from container registry + needs: push_to_registry + runs-on: ubuntu-latest + steps: + - name: Get Github action IP + id: ip + uses: haythem/public-ip@v1.2 + + - name: Deploy to prod + if: contains(github.ref, 'develop') || contains(github.ref, 'main') + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.HOST_NAME }} + username: ${{ secrets.USER_NAME }} + password: ${{ secrets.USER_PASSWORD }} + port: ${{ secrets.PORT }} + script: | + docker pull ${{ secrets.DOCKER_USER }}/kodaero:latest + chmod +x ./deploy.sh + ./deploy.sh prod + docker image prune -f diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7df659fa..e710d869 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,6 +4,9 @@ on: pull_request: branches: - develop + push: + branches: + - develop jobs: build: @@ -27,3 +30,11 @@ jobs: SPRING_PROFILES_ACTIVE: test run: ./gradlew clean build --stacktrace shell: bash + + - name: Docker build & push to prod + if: contains(github.ref, 'develop') || contains(github.ref, 'main') + run: | + docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASSWORD }} + docker build -t kodaero -f ./Dockerfile . + docker tag kodaero:latest ${{ secrets.DOCKER_USER }}/kodaero:latest + docker push ${{ secrets.DOCKER_USER }}/kodaero:latest diff --git a/build.gradle b/build.gradle index 6d20fbeb..d2b3ea41 100644 --- a/build.gradle +++ b/build.gradle @@ -102,6 +102,9 @@ dependencies { // cloudwatch implementation 'io.micrometer:micrometer-registry-cloudwatch2' implementation 'software.amazon.awssdk:cloudwatch' + + // prometheus + implementation 'io.micrometer:micrometer-registry-prometheus' } dependencyManagement { imports { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 2c365947..59bd84a1 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -105,4 +105,13 @@ date: decoded-key: ${HOLIDAY_API_DECODED_KEY} metrics: - environment: ${METRICS_ENV} \ No newline at end of file + environment: ${METRICS_ENV} + +management: + endpoints: + web: + exposure: + include: prometheus, health, info + metrics: + tags: + application: kodaero \ No newline at end of file