SpringBoot Web Service – Part 5 – Github Action

GitHub Actions provide a seamless way to integrate CI/CD into your repository, automating various tasks like running tests, building artifacts, and deploying your project.

Workflow for SNAPSHOT

This workflow is triggered on non-main branches or manually through the workflow dispatch event. It includes the following steps:

  • Run tests: Ensures that your code passes all tests.
  • Build the JAR file: Compiles your Spring Boot application.
  • Build Docker image and push it to GitHub Docker Registry: Creates a Docker image from the generated artifact and pushes it to the GitHub Container Registry.
<span>name</span><span>:</span> <span>Test and Build Snapshot</span>
<span>on</span><span>:</span>
<span>push</span><span>:</span>
<span>branches-ignore</span><span>:</span>
<span>-</span> <span>main</span>
<span>workflow_dispatch</span><span>:</span>
<span>permissions</span><span>:</span>
<span>contents</span><span>:</span> <span>read</span>
<span>packages</span><span>:</span> <span>write</span>
<span>jobs</span><span>:</span>
<span>maven-verify</span><span>:</span>
<span>if</span><span>:</span> <span>"</span><span>!contains(github.event.head_commit.message,</span><span> </span><span>'[skip</span><span> </span><span>ci]')"</span>
<span>runs-on</span><span>:</span> <span>ubuntu-latest</span>
<span>steps</span><span>:</span>
<span>-</span> <span>uses</span><span>:</span> <span>actions/checkout@v4</span>
<span>-</span> <span>name</span><span>:</span> <span>Set up JDK </span><span>21</span>
<span>uses</span><span>:</span> <span>actions/setup-java@v4</span>
<span>with</span><span>:</span>
<span>java-version</span><span>:</span> <span>'</span><span>21'</span>
<span>distribution</span><span>:</span> <span>'</span><span>temurin'</span>
<span>cache</span><span>:</span> <span>maven</span>
<span>cache-dependency-path</span><span>:</span> <span>'</span><span>**/pom.xml'</span>
<span>-</span> <span>name</span><span>:</span> <span>Verify</span>
<span>run</span><span>:</span> <span>mvn -B clean verify --file pom.xml</span>
<span>maven-build</span><span>:</span>
<span>needs</span><span>:</span> <span>maven-verify</span>
<span>runs-on</span><span>:</span> <span>ubuntu-latest</span>
<span>steps</span><span>:</span>
<span>-</span> <span>uses</span><span>:</span> <span>actions/checkout@v4</span>
<span>-</span> <span>name</span><span>:</span> <span>Set up JDK </span><span>21</span>
<span>uses</span><span>:</span> <span>actions/setup-java@v4</span>
<span>with</span><span>:</span>
<span>java-version</span><span>:</span> <span>'</span><span>21'</span>
<span>distribution</span><span>:</span> <span>'</span><span>temurin'</span>
<span>cache</span><span>:</span> <span>maven</span>
<span>cache-dependency-path</span><span>:</span> <span>'</span><span>**/pom.xml'</span>
<span>-</span> <span>name</span><span>:</span> <span>Build</span>
<span>run</span><span>:</span> <span>mvn -B package --file pom.xml</span>
<span>-</span> <span>name</span><span>:</span> <span>Upload artifact</span>
<span>uses</span><span>:</span> <span>actions/upload-artifact@v4</span>
<span>with</span><span>:</span>
<span>name</span><span>:</span> <span>app.jar</span>
<span>path</span><span>:</span> <span>target/*.jar</span>
<span>docker-build-push</span><span>:</span>
<span>needs</span><span>:</span> <span>maven-build</span>
<span>runs-on</span><span>:</span> <span>ubuntu-latest</span>
<span>env</span><span>:</span>
<span>CURRENT_VERSION</span><span>:</span> <span>'</span><span>'</span>
<span>steps</span><span>:</span>
<span>-</span> <span>uses</span><span>:</span> <span>actions/checkout@v4</span>
<span>-</span> <span>name</span><span>:</span> <span>Download artifact</span>
<span>uses</span><span>:</span> <span>actions/download-artifact@v4</span>
<span>with</span><span>:</span>
<span>name</span><span>:</span> <span>app.jar</span>
<span>path</span><span>:</span> <span>target</span>
<span>-</span> <span>name</span><span>:</span> <span>Set up Docker Buildx</span>
<span>uses</span><span>:</span> <span>docker/setup-buildx-action@v3</span>
<span>-</span> <span>name</span><span>:</span> <span>Log in to GitHub Container Registry</span>
<span>uses</span><span>:</span> <span>docker/login-action@v3</span>
<span>with</span><span>:</span>
<span>registry</span><span>:</span> <span>ghcr.io</span>
<span>username</span><span>:</span> <span>${{ github.repository_owner }}</span>
<span>password</span><span>:</span> <span>${{ secrets.GHCR_PAT }}</span>
<span>-</span> <span>name</span><span>:</span> <span>Get Version</span>
<span>run</span><span>:</span> <span>echo "CURRENT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV</span>
<span>-</span> <span>name</span><span>:</span> <span>Build Docker image</span>
<span>uses</span><span>:</span> <span>docker/build-push-action@v6</span>
<span>with</span><span>:</span>
<span>context</span><span>:</span> <span>.</span>
<span>push</span><span>:</span> <span>true</span>
<span>tags</span><span>:</span> <span>ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ env.CURRENT_VERSION }}-${{ github.run_id }}</span>
<span>name</span><span>:</span> <span>Test and Build Snapshot</span>

<span>on</span><span>:</span>
  <span>push</span><span>:</span>
    <span>branches-ignore</span><span>:</span>
      <span>-</span> <span>main</span>
  <span>workflow_dispatch</span><span>:</span>

<span>permissions</span><span>:</span>
  <span>contents</span><span>:</span> <span>read</span>
  <span>packages</span><span>:</span> <span>write</span>

<span>jobs</span><span>:</span>
  <span>maven-verify</span><span>:</span>
    <span>if</span><span>:</span> <span>"</span><span>!contains(github.event.head_commit.message,</span><span> </span><span>'[skip</span><span> </span><span>ci]')"</span>

    <span>runs-on</span><span>:</span> <span>ubuntu-latest</span>

    <span>steps</span><span>:</span>
      <span>-</span> <span>uses</span><span>:</span> <span>actions/checkout@v4</span>

      <span>-</span> <span>name</span><span>:</span> <span>Set up JDK </span><span>21</span>
        <span>uses</span><span>:</span> <span>actions/setup-java@v4</span>
        <span>with</span><span>:</span>
          <span>java-version</span><span>:</span> <span>'</span><span>21'</span>
          <span>distribution</span><span>:</span> <span>'</span><span>temurin'</span>
          <span>cache</span><span>:</span> <span>maven</span>
          <span>cache-dependency-path</span><span>:</span> <span>'</span><span>**/pom.xml'</span>

      <span>-</span> <span>name</span><span>:</span> <span>Verify</span>
        <span>run</span><span>:</span> <span>mvn -B clean verify --file pom.xml</span>

  <span>maven-build</span><span>:</span>
    <span>needs</span><span>:</span> <span>maven-verify</span>
    <span>runs-on</span><span>:</span> <span>ubuntu-latest</span>

    <span>steps</span><span>:</span>
      <span>-</span> <span>uses</span><span>:</span> <span>actions/checkout@v4</span>

      <span>-</span> <span>name</span><span>:</span> <span>Set up JDK </span><span>21</span>
        <span>uses</span><span>:</span> <span>actions/setup-java@v4</span>
        <span>with</span><span>:</span>
          <span>java-version</span><span>:</span> <span>'</span><span>21'</span>
          <span>distribution</span><span>:</span> <span>'</span><span>temurin'</span>
          <span>cache</span><span>:</span> <span>maven</span>
          <span>cache-dependency-path</span><span>:</span> <span>'</span><span>**/pom.xml'</span>

      <span>-</span> <span>name</span><span>:</span> <span>Build</span>
        <span>run</span><span>:</span> <span>mvn -B package --file pom.xml</span>

      <span>-</span> <span>name</span><span>:</span> <span>Upload artifact</span>
        <span>uses</span><span>:</span> <span>actions/upload-artifact@v4</span>
        <span>with</span><span>:</span>
          <span>name</span><span>:</span> <span>app.jar</span>
          <span>path</span><span>:</span> <span>target/*.jar</span>

  <span>docker-build-push</span><span>:</span>
    <span>needs</span><span>:</span> <span>maven-build</span>
    <span>runs-on</span><span>:</span> <span>ubuntu-latest</span>
    <span>env</span><span>:</span>
      <span>CURRENT_VERSION</span><span>:</span> <span>'</span><span>'</span>

    <span>steps</span><span>:</span>
      <span>-</span> <span>uses</span><span>:</span> <span>actions/checkout@v4</span>

      <span>-</span> <span>name</span><span>:</span> <span>Download artifact</span>
        <span>uses</span><span>:</span> <span>actions/download-artifact@v4</span>
        <span>with</span><span>:</span>
          <span>name</span><span>:</span> <span>app.jar</span>
          <span>path</span><span>:</span> <span>target</span>

      <span>-</span> <span>name</span><span>:</span> <span>Set up Docker Buildx</span>
        <span>uses</span><span>:</span> <span>docker/setup-buildx-action@v3</span>

      <span>-</span> <span>name</span><span>:</span> <span>Log in to GitHub Container Registry</span>
        <span>uses</span><span>:</span> <span>docker/login-action@v3</span>
        <span>with</span><span>:</span>
          <span>registry</span><span>:</span> <span>ghcr.io</span>
          <span>username</span><span>:</span> <span>${{ github.repository_owner }}</span>
          <span>password</span><span>:</span> <span>${{ secrets.GHCR_PAT }}</span>

      <span>-</span> <span>name</span><span>:</span> <span>Get Version</span>
        <span>run</span><span>:</span> <span>echo "CURRENT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV</span>

      <span>-</span> <span>name</span><span>:</span> <span>Build Docker image</span>
        <span>uses</span><span>:</span> <span>docker/build-push-action@v6</span>
        <span>with</span><span>:</span>
          <span>context</span><span>:</span> <span>.</span>
          <span>push</span><span>:</span> <span>true</span>
          <span>tags</span><span>:</span> <span>ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ env.CURRENT_VERSION }}-${{ github.run_id }}</span>
name: Test and Build Snapshot on: push: branches-ignore: - main workflow_dispatch: permissions: contents: read packages: write jobs: maven-verify: if: "!contains(github.event.head_commit.message, '[skip ci]')" runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up JDK 21 uses: actions/setup-java@v4 with: java-version: '21' distribution: 'temurin' cache: maven cache-dependency-path: '**/pom.xml' - name: Verify run: mvn -B clean verify --file pom.xml maven-build: needs: maven-verify runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up JDK 21 uses: actions/setup-java@v4 with: java-version: '21' distribution: 'temurin' cache: maven cache-dependency-path: '**/pom.xml' - name: Build run: mvn -B package --file pom.xml - name: Upload artifact uses: actions/upload-artifact@v4 with: name: app.jar path: target/*.jar docker-build-push: needs: maven-build runs-on: ubuntu-latest env: CURRENT_VERSION: '' steps: - uses: actions/checkout@v4 - name: Download artifact uses: actions/download-artifact@v4 with: name: app.jar path: target - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GHCR_PAT }} - name: Get Version run: echo "CURRENT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV - name: Build Docker image uses: docker/build-push-action@v6 with: context: . push: true tags: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ env.CURRENT_VERSION }}-${{ github.run_id }}

Enter fullscreen mode Exit fullscreen mode

Workflow for RELEASE

This workflow runs when changes are pushed to the main branch and includes the following steps:

  • Build the release version: Compiles the release version of your project.
  • Build Docker image and push it to GitHub Docker Registry: Creates and pushes the Docker image to the GitHub Container Registry.
  • Increment SNAPSHOT version: Updates the version in pom.xml for future snapshot versions.
<span>name</span><span>:</span> <span>Build Release</span>
<span>on</span><span>:</span>
<span>push</span><span>:</span>
<span>branches</span><span>:</span>
<span>-</span> <span>main</span>
<span>workflow_dispatch</span><span>:</span>
<span>permissions</span><span>:</span>
<span>contents</span><span>:</span> <span>read</span>
<span>packages</span><span>:</span> <span>write</span>
<span>jobs</span><span>:</span>
<span>maven-build-release</span><span>:</span>
<span>if</span><span>:</span> <span>"</span><span>!contains(github.event.head_commit.message,</span><span> </span><span>'[skip</span><span> </span><span>ci]')"</span>
<span>runs-on</span><span>:</span> <span>ubuntu-latest</span>
<span>steps</span><span>:</span>
<span>-</span> <span>uses</span><span>:</span> <span>actions/checkout@v4</span>
<span>-</span> <span>name</span><span>:</span> <span>Set up JDK </span><span>21</span>
<span>uses</span><span>:</span> <span>actions/setup-java@v4</span>
<span>with</span><span>:</span>
<span>java-version</span><span>:</span> <span>'</span><span>21'</span>
<span>distribution</span><span>:</span> <span>'</span><span>temurin'</span>
<span>cache</span><span>:</span> <span>maven</span>
<span>cache-dependency-path</span><span>:</span> <span>'</span><span>**/pom.xml'</span>
<span>-</span> <span>name</span><span>:</span> <span>Prepare Release Version</span>
<span>run</span><span>:</span> <span>mvn versions:set -DremoveSnapshot</span>
<span>-</span> <span>name</span><span>:</span> <span>Build</span>
<span>run</span><span>:</span> <span>mvn -B clean package --file pom.xml -DskipTests</span>
<span>-</span> <span>name</span><span>:</span> <span>Upload artifact</span>
<span>uses</span><span>:</span> <span>actions/upload-artifact@v4</span>
<span>with</span><span>:</span>
<span>name</span><span>:</span> <span>app.jar</span>
<span>path</span><span>:</span> <span>target/*.jar</span>
<span>docker-build-push</span><span>:</span>
<span>needs</span><span>:</span> <span>maven-build-release</span>
<span>runs-on</span><span>:</span> <span>ubuntu-latest</span>
<span>env</span><span>:</span>
<span>CURRENT_VERSION</span><span>:</span> <span>'</span><span>'</span>
<span>steps</span><span>:</span>
<span>-</span> <span>uses</span><span>:</span> <span>actions/checkout@v4</span>
<span>-</span> <span>name</span><span>:</span> <span>Download artifact</span>
<span>uses</span><span>:</span> <span>actions/download-artifact@v4</span>
<span>with</span><span>:</span>
<span>name</span><span>:</span> <span>app.jar</span>
<span>path</span><span>:</span> <span>target</span>
<span>-</span> <span>name</span><span>:</span> <span>Set up Docker Buildx</span>
<span>uses</span><span>:</span> <span>docker/setup-buildx-action@v3</span>
<span>-</span> <span>name</span><span>:</span> <span>Log in to GitHub Container Registry</span>
<span>uses</span><span>:</span> <span>docker/login-action@v3</span>
<span>with</span><span>:</span>
<span>registry</span><span>:</span> <span>ghcr.io</span>
<span>username</span><span>:</span> <span>${{ github.repository_owner }}</span>
<span>password</span><span>:</span> <span>${{ secrets.GHCR_PAT }}</span>
<span>-</span> <span>name</span><span>:</span> <span>Get Version</span>
<span>run</span><span>:</span> <span>|</span>
<span>mvn versions:set -DremoveSnapshot</span>
<span>echo "CURRENT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV</span>
<span>-</span> <span>name</span><span>:</span> <span>Build Docker image</span>
<span>uses</span><span>:</span> <span>docker/build-push-action@v6</span>
<span>with</span><span>:</span>
<span>context</span><span>:</span> <span>.</span>
<span>push</span><span>:</span> <span>true</span>
<span>tags</span><span>:</span> <span>ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ env.CURRENT_VERSION }}-${{ github.run_id }}</span>
<span>increment-version</span><span>:</span>
<span>needs</span><span>:</span> <span>docker-build-push</span>
<span>runs-on</span><span>:</span> <span>ubuntu-latest</span>
<span>permissions</span><span>:</span>
<span>contents</span><span>:</span> <span>write</span>
<span>steps</span><span>:</span>
<span>-</span> <span>uses</span><span>:</span> <span>actions/checkout@v4</span>
<span>with</span><span>:</span>
<span>token</span><span>:</span> <span>${{ secrets.GIT_PAT }}</span>
<span>-</span> <span>name</span><span>:</span> <span>Configure Git</span>
<span>run</span><span>:</span> <span>|</span>
<span>git config --global user.name "github-actions[bot]"</span>
<span>git config --global user.email "github-actions[bot]@users.noreply.github.com"</span>
<span>-</span> <span>name</span><span>:</span> <span>Increment Snapshot Version</span>
<span>run</span><span>:</span> <span>|</span>
<span># Extract current version and increment patch version</span>
<span>CURRENT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)</span>
<span>MAJOR=$(echo $CURRENT_VERSION | cut -d. -f1)</span>
<span>MINOR=$(echo $CURRENT_VERSION | cut -d. -f2)</span>
<span>PATCH=$(echo $CURRENT_VERSION | cut -d. -f3 | cut -d- -f1)</span>
<span>NEW_PATCH=$((PATCH + 1))</span>
<span>NEW_VERSION="$MAJOR.$MINOR.$NEW_PATCH-SNAPSHOT"</span>
<span># Update version in pom.xml</span>
<span>mvn versions:set -DnewVersion=$NEW_VERSION</span>
<span>mvn versions:commit</span>
<span># Commit and push the new snapshot version</span>
<span>git add pom.xml</span>
<span>git commit -m "Increment version to $NEW_VERSION [skip ci]"</span>
<span>git push origin $(git rev-parse --abbrev-ref HEAD)</span>
<span>name</span><span>:</span> <span>Build Release</span>

<span>on</span><span>:</span>
  <span>push</span><span>:</span>
    <span>branches</span><span>:</span>
      <span>-</span> <span>main</span>
  <span>workflow_dispatch</span><span>:</span>

<span>permissions</span><span>:</span>
  <span>contents</span><span>:</span> <span>read</span>
  <span>packages</span><span>:</span> <span>write</span>

<span>jobs</span><span>:</span>
  <span>maven-build-release</span><span>:</span>
    <span>if</span><span>:</span> <span>"</span><span>!contains(github.event.head_commit.message,</span><span> </span><span>'[skip</span><span> </span><span>ci]')"</span>

    <span>runs-on</span><span>:</span> <span>ubuntu-latest</span>

    <span>steps</span><span>:</span>
      <span>-</span> <span>uses</span><span>:</span> <span>actions/checkout@v4</span>

      <span>-</span> <span>name</span><span>:</span> <span>Set up JDK </span><span>21</span>
        <span>uses</span><span>:</span> <span>actions/setup-java@v4</span>
        <span>with</span><span>:</span>
          <span>java-version</span><span>:</span> <span>'</span><span>21'</span>
          <span>distribution</span><span>:</span> <span>'</span><span>temurin'</span>
          <span>cache</span><span>:</span> <span>maven</span>
          <span>cache-dependency-path</span><span>:</span> <span>'</span><span>**/pom.xml'</span>

      <span>-</span> <span>name</span><span>:</span> <span>Prepare Release Version</span>
        <span>run</span><span>:</span> <span>mvn versions:set -DremoveSnapshot</span>

      <span>-</span> <span>name</span><span>:</span> <span>Build</span>
        <span>run</span><span>:</span> <span>mvn -B clean package --file pom.xml -DskipTests</span>

      <span>-</span> <span>name</span><span>:</span> <span>Upload artifact</span>
        <span>uses</span><span>:</span> <span>actions/upload-artifact@v4</span>
        <span>with</span><span>:</span>
          <span>name</span><span>:</span> <span>app.jar</span>
          <span>path</span><span>:</span> <span>target/*.jar</span>

  <span>docker-build-push</span><span>:</span>
    <span>needs</span><span>:</span> <span>maven-build-release</span>
    <span>runs-on</span><span>:</span> <span>ubuntu-latest</span>
    <span>env</span><span>:</span>
      <span>CURRENT_VERSION</span><span>:</span> <span>'</span><span>'</span>

    <span>steps</span><span>:</span>
      <span>-</span> <span>uses</span><span>:</span> <span>actions/checkout@v4</span>

      <span>-</span> <span>name</span><span>:</span> <span>Download artifact</span>
        <span>uses</span><span>:</span> <span>actions/download-artifact@v4</span>
        <span>with</span><span>:</span>
          <span>name</span><span>:</span> <span>app.jar</span>
          <span>path</span><span>:</span> <span>target</span>

      <span>-</span> <span>name</span><span>:</span> <span>Set up Docker Buildx</span>
        <span>uses</span><span>:</span> <span>docker/setup-buildx-action@v3</span>

      <span>-</span> <span>name</span><span>:</span> <span>Log in to GitHub Container Registry</span>
        <span>uses</span><span>:</span> <span>docker/login-action@v3</span>
        <span>with</span><span>:</span>
          <span>registry</span><span>:</span> <span>ghcr.io</span>
          <span>username</span><span>:</span> <span>${{ github.repository_owner }}</span>
          <span>password</span><span>:</span> <span>${{ secrets.GHCR_PAT }}</span>

      <span>-</span> <span>name</span><span>:</span> <span>Get Version</span>
        <span>run</span><span>:</span> <span>|</span>
          <span>mvn versions:set -DremoveSnapshot</span>
          <span>echo "CURRENT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV</span>

      <span>-</span> <span>name</span><span>:</span> <span>Build Docker image</span>
        <span>uses</span><span>:</span> <span>docker/build-push-action@v6</span>
        <span>with</span><span>:</span>
          <span>context</span><span>:</span> <span>.</span>
          <span>push</span><span>:</span> <span>true</span>
          <span>tags</span><span>:</span> <span>ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ env.CURRENT_VERSION }}-${{ github.run_id }}</span>

  <span>increment-version</span><span>:</span>
    <span>needs</span><span>:</span> <span>docker-build-push</span>
    <span>runs-on</span><span>:</span> <span>ubuntu-latest</span>
    <span>permissions</span><span>:</span>
      <span>contents</span><span>:</span> <span>write</span>

    <span>steps</span><span>:</span>
      <span>-</span> <span>uses</span><span>:</span> <span>actions/checkout@v4</span>
        <span>with</span><span>:</span>
          <span>token</span><span>:</span> <span>${{ secrets.GIT_PAT }}</span>

      <span>-</span> <span>name</span><span>:</span> <span>Configure Git</span>
        <span>run</span><span>:</span> <span>|</span>
          <span>git config --global user.name "github-actions[bot]"</span>
          <span>git config --global user.email "github-actions[bot]@users.noreply.github.com"</span>

      <span>-</span> <span>name</span><span>:</span> <span>Increment Snapshot Version</span>
        <span>run</span><span>:</span> <span>|</span>
          <span># Extract current version and increment patch version</span>
          <span>CURRENT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)</span>
          <span>MAJOR=$(echo $CURRENT_VERSION | cut -d. -f1)</span>
          <span>MINOR=$(echo $CURRENT_VERSION | cut -d. -f2)</span>
          <span>PATCH=$(echo $CURRENT_VERSION | cut -d. -f3 | cut -d- -f1)</span>
          <span>NEW_PATCH=$((PATCH + 1))</span>
          <span>NEW_VERSION="$MAJOR.$MINOR.$NEW_PATCH-SNAPSHOT"</span>

          <span># Update version in pom.xml</span>
          <span>mvn versions:set -DnewVersion=$NEW_VERSION</span>
          <span>mvn versions:commit</span>

          <span># Commit and push the new snapshot version</span>
          <span>git add pom.xml</span>
          <span>git commit -m "Increment version to $NEW_VERSION [skip ci]"</span>
          <span>git push origin $(git rev-parse --abbrev-ref HEAD)</span>
name: Build Release on: push: branches: - main workflow_dispatch: permissions: contents: read packages: write jobs: maven-build-release: if: "!contains(github.event.head_commit.message, '[skip ci]')" runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up JDK 21 uses: actions/setup-java@v4 with: java-version: '21' distribution: 'temurin' cache: maven cache-dependency-path: '**/pom.xml' - name: Prepare Release Version run: mvn versions:set -DremoveSnapshot - name: Build run: mvn -B clean package --file pom.xml -DskipTests - name: Upload artifact uses: actions/upload-artifact@v4 with: name: app.jar path: target/*.jar docker-build-push: needs: maven-build-release runs-on: ubuntu-latest env: CURRENT_VERSION: '' steps: - uses: actions/checkout@v4 - name: Download artifact uses: actions/download-artifact@v4 with: name: app.jar path: target - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GHCR_PAT }} - name: Get Version run: | mvn versions:set -DremoveSnapshot echo "CURRENT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV - name: Build Docker image uses: docker/build-push-action@v6 with: context: . push: true tags: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ env.CURRENT_VERSION }}-${{ github.run_id }} increment-version: needs: docker-build-push runs-on: ubuntu-latest permissions: contents: write steps: - uses: actions/checkout@v4 with: token: ${{ secrets.GIT_PAT }} - name: Configure Git run: | git config --global user.name "github-actions[bot]" git config --global user.email "github-actions[bot]@users.noreply.github.com" - name: Increment Snapshot Version run: | # Extract current version and increment patch version CURRENT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) MAJOR=$(echo $CURRENT_VERSION | cut -d. -f1) MINOR=$(echo $CURRENT_VERSION | cut -d. -f2) PATCH=$(echo $CURRENT_VERSION | cut -d. -f3 | cut -d- -f1) NEW_PATCH=$((PATCH + 1)) NEW_VERSION="$MAJOR.$MINOR.$NEW_PATCH-SNAPSHOT" # Update version in pom.xml mvn versions:set -DnewVersion=$NEW_VERSION mvn versions:commit # Commit and push the new snapshot version git add pom.xml git commit -m "Increment version to $NEW_VERSION [skip ci]" git push origin $(git rev-parse --abbrev-ref HEAD)

