Crea ed esegui il deployment di un job Java in Cloud Run

Scopri come creare un semplice job Cloud Run, quindi eseguire il deployment dall'origine che pacchettizza automaticamente il codice in un'immagine container, carica dell'immagine container in Artifact Registry, quindi ne esegue il deployment in Cloud Run. Puoi utilizzare altre lingue oltre a quelle mostrate.

Prima di iniziare

  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. Make sure that billing is enabled for your Google Cloud project.

  4. Install the Google Cloud CLI.
  5. To initialize the gcloud CLI, run the following command:

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

    Go to project selector

  7. Make sure that billing is enabled for your Google Cloud project.

  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init
  10. Abilita l'API Cloud Run Admin e l'API Cloud Build:

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

    Dopo aver abilitato l'API Cloud Run Admin, l'account di servizio predefinito di Compute Engine viene creato automaticamente.

  11. Affinché Cloud Build sia in grado di creare le tue origini, concedi il parametro Account di servizio Cloud Build all'account di servizio predefinito di Compute Engine eseguendo questo comando:

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

    Sostituisci PROJECT_NUMBER con il numero di progetto Google Cloud e PROJECT_ID con l'ID progetto Google Cloud. Per istruzioni dettagliate su come trovare l'ID e il numero del progetto, consulta la sezione Creazione di e gestione dei progetti.

    Concessione del ruolo di account di servizio Cloud Build all'account di servizio predefinito Compute Engine richiede un paio di minuti per propagare.

Scrittura del job di esempio

Per scrivere un job in Java:

  1. Crea una nuova directory denominata jobs e cambia directory al suo interno:

    mkdir jobs
    cd jobs
    
  2. In una sottodirectory denominata src/main/java/com/example, crea un file JobsExample.java per il codice del job effettivo. Copia le seguenti righe di esempio al suo interno:

    
    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));
      }
    }

    I job Cloud Run consentono agli utenti di specificare il numero di attività da eseguire. Questo codice di esempio mostra come utilizzare la variabile di ambiente CLOUD_RUN_TASK_INDEX incorporata. Ogni attività rappresenta una copia in esecuzione del container. Tieni presente che le attività vengono in genere eseguite in parallelo. Utilizzare più attività è utile se ogni attività può elaborare in modo indipendente un sottoinsieme dei tuoi dati.

    Ogni attività è consapevole del proprio indice, memorizzato nella variabile di ambiente CLOUD_RUN_TASK_INDEX. La variabile di ambiente CLOUD_RUN_TASK_COUNT integrata contiene il numero di attività fornite durante l'esecuzione del job tramite --tasks .

    Il codice mostrato mostra anche come riprovare le attività, utilizzando lo strumento CLOUD_RUN_TASK_ATTEMPT variabile di ambiente, che contiene il numero di numero di nuovi tentativi per questa attività, a partire da 0 per il primo tentativo e con incrementi di 1 per ogni tentativo successivo, fino a un massimo di --max-retries.

    Il codice consente anche di generare errori per testare i nuovi tentativi. e generare log di errore per vedere come si presentano.

  3. Crea un file pom.xml con i seguenti contenuti:

    <?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 file project.toml con i seguenti contenuti, da utilizzare con Versione Java supportata da 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"
    

Il codice è completo e pronto per essere pacchettizzato in un contenitore.

Crea il contenitore dei job, invialo ad Artifact Registry ed esegui il deployment in Cloud Run

Importante: questa guida introduttiva presuppone che tu disponga dei ruoli di proprietario o editor nel progetto che stai utilizzando. In caso contrario, consulta il ruolo Sviluppatore origine Cloud Run per le autorizzazioni richieste per il deployment di una risorsa Cloud Run dall'origine.

Questa guida rapida utilizza il deployment dall'origine, che crea il container, lo carica in Artifact Registry ed esegue il deployment del job in 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

dove PROJECT_ID è l'ID progetto e REGION è il tuo regione, ad esempio us-central1. Tieni presente che puoi modificare i vari parametri ai valori che vuoi utilizzare per i tuoi test. SLEEP_MS simula il lavoro e FAIL_RATE fa sì che X% delle attività non vada a buon fine, quindi possono sperimentare il parallelismo e ritentare le attività non riuscite.

Esegui un job in Cloud Run

Per eseguire il job appena creato:

gcloud run jobs execute job-quickstart --region REGION

Sostituisci REGION con la regione utilizzata al momento della creazione e del deployment del job, ad esempio us-central1.

Passaggi successivi

Per saperne di più sulla creazione di un container dall'origine del codice e su come eseguirne il push in un repository, consulta: