diff --git a/.github/workflows/staging-ci-cd.yml b/.github/workflows/staging-ci-cd.yml index b9f2245a1ecb24e75818e76ec49a7ccfddf507ff..95a10373bc6c94abfd4c9d8940703f30fe81ac66 100644 --- a/.github/workflows/staging-ci-cd.yml +++ b/.github/workflows/staging-ci-cd.yml @@ -1,78 +1,92 @@ -name: CI/CD Pipeline for Staging +name: Github CI on: push: branches: - staging - pull_request: - branches: - - staging jobs: build: + name: Build runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Set up JDK 21 (using Zulufx) - uses: actions/setup-java@v2 + - name: Checkout Repository + uses: actions/checkout@v4 + - name: Set up JDK 21 + uses: actions/setup-java@v4 with: - java-version: '21' - distribution: 'zulu' - java-package: jdk - architecture: x64 - + distribution: "temurin" + java-version: "21" + cache: "maven" + - name: Cache Maven dependencies + uses: actions/cache@v4 + with: + path: ~/.m2 + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- - name: Build with Maven - run: mvn clean install + run: | + mvn clean package -DskipTests + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: java-app + path: target/*.jar + test: + name: Test + runs-on: ubuntu-latest + needs: build + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + distribution: "temurin" + java-version: "21" + cache: "maven" + - name: Cache Maven dependencies + uses: actions/cache@v4 + with: + path: ~/.m2 + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- - name: Run Unit Tests run: mvn test - - - name: Run Regression Tests (JUnit 5, TestContainers) + - name: Generate Coverage Report + run: mvn jacoco:report + - name: Run Regression Tests run: mvn test -P regression-tests + - name: Run Integration Tests + run: mvn verify -P integration-tests + - name: Run User Acceptance Tests + run: mvn test -P uat - build-and-deliver: + publish: + name: Publish Docker Image runs-on: ubuntu-latest + needs: test steps: - - name: Checkout Code - uses: actions/checkout@v3 - - - name: Install the gcloud CLI - uses: google-github-actions/setup-gcloud@v2 + - name: Checkout Repository + uses: actions/checkout@v4 + - name: check directory + run: ls -al + - name: Download Artifact + uses: actions/download-artifact@v4 with: - project_id: ${{ secrets.GOOGLE_PROJECT }} - service_account_key: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }} - export_default_credentials: true - - - name: Authenticate with GCP - uses: google-github-actions/auth@v1 - with: - credentials_json: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }} - - - name: Build and Push Docker Image - env: - PRODUCTION: staging - GOOGLE_PROJECT: ${{ secrets.GOOGLE_PROJECT }} - JDBC_STAGING_DATABASE_PASSWORD: ${{ secrets.JDBC_STAGING_DATABASE_PASSWORD }} - JDBC_STAGING_DATABASE_URL: ${{ secrets.JDBC_STAGING_DATABASE_URL }} - JDBC_STAGING_DATABASE_USERNAME: ${{ secrets.JDBC_STAGING_DATABASE_USERNAME }} - run: | - gcloud auth configure-docker us-central1-docker.pkg.dev - docker build --build-arg PRODUCTION=$PRODUCTION --build-arg JDBC_STAGING_DATABASE_PASSWORD=$JDBC_STAGING_DATABASE_PASSWORD --build-arg JDBC_STAGING_DATABASE_URL=$JDBC_STAGING_DATABASE_URL --build-arg JDBC_STAGING_DATABASE_USERNAME=$JDBC_STAGING_DATABASE_USERNAME -t us-central1-docker.pkg.dev/$GOOGLE_PROJECT/staging-repository/authentication:latest . - docker push us-central1-docker.pkg.dev/$GOOGLE_PROJECT/staging-repository/authentication:latest - - - name: Install required components - run: | - gcloud components update - gcloud components install gke-gcloud-auth-plugin - - - name: Deploy to GKE + name: java-app + - name: check directory + run: ls -al + - name: Docker login env: - GOOGLE_PROJECT: ${{ secrets.GOOGLE_PROJECT }} - GOOGLE_REPOSiTORY: staging-repository + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + run: echo "$DOCKER_PASSWORD" | docker login -u ${{ secrets.REGISTRY_USER }} --password-stdin docker.io + - name: Set Docker BuildKit + run: export DOCKER_BUILDKIT=1 + - name: Build Docker Image run: | - gcloud container clusters get-credentials safetypin-staging --region asia-southeast2 - sed -i "s/GOOGLE_PROJECT/$GOOGLE_PROJECT/g" staging.yaml - kubectl apply -f staging.yaml \ No newline at end of file + docker build -t ${{ secrets.REGISTRY_USER }}/${{ secrets.IMAGE_NAME }}:${{ secrets.IMAGE_TAG }} . + docker push ${{ secrets.REGISTRY_USER }}/${{ secrets.IMAGE_NAME }}:${{ secrets.IMAGE_TAG }} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index fcc2364a5f41ab24e97fdb0a084feb527cd94c45..6a846b1248e7443a45b58a1570a88506c2066144 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,30 +1,6 @@ -# Step 1: Use Maven to build the JAR inside Docker -FROM maven:3.9.6-eclipse-temurin-21 AS builder -WORKDIR /app -COPY . . -RUN mvn clean package -DskipTests - -# Step 2: Use OpenJDK 21 to run the application FROM openjdk:21-jdk-slim -# Setup envs -ARG PRODUCTION -ARG JDBC_DATABASE_PASSWORD -ARG JDBC_DATABASE_URL -ARG JDBC_DATABASE_USERNAME -ARG JDBC_STAGING_DATABASE_USERNAME -ARG JDBC_STAGING_DATABASE_URL -ARG JDBC_STAGING_DATABASE_URL - -ENV PRODUCTION ${PRODUCTION} -ENV JDBC_DATABASE_PASSWORD ${JDBC_DATABASE_PASSWORD} -ENV JDBC_DATABASE_URL ${JDBC_DATABASE_URL} -ENV JDBC_DATABASE_USERNAME ${JDBC_DATABASE_USERNAME} -ENV JDBC_STAGING_DATABASE_PASSWORD ${JDBC_STAGING_DATABASE_PASSWORD} -ENV JDBC_STAGING_DATABASE_URL ${JDBC_STAGING_DATABASE_URL} -ENV JDBC_STAGING_DATABASE_USERNAME ${JDBC_STAGING_DATABASE_USERNAME} - WORKDIR /app -COPY --from=builder /app/target/authentication-0.1.jar app.jar +COPY ./authentication-0.1.jar /app/app.jar EXPOSE 8080 CMD ["java", "-jar", "app.jar"] diff --git a/src/main/java/com/safetypin/authentication/model/User.java b/src/main/java/com/safetypin/authentication/model/User.java index 7fd5f65f99ed01e7058afb07ad8b8dbb267984c2..7ed54255db5afb7689e43245651b806c05f1adde 100644 --- a/src/main/java/com/safetypin/authentication/model/User.java +++ b/src/main/java/com/safetypin/authentication/model/User.java @@ -27,7 +27,7 @@ public class User { // May be null for social login users @Setter @Getter - @Column(nullable = false) + @Column(nullable = true) private String password; @Setter