Enter fullscreen mode Exit fullscreen mode

Bonus workflow

The CodeQL workflow analyzes your Java code to identify potential vulnerabilities and issues.

<span>name</span><span>:</span> <span>CodeQL</span>
<span>on</span><span>:</span>
<span>pull_request</span><span>:</span>
<span>branches</span><span>:</span> <span>[</span> <span>"</span><span>main"</span> <span>]</span>
<span>workflow_dispatch</span><span>:</span>
<span>jobs</span><span>:</span>
<span>analyze</span><span>:</span>
<span>name</span><span>:</span> <span>Analyze</span>
<span>runs-on</span><span>:</span> <span>ubuntu-latest</span>
<span>permissions</span><span>:</span>
<span>actions</span><span>:</span> <span>read</span>
<span>contents</span><span>:</span> <span>read</span>
<span>security-events</span><span>:</span> <span>write</span>
<span>strategy</span><span>:</span>
<span>fail-fast</span><span>:</span> <span>false</span>
<span>matrix</span><span>:</span>
<span>language</span><span>:</span> <span>[</span> <span>'</span><span>java'</span> <span>]</span>
<span>steps</span><span>:</span>
<span>-</span> <span>name</span><span>:</span> <span>Checkout repository</span>
<span>uses</span><span>:</span> <span>actions/checkout@v4</span>
<span>-</span> <span>name</span><span>:</span> <span>Setup Java</span>
<span>uses</span><span>:</span> <span>actions/setup-java@v4</span>
<span>with</span><span>:</span>
<span>java-version</span><span>:</span> <span>'</span><span>21'</span>
<span>distribution</span><span>:</span> <span>'</span><span>temurin'</span>
<span>cache</span><span>:</span> <span>maven</span>
<span>cache-dependency-path</span><span>:</span> <span>'</span><span>**/pom.xml'</span>
<span>-</span> <span>name</span><span>:</span> <span>Initialize CodeQL</span>
<span>uses</span><span>:</span> <span>github/codeql-action/init@v3</span>
<span>with</span><span>:</span>
<span>languages</span><span>:</span> <span>${{ matrix.language }}</span>
<span>-</span> <span>name</span><span>:</span> <span>Autobuild</span>
<span>uses</span><span>:</span> <span>github/codeql-action/autobuild@v3</span>
<span>-</span> <span>name</span><span>:</span> <span>Perform CodeQL Analysis</span>
<span>uses</span><span>:</span> <span>github/codeql-action/analyze@v3</span>
<span>with</span><span>:</span>
<span>category</span><span>:</span> <span>"</span><span>/language:${{matrix.language}}"</span>
<span>name</span><span>:</span> <span>CodeQL</span>

<span>on</span><span>:</span>
  <span>pull_request</span><span>:</span>
    <span>branches</span><span>:</span> <span>[</span> <span>"</span><span>main"</span> <span>]</span>
  <span>workflow_dispatch</span><span>:</span>

<span>jobs</span><span>:</span>
  <span>analyze</span><span>:</span>
    <span>name</span><span>:</span> <span>Analyze</span>
    <span>runs-on</span><span>:</span> <span>ubuntu-latest</span>
    <span>permissions</span><span>:</span>
      <span>actions</span><span>:</span> <span>read</span>
      <span>contents</span><span>:</span> <span>read</span>
      <span>security-events</span><span>:</span> <span>write</span>

    <span>strategy</span><span>:</span>
      <span>fail-fast</span><span>:</span> <span>false</span>
      <span>matrix</span><span>:</span>
        <span>language</span><span>:</span> <span>[</span> <span>'</span><span>java'</span> <span>]</span>

    <span>steps</span><span>:</span>
      <span>-</span> <span>name</span><span>:</span> <span>Checkout repository</span>
        <span>uses</span><span>:</span> <span>actions/checkout@v4</span>

      <span>-</span> <span>name</span><span>:</span> <span>Setup Java</span>
        <span>uses</span><span>:</span> <span>actions/setup-java@v4</span>
        <span>with</span><span>:</span>
          <span>java-version</span><span>:</span> <span>'</span><span>21'</span>
          <span>distribution</span><span>:</span> <span>'</span><span>temurin'</span>
          <span>cache</span><span>:</span> <span>maven</span>
          <span>cache-dependency-path</span><span>:</span> <span>'</span><span>**/pom.xml'</span>

      <span>-</span> <span>name</span><span>:</span> <span>Initialize CodeQL</span>
        <span>uses</span><span>:</span> <span>github/codeql-action/init@v3</span>
        <span>with</span><span>:</span>
          <span>languages</span><span>:</span> <span>${{ matrix.language }}</span>

      <span>-</span> <span>name</span><span>:</span> <span>Autobuild</span>
        <span>uses</span><span>:</span> <span>github/codeql-action/autobuild@v3</span>

      <span>-</span> <span>name</span><span>:</span> <span>Perform CodeQL Analysis</span>
        <span>uses</span><span>:</span> <span>github/codeql-action/analyze@v3</span>
        <span>with</span><span>:</span>
          <span>category</span><span>:</span> <span>"</span><span>/language:${{matrix.language}}"</span>
name: CodeQL on: pull_request: branches: [ "main" ] workflow_dispatch: jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: [ 'java' ] steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Java uses: actions/setup-java@v4 with: java-version: '21' distribution: 'temurin' cache: maven cache-dependency-path: '**/pom.xml' - name: Initialize CodeQL uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} - name: Autobuild uses: github/codeql-action/autobuild@v3 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v3 with: category: "/language:${{matrix.language}}"

Enter fullscreen mode Exit fullscreen mode

Updated Dockerfile

<span>### Build stage</span>
<span>FROM</span><span> </span><span>eclipse-temurin:21-jre-alpine</span><span> </span><span>AS</span><span> </span><span>builder</span>
<span># Set the working directory inside the container</span>
<span>WORKDIR</span><span> /tmp</span>
<span># Copy the source code into the container</span>
<span>COPY</span><span> target/*.jar app.jar</span>
<span># Extract the layers</span>
<span>RUN </span>java <span>-Djarmode</span><span>=</span>layertools <span>-jar</span> app.jar extract
<span>### Run stage</span>
<span># Create a minimal production image</span>
<span>FROM</span><span> eclipse-temurin:21-jre-alpine</span>
<span># Set the working directory inside the container</span>
<span>WORKDIR</span><span> /app</span>
<span># Set the working directory inside the container</span>
<span>COPY</span><span> --from=builder /tmp/dependencies/ ./</span>
<span>COPY</span><span> --from=builder /tmp/snapshot-dependencies/ ./</span>
<span>COPY</span><span> --from=builder /tmp/spring-boot-loader/ ./</span>
<span>COPY</span><span> --from=builder /tmp/application/ ./</span>
<span># Run the binary when the container starts</span>
<span>ENTRYPOINT</span><span> ["java", "org.springframework.boot.loader.launch.JarLauncher"]</span>
<span>### Build stage</span>
<span>FROM</span><span> </span><span>eclipse-temurin:21-jre-alpine</span><span> </span><span>AS</span><span> </span><span>builder</span>

<span># Set the working directory inside the container</span>
<span>WORKDIR</span><span> /tmp</span>

<span># Copy the source code into the container</span>
<span>COPY</span><span> target/*.jar app.jar</span>

<span># Extract the layers</span>
<span>RUN </span>java <span>-Djarmode</span><span>=</span>layertools <span>-jar</span> app.jar extract

<span>### Run stage</span>
<span># Create a minimal production image</span>
<span>FROM</span><span> eclipse-temurin:21-jre-alpine</span>

<span># Set the working directory inside the container</span>
<span>WORKDIR</span><span> /app</span>

<span># Set the working directory inside the container</span>
<span>COPY</span><span> --from=builder /tmp/dependencies/ ./</span>
<span>COPY</span><span> --from=builder /tmp/snapshot-dependencies/ ./</span>
<span>COPY</span><span> --from=builder /tmp/spring-boot-loader/ ./</span>
<span>COPY</span><span> --from=builder /tmp/application/ ./</span>

<span># Run the binary when the container starts</span>
<span>ENTRYPOINT</span><span> ["java", "org.springframework.boot.loader.launch.JarLauncher"]</span>
### Build stage FROM eclipse-temurin:21-jre-alpine AS builder # Set the working directory inside the container WORKDIR /tmp # Copy the source code into the container COPY target/*.jar app.jar # Extract the layers RUN java -Djarmode=layertools -jar app.jar extract ### Run stage # Create a minimal production image FROM eclipse-temurin:21-jre-alpine # Set the working directory inside the container WORKDIR /app # Set the working directory inside the container COPY --from=builder /tmp/dependencies/ ./ COPY --from=builder /tmp/snapshot-dependencies/ ./ COPY --from=builder /tmp/spring-boot-loader/ ./ COPY --from=builder /tmp/application/ ./ # Run the binary when the container starts ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]

Enter fullscreen mode Exit fullscreen mode

原文链接:SpringBoot Web Service – Part 5 – Github Action

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
Seeing your adorable smile is the absolute best part of my day.
看见你可爱的笑容绝对是我一天中最美好的事
评论 抢沙发

请登录后发表评论

    暂无评论内容