Compilar, probar y alojar en contenedores aplicaciones de Java

En esta página, se explica cómo usar Cloud Build para compilar, probar y alojar en contenedores aplicaciones basadas en Java, subir tus imágenes de contenedor a Artifact Registry y generar la procedencia de las compilaciones.

Antes de comenzar

Usa las imágenes de maven o gradle

Puedes configurar Cloud Build para compilar aplicaciones de Java mediante la imagen maven o la imagen gradle de Docker Hub.

Para ejecutar tus tareas en las imágenes de maven o gradle, especifica la URL de la imagen y la versión etiquetada de la imagen en el campo name del archivo de configuración de compilación. Si no especificas la etiqueta de imagen, Cloud Build usa la imagen latest de forma predeterminada. Cloud Build inicia la imagen especificada en name mediante el punto de entrada predeterminado de la imagen. Para anular el punto de entrada predeterminado y para invocar maven o gradle como un punto de entrada, especifica mvn o gradle en el campo entrypoint.

En el siguiente archivo de configuración de compilación, se especifica el entrypoint de las imágenes de maven o gradle y se muestra la versión de la herramienta de compilación:

maven

steps:
- name: maven:3.3-jdk-8
  entrypoint: mvn
  args: ['--version']

gradle

steps:
- name: gradle:5.6.2-jdk8
  entrypoint: gradle
  args: ['--version']

Configura compilaciones de Java

  1. En el directorio raíz del proyecto, crea un archivo de configuración de compilación llamado cloudbuild.yaml.

  2. Ejecuta pruebas: maven y gradle proporcionan maven test y gradle test, que descargan dependencias, compilan las aplicaciones y ejecutan las pruebas especificadas en el código fuente. En el campo args de un paso de compilación, se toma una lista de argumentos y se los pasa a la imagen a la que se hace referencia en el campo name.

    En el archivo de configuración de compilación, agrega test al campo args para invocar test dentro de maven y gradle:

    maven

    steps:
    - name: maven:3.3-jdk-8
      entrypoint: mvn
      args: ['test']
    

    gradle

    steps:
    - name: gradle:5.6.2-jdk8
      entrypoint: gradle
      args: ['test']
    
  3. Empaqueta la aplicación: A fin de empaquetar la aplicación en un archivo JAR para la imagen de maven, especifica el comando package en el campo args. El comando package compila un archivo JAR en /workspace/target/.

    Con el fin de empaquetar la aplicación en un archivo JAR para la imagen de gradle, especifica el comando assemble en el campo args. El comando assemble compila un archivo JAR en workspace/build/libs.

    En el siguiente paso de compilación, se empaqueta la aplicación de Java:

    maven

    steps:
    - name: maven:3.3-jdk-8
      entrypoint: mvn
      args: ['package','-Dmaven.test.skip=true']
    

    gradle

    steps:
    - name: gradle:5.6.2-jdk8
      entrypoint: gradle
      args: ['assemble']
    
  4. Crea contenedores en la aplicación: Cloud Build proporciona una imagen de Docker compilada con anterioridad que puedes usar para alojar tu aplicación de Java en contenedores. Para alojar tu aplicación de Java en contenedores, en tu archivo de configuración de compilación, haz lo siguiente:

    • Agrega un campo name y especifica la imagen de Docker compilada previamente en gcr.io/cloud-builders/docker.
    • Agrega un campo args y especifica los argumentos build, incluido el nombre de la imagen de contenedor que se compilará y la ruta de acceso al artefacto de compilación.
    • Agrega un campo images para enviar la imagen de contenedor compilada a Artifact Registry.
    • Opcional: Agrega requestedVerifyOption: VERIFIED al campo options de tu archivo de configuración de compilación para habilitar la generación de procedencia de los niveles de cadena de suministro para artefactos de software (SLSA).

    En el siguiente paso de compilación, se crean contenedores para la aplicación, se envía la imagen de contenedor a Artifact Registry y se genera información de procedencia de la compilación:

    maven

    steps:
    - name: gcr.io/cloud-builders/docker
      args: ['build', '-t', 'location-docker.pkg.dev/project-id/repository/image', '--build-arg=JAR_FILE=target/build-artifact', '.']
    images: ['location-docker.pkg.dev/project-id/repository/image']
    

    gradle

    steps:
    - name: gcr.io/cloud-builders/docker
      args: ['build', '-t', 'location-docker.pkg.dev/project-id/repository/image', '--build-arg=JAR_FILE=build/libs/build-artifact', '.']
    images: ['location-docker.pkg.dev/project-id/repository/image']
    

    Aquí:

    • location: Es la ubicación regional o multirregional de tu repositorio.
    • project-id: El ID del proyecto de Google Cloud.
    • repository: Es el nombre de tu repositorio de Artifact Registry.
    • image: El nombre de tu imagen de contenedor
    • build-artifact: El nombre de tu archivo JAR creado a partir del paso de compilación.
  5. Comienza a compilar: Cuando tengas listo el archivo de configuración de compilación, ingresa el siguiente comando en la terminal para comenzar la compilación:

    gcloud builds submit --region=REGION --config config-file-path source-directory
    

    Aquí:

    • config-file-path: Es la ruta de acceso a tu archivo de configuración de compilación. En este ejemplo, el archivo de configuración de compilación se llama cloudbuild.yaml.
    • source-directory: La ruta de acceso o la URL al código fuente.
    • REGION: Es una de las regiones de compilación compatibles.

    Si no se especifica config-file-path ni source-directory en el comando gcloud builds submit, Cloud Build da por hecho que el archivo de configuración y el código fuente están en el directorio de trabajo actual.

    Una vez que se complete la compilación, podrás ver los detalles del repositorio en Artifact Registry.

    También puedes ver los metadatos de procedencia de la compilación y validar la procedencia.

Ejemplos de código

Estos son algunos repositorios de ejemplo que puedes usar a fin de compilar apps de Java; contienen una aplicación de muestra y un archivo de configuración de compilación para compilar y probar dicha aplicación:

  • maven-example: Es una app de Java y un archivo de configuración de compilación de ejemplo para compilar y probar la aplicación con mvn.
  • gradle-example: Es una app de Java y un archivo de configuración de compilación de ejemplo para compilar y probar la aplicación con gradle.

¿Qué sigue?