Costruisci e crea un job Java in Cloud Run

Scopri come creare un semplice job Cloud Run, quindi esegui il deployment dall'origine, che pacchettizza automaticamente il codice in un'immagine container, carica l'immagine container in Artifact Registry ed 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. Install the Google Cloud CLI.

  3. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  4. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  5. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Se utilizzi un progetto esistente per questa guida, verifica di disporre delle autorizzazioni necessarie per completare la guida. Se hai creato un nuovo progetto, disponi già delle autorizzazioni necessarie.

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

  8. Install the Google Cloud CLI.

  9. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  10. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  11. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. Se utilizzi un progetto esistente per questa guida, verifica di disporre delle autorizzazioni necessarie per completare la guida. Se hai creato un nuovo progetto, disponi già delle autorizzazioni necessarie.

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

  14. Enable the Cloud Run Admin API and Cloud Build APIs:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

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

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

  15. Consulta i prezzi di Cloud Run o stima i costi con il Calcolatore prezzi.
  16. Ruoli obbligatori

    Per ottenere le autorizzazioni necessarie per completare questa guida rapida, chiedi all'amministratore di concederti i seguenti ruoli IAM:

    Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

    Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

    Concedi al account di servizio Cloud Build l'accesso al tuo progetto

    Cloud Build utilizza automaticamente l'account di servizio predefinito di Compute Engine come account di servizio Cloud Build predefinito per creare il codice sorgente e la risorsa Cloud Run, a meno che tu non esegua l'override di questo comportamento.

    Affinché Cloud Build possa creare le tue origini, concedi all'account di servizio Cloud Build il ruolo Cloud Run Builder (roles/run.builder) nel tuo progetto:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS \
        --role=roles/run.builder

    Sostituisci PROJECT_ID con l'ID del tuo progetto Google Cloude SERVICE_ACCOUNT_EMAIL_ADDRESS con l'indirizzo email del account di servizio Cloud Build. Se utilizzi il account di servizio predefinito di Compute Engine come account di servizio Cloud Build, utilizza il seguente formato per l'indirizzo email del account di servizio:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    Sostituisci PROJECT_NUMBER con il numero del tuo progetto Google Cloud.

    Per istruzioni dettagliate su come trovare l'ID progetto e il numero di progetto, vedi Creazione e gestione dei progetti.

    La concessione del ruolo di builder Cloud Run richiede un paio di minuti per la propagazione.

    Scrittura del job di esempio

    Per scrivere un job in Java:

    1. Crea una nuova directory denominata jobs e cambia directory in questa directory:

      mkdir jobs
      cd jobs
      
    2. In una directory di 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à che il job deve eseguire. Questo codice campione mostra come utilizzare la variabile di ambiente CLOUD_RUN_TASK_INDEX integrata. Ogni attività rappresenta una copia in esecuzione del contenitore. Tieni presente che le attività vengono in genere eseguite in parallelo. L'utilizzo di più attività è utile se ogni attività può elaborare in modo indipendente un sottoinsieme dei tuoi dati.

      Ogni attività è consapevole del proprio indice, archiviato nella variabile di ambiente CLOUD_RUN_TASK_INDEX. La variabile di ambiente CLOUD_RUN_TASK_COUNT integrata contiene il numero di attività fornite al momento dell'esecuzione del job tramite il parametro --tasks.

      Il codice mostrato indica anche come riprovare le attività utilizzando la variabile di ambiente CLOUD_RUN_TASK_ATTEMPT integrata, che contiene il numero di tentativi di ripetizione di questa attività, a partire da 0 per il primo tentativo e aumentando di 1 per ogni tentativo successivo, fino a --max-retries.

      Il codice consente anche di generare errori per testare i nuovi tentativi e generare log degli errori in modo da poter vedere come appaiono.

    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 per la creazione con la versione di 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 inserito in un container.

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

    Questa guida rapida utilizza il deployment dal codice sorgente, che crea il container, lo carica in Artifact Registry ed esegue il deployment del job su 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 è la regione, ad esempio europe-west1. Tieni presente che puoi modificare i vari parametri con i valori che vuoi utilizzare per i test. SLEEP_MS simula il lavoro e FAIL_RATE causa l'errore del X% delle attività in modo da poter sperimentare il parallelismo e il nuovo tentativo di esecuzione delle attività non riuscite.

    Esegui un job in Cloud Run

    Per eseguire il job che hai appena creato:

    gcloud run jobs execute job-quickstart --region REGION

    Sostituisci REGION con la regione che hai utilizzato durante la creazione e il deployment del job, ad esempio europe-west1.

    Esegui la pulizia

    Per evitare costi aggiuntivi al tuo account Google Cloud , elimina tutte le risorse che hai eseguito il deployment con questa guida rapida.

    Eliminare il repository

    Cloud Run addebita solo il tempo di esecuzione del job. Tuttavia, potresti comunque pagare l'archiviazione dell'immagine container in Artifact Registry. Per eliminare i repository Artifact Registry, segui i passaggi descritti in Eliminare i repository nella documentazione di Artifact Registry.

    Eliminare il job

    I job Cloud Run comportano costi solo quando viene eseguita un'attività del job. Per eliminare il job Cloud Run, segui uno di questi passaggi:

    Console

    Per eliminare un job:

    1. Nella console Google Cloud , vai a Cloud Run:

      Vai a Cloud Run

    2. Individua il job che vuoi eliminare nell'elenco dei job e fai clic sulla relativa casella di controllo per selezionarlo.

    3. Fai clic su Elimina. Vengono terminate tutte le esecuzioni dei job in corso e tutte le istanze dei container in esecuzione.

    gcloud

    Per eliminare un job, esegui questo comando:

    gcloud run jobs delete JOB_NAME

    Sostituisci JOB_NAME con il nome del job.

    Eliminare il progetto di test

    L'eliminazione del progetto Google Cloud interrompe la fatturazione per tutte le risorse al suo interno. Per rilasciare tutte le Google Cloud risorse nel tuo progetto:

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    Passaggi successivi

    Per saperne di più sulla creazione di un container dal codice sorgente e sul push in un repository, consulta: