Deploy a Java Web App in DigitalOcean using GitHub Actions

How to deploy a maven application in DigitalOcean directly from GitHub

Deploy a Java Web App in DigitalOcean using GitHub Actions

I'm not a user of DigitalOcean, but I quickly tried if it's easy to deploy directly from GitHub.

To deploy the Spring application I choose  the 'App Platform', it's a Fully Managed infrastructure that should allow the developer to deploy directly from the code in few minutes.

I'm using a similar solution on other cloud platforms, and I was curious to see if DigitalOcean is a good alternative.

I didn't succeed to deploy 'directly' from the GitHub code. The solution that I implemented requires DigitalOcean Container Registry, this receives the images built by GitHub Actions and deploys the new image to the App.

container registry

The GitHub Actions file is like this (folder [.github/workflows]:

name: Build and deploy JAR app - marco-dev

on:
  push:
    branches: [feature/test-do]
  pull_request:
    branches: [feature/test-do]

  workflow_dispatch:
      inputs:
        version:
          description: 'Image version'
          required: true

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Set up Java version
        uses: actions/setup-java@v1
        with:
          java-version: '21'

      - name: Build with Maven
        run: mvn clean install

      - name: Build container image
        run: docker build -t registry.digitalocean.com/marco/java-example:1 .

      - name: Install doctl
        uses: digitalocean/action-doctl@v2
        with:
          token: ${{ secrets.DIGITAL_OCEAN }}

      - name: Log in to DigitalOcean Container Registry with short-lived credentials
        run: doctl registry login --expiry-seconds 600

      - name: Push image to DigitalOcean Container Registry
        run: docker push registry.digitalocean.com/marco/java-example:1

The Dockerfile in the project root was :

FROM eclipse-temurin:17-jdk
RUN mkdir /opt/app
COPY ./target/*.jar /opt/app/myApp.jar
CMD ["java", "-jar", "/opt/app/myApp.jar"]

GitHub Actions build the Image and deliver it to the container that automatically publish the new version when.

build result

This is more a personal note in case I will try this experiment again in the future or if somebody needs some help.

For this reason I won't spend a lot of time in details, you can contact me if you need help.

My first impression is that

  • The App Platform is easier for node and web applications. Java requires a build and a deployment phase, this requires more steps.
  • The free Repository capacity is very limited (500 MB), a script or a regular cleanup is required. Often the Docker images are more than 250MB.
  • DigitalOcean is a good alternative to other providers, but the options are limited.
  • In the App Platform https and certificates where already included in the package.

If you need help or a video to show how to deploy your Java application in DO, ping me on LinkedIn or on GitHub.