In this article, we’ll walk through the process of creating a custom Ubuntu Docker image with SDKMAN installed. SDKMAN is a tool for managing parallel versions of multiple Software Development Kits (SDKs) like Java, Scala, and sbt. We’ll also demonstrate how to use this custom image in a GitLab CI/CD pipeline.
Step 1: Creating the Custom Ubuntu Image
Below is a Dockerfile that sets up an Ubuntu 20.04 base image, installs necessary dependencies, and configures SDKMAN to install specific versions of Java, Scala, and sbt.
Dockerfile:
# Dockerfile
FROM ubuntu:20.04
# Install dependencies
RUN apt-get update && apt-get install -y \
    curl \
    unzip \
    zip \
    bash \
    git \
    vim \
    wget \
    jq \
    tmux 
# Install SDKMAN!
RUN curl -s "https://get.sdkman.io" | bash
# Set the shell to bash and ensure SDKMAN is sourced
SHELL ["/bin/bash", "-c"]
# Ensure SDKMAN is sourced and install specific SDKs
RUN source "$HOME/.sdkman/bin/sdkman-init.sh" && \
    sdk install java 21.0.2-open && \
    sdk install sbt 1.8.2 && \
    sdk install scala 2.13.10
# Set the working directory
WORKDIR /app
Explanation:
Base Image: We start with ubuntu:20.04 as the base image.
Dependencies: Essential tools like curl, unzip, git, and wget are installed.
SDKMAN Installation: SDKMAN is installed using its installation script.
SDK Installation: Specific versions of Java, Scala, and sbt are installed using SDKMAN.
Working Directory: The working directory is set to /app.
Building the Image:
To build the Docker image, run the following command:
docker build -t bansikah/gitlab-ci:v1.0.1 .
Push image to Registry(your personal dockerhub registry)
Also we will exec into the container to check if the tools we actually installed are there like below 
Push image & and exec into it to check sdkman version
Step 2: Using the Custom Image in a GitLab CI/CD Pipeline
Once the Docker image is built and pushed to a container registry (e.g., Docker Hub), you can use it in a GitLab CI/CD pipeline. Below is an example .gitlab-ci.yml file that uses the custom image and verifies the SDKMAN installation.
.gitlab-ci.yml
# .gitlab-ci.yml
image: bansikah/gitlab-ci:v1.0.1  
stages:
  - test
test-job:
  stage: test
  script:
    - echo "Checking SDKMAN version..."
    - source "$HOME/.sdkman/bin/sdkman-init.sh"  
    - sdk version
    - echo "Checking installed SDKs..."
    #- sdk list java
    #- sdk list scala
    #- sdk list sbt
Explanation:
Image: The custom Docker image (bansikah/gitlab-ci:v1.0.1) is specified as the base image for the pipeline.
Stages: A single stage (test) is defined.
Script:
The
sourcecommand ensures SDKMAN is initialized.The
sdk versioncommand checks the installed SDKMAN version.The
sdk listcommands display the installed versions of Java, Scala, and sbt.
Step 3: Running the Pipeline
When you push this .gitlab-ci.yml file to your GitLab repository, the pipeline will automatically run. The test-job will:
Use the custom Docker image.
Verify the SDKMAN installation.
List the installed SDKs (Java, Scala, and sbt).
Conclusion
By creating a custom Ubuntu image with SDKMAN pre-installed, you can streamline your development and CI/CD workflows. This approach ensures consistency across environments and reduces setup time for your pipelines. You can extend this setup by adding more SDKs or tools as needed.
Ref:
SDKMAN Official Documentation
Docker Documentation
GitLab CI/CD Documentation
Happy coding! 🚀
              


    
Top comments (0)