diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml new file mode 100644 index 0000000..185ca3e --- /dev/null +++ b/.github/workflows/gradle.yml @@ -0,0 +1,78 @@ +name: Auction server CI/CD with gradle + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build-docker-image: + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - 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- + + - name: Build with Gradle + run: ./gradlew build + + - name: Build docker image + run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/auction-service:latest -f Dockerfile . + + - name: login Docker + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + + - name: Push docker hub + run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/auction-service:latest + + run-docker-image-on-ec2: + needs: build-docker-image + runs-on: self-hosted + + steps: + - name: Pull image from docker hub + run: | + sudo docker login --username ${{ secrets.DOCKERHUB_USERNAME }} --password ${{ secrets.DOCKERHUB_PASSWORD }} + sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/auction-service:latest + + - name: Check if container is running + id: check-container + run: | + if sudo docker ps -a | grep -q auction-service; then + echo "auction-service-running=true" >> $GITHUB_OUTPUT + else + echo "auction-service-running=false" >> $GITHUB_OUTPUT + fi + + - name: Stop and remove container + if: steps.check-container.outputs.eureka-server-running == 'true' + run: sudo docker stop auction-service + + - name: Run new docker container + run: sudo docker run -d --name auction-service --rm -p 9001:9001 --net cheonma-network ${{ secrets.DOCKERHUB_USERNAME }}/auction-service:latest + + - name: Delete old docker image + run: sudo docker system prune -f \ No newline at end of file diff --git a/.gitignore b/.gitignore index d6709aa..e48b6be 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,4 @@ out/ /.nb-gradle/ ### VS Code ### -.vscode/ - -*.yml \ No newline at end of file +.vscode/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 8c70e10..bc72446 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,21 @@ -FROM openjdk:17-slim -CMD ["./gradlew", "clean", "build"] +FROM bellsoft/liberica-openjdk-alpine:17 as build +WORKDIR /workspace/app + +# Copy the built JAR file +COPY build/libs/*.jar . + +# Unpack the built application +RUN mkdir -p target/extracted +RUN java -Djarmode=layertools -jar *.jar extract --destination target/extracted + +FROM bellsoft/liberica-openjdk-alpine:17 VOLUME /tmp -ARG JAR_FILE=build/libs/*.jar -COPY ${JAR_FILE} app.jar -EXPOSE 9001 -ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file +ARG EXTRACTED=/workspace/app/target/extracted + +# Copy over the unpacked application +COPY --from=build ${EXTRACTED}/dependencies/ ./ +COPY --from=build ${EXTRACTED}/spring-boot-loader/ ./ +COPY --from=build ${EXTRACTED}/snapshot-dependencies/ ./ +COPY --from=build ${EXTRACTED}/application/ ./ + +ENTRYPOINT ["java","-Dspring.profiles.active=dev","org.springframework.boot.loader.JarLauncher"] \ No newline at end of file diff --git a/build.gradle b/build.gradle index 36fe5c2..3b66dc6 100644 --- a/build.gradle +++ b/build.gradle @@ -25,12 +25,16 @@ ext { set('springCloudVersion', "2022.0.5") } +jar { + enabled = false +} + dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.cloud:spring-cloud-starter-config' - implementation 'com.mysql:mysql-connector-j' + implementation 'org.postgresql:postgresql' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..9e5bf14 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,7 @@ +spring: + application: + name: auction-service + profiles: + active: dev + config: + import: optional:configserver:http://43.203.131.185:8071