Crear y compilar una tarea de Java en Cloud Run

Aprende a crear un trabajo de Cloud Run sencillo y, a continuación, a desplegarlo desde el origen, lo que empaqueta automáticamente tu código en una imagen de contenedor, sube la imagen de contenedor a Artifact Registry y, después, la despliega en Cloud Run. Puedes usar otros idiomas además de los que se muestran.

Antes de empezar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Install the Google Cloud CLI.

  5. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  6. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Verify that billing is enabled for your Google Cloud project.

  9. Install the Google Cloud CLI.

  10. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  11. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  12. Habilita las APIs Admin de Cloud Run y Cloud Build:

    gcloud services enable run.googleapis.com \
        cloudbuild.googleapis.com

    Una vez que se haya habilitado la API Cloud Run Admin, se creará automáticamente la cuenta de servicio predeterminada de Compute Engine.

  13. Haz clic para ver los roles necesarios de la cuenta de servicio de Cloud Build

    Cloud Build usa automáticamente la cuenta de servicio predeterminada de Compute Engine como cuenta de servicio predeterminada de Cloud Build para compilar tu código fuente y tu recurso de Cloud Run, a menos que anules este comportamiento. Para que Cloud Build compile tus fuentes, pide a tu administrador que conceda el rol Compilador de Cloud Run (roles/run.builder) a la cuenta de servicio predeterminada de Compute Engine de tu proyecto:

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
          --role=roles/run.builder
      

    Sustituye PROJECT_NUMBER por el número de tu proyecto Google Cloud y PROJECT_ID por el ID de tu proyecto Google Cloud. Para obtener instrucciones detalladas sobre cómo encontrar el ID y el número de tu proyecto, consulta el artículo Crear y gestionar proyectos.

    La concesión del rol de compilador de Cloud Run a la cuenta de servicio predeterminada de Compute Engine tarda un par de minutos en propagarse.

    Escribir la tarea de ejemplo

    Para escribir un trabajo en Java, sigue estos pasos:

    1. Crea un directorio llamado jobs y cambia al directorio:

      mkdir jobs
      cd jobs
      
    2. En un subdirectorio llamado src/main/java/com/example, crea un archivo JobsExample.java para el código del trabajo. Copia las siguientes líneas de ejemplo en él:

      
      package com.example;
      
      abstract class JobsExample {
        // These values are provided automatically by the Cloud Run Jobs runtime.
        private static String CLOUD_RUN_TASK_INDEX =
            System.getenv().getOrDefault("CLOUD_RUN_TASK_INDEX", "0");
        private static String CLOUD_RUN_TASK_ATTEMPT =
            System.getenv().getOrDefault("CLOUD_RUN_TASK_ATTEMPT", "0");
      
        // User-provided environment variables
        private static int SLEEP_MS = Integer.parseInt(System.getenv().getOrDefault("SLEEP_MS", "0"));
        private static float FAIL_RATE =
            Float.parseFloat(System.getenv().getOrDefault("FAIL_RATE", "0.0"));
      
        // Start script
        public static void main(String[] args) {
          System.out.println(
              String.format(
                  "Starting Task #%s, Attempt #%s...", CLOUD_RUN_TASK_INDEX, CLOUD_RUN_TASK_ATTEMPT));
          try {
            runTask(SLEEP_MS, FAIL_RATE);
          } catch (RuntimeException | InterruptedException e) {
            System.err.println(
                String.format(
                    "Task #%s, Attempt #%s failed.", CLOUD_RUN_TASK_INDEX, CLOUD_RUN_TASK_ATTEMPT));
            // Catch error and denote process-level failure to retry Task
            System.exit(1);
          }
        }
      
        static void runTask(int sleepTime, float failureRate) throws InterruptedException {
          // Simulate work
          if (sleepTime > 0) {
            Thread.sleep(sleepTime);
          }
      
          // Simulate errors
          if (failureRate < 0 || failureRate > 1) {
            System.err.println(
                String.format(
                    "Invalid FAIL_RATE value: %s. Must be a float between 0 and 1 inclusive.",
                    failureRate));
            return;
          }
          if (Math.random() < failureRate) {
            throw new RuntimeException("Task Failed.");
          }
          System.out.println(String.format("Completed Task #%s", CLOUD_RUN_TASK_INDEX));
        }
      }

      Las tareas de Cloud Run permiten a los usuarios especificar el número de tareas que debe ejecutar la tarea. En este código de ejemplo se muestra cómo usar la variable de entorno CLOUD_RUN_TASK_INDEX integrada. Cada tarea representa una copia en ejecución del contenedor. Ten en cuenta que las tareas suelen ejecutarse en paralelo. Usar varias tareas es útil si cada tarea puede procesar de forma independiente un subconjunto de tus datos.

      Cada tarea conoce su índice, que se almacena en la variable de entorno CLOUD_RUN_TASK_INDEX. La variable de entorno CLOUD_RUN_TASK_COUNT integrada contiene el número de tareas proporcionadas en el momento de la ejecución del trabajo a través del parámetro --tasks.

      El código que se muestra también indica cómo reintentar tareas mediante la variable de entorno CLOUD_RUN_TASK_ATTEMPT integrada, que contiene el número de veces que se ha reintentado esta tarea. El primer intento es 0 y se incrementa en 1 en cada reintento sucesivo, hasta --max-retries.

      El código también te permite generar fallos para probar los reintentos y generar registros de errores para que puedas ver cómo son.

    3. Crea un archivo pom.xml con el siguiente contenido:

      <?xml version="1.0" encoding="UTF-8"?>
      <!--
      Copyright 2021 Google LLC
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
      http://www.apache.org/licenses/LICENSE-2.0
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License.
      -->
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.example.run</groupId>
        <artifactId>jobs-example</artifactId>
        <version>0.0.1</version>
        <packaging>jar</packaging>
      
        <!--  The parent pom defines common style checks and testing strategies for our samples.
      	Removing or replacing it should not affect the execution of the samples in anyway. -->
        <parent>
          <groupId>com.google.cloud.samples</groupId>
          <artifactId>shared-configuration</artifactId>
          <version>1.2.0</version>
        </parent>
      
        <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
          <maven.compiler.target>17</maven.compiler.target>
          <maven.compiler.source>17</maven.compiler.source>
        </properties>
      
        <dependencyManagement>
          <dependencies>
            <dependency>
              <artifactId>libraries-bom</artifactId>
              <groupId>com.google.cloud</groupId>
              <scope>import</scope>
              <type>pom</type>
              <version>26.32.0</version>
            </dependency>
          </dependencies>
        </dependencyManagement>
      
        <dependencies>
          <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
          </dependency>
          <dependency>
            <groupId>com.google.truth</groupId>
            <artifactId>truth</artifactId>
            <version>1.4.0</version>
            <scope>test</scope>
          </dependency>
          <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>google-cloud-logging</artifactId>
            <scope>test</scope>
          </dependency>
        </dependencies>
      
        <build>
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-jar-plugin</artifactId>
              <version>3.3.0</version>
              <configuration>
                <archive>
                  <manifest>
                    <addClasspath>true</addClasspath>
                    <mainClass>com.example.JobsExample</mainClass>
                  </manifest>
                </archive>
              </configuration>
            </plugin>
          </plugins>
        </build>
      </project>
      
    4. Crea un archivo project.toml con el siguiente contenido para compilarlo con la versión de Java compatible con Buildpack:

      # Default version is Java 11
      #  - See https://cloud.google.com/docs/buildpacks/java#specify_a_java_version
      # Match the version required in pom.xml by setting it here
      #  - See https://cloud.google.com/docs/buildpacks/set-environment-variables#build_the_application_with_environment_variables
      
      [[build.env]]
        name = "GOOGLE_RUNTIME_VERSION"
        value = "17"
      

    El código está completo y listo para empaquetarse en un contenedor.

    Crear un contenedor de tareas, enviarlo a Artifact Registry y desplegarlo en Cloud Run

    Importante: En esta guía de inicio rápido se da por hecho que tienes el rol de propietario o editor en el proyecto que vas a usar. De lo contrario, consulta los permisos necesarios para implementar un recurso de Cloud Run desde el origen.

    En esta guía de inicio rápido se usa la opción de desplegar desde el código fuente, que crea el contenedor, lo sube a Artifact Registry y despliega el trabajo en Cloud Run:

    gcloud run jobs deploy job-quickstart \
        --source . \
        --tasks 50 \
        --set-env-vars SLEEP_MS=10000 \
        --set-env-vars FAIL_RATE=0.1 \
        --max-retries 5 \
        --region REGION \
        --project=PROJECT_ID

    donde PROJECT_ID es el ID de tu proyecto y REGION es tu región (por ejemplo, europe-west1). Ten en cuenta que puedes cambiar los distintos parámetros por los valores que quieras usar para tus pruebas. SLEEP_MS simula el trabajo y FAIL_RATE provoca que falle el X% de las tareas para que puedas experimentar con el paralelismo y los reintentos de tareas fallidas.

    Ejecutar una tarea en Cloud Run

    Para ejecutar el trabajo que acabas de crear, haz lo siguiente:

    gcloud run jobs execute job-quickstart --region REGION

    Sustituye REGION por la región que usaste al crear y desplegar el trabajo (por ejemplo, europe-west1).

    Siguientes pasos

    Para obtener más información sobre cómo crear un contenedor a partir del código fuente y enviarlo a un repositorio, consulta los siguientes enlaces: