Membangun dan membuat tugas Java di Cloud Run

Pelajari cara membuat tugas Cloud Run sederhana, lalu men-deploy dari sumber, yang secara otomatis mengemas kode Anda ke dalam image container, mengunggah image container ke Artifact Registry, lalu di-deploy ke Cloud Run. Anda dapat menggunakan bahasa lain selain yang telah ditampilkan.

Sebelum memulai

  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. Aktifkan Cloud Run Admin API dan Cloud Build API:

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

    Setelah Cloud Run Admin API diaktifkan, akun layanan default Compute Engine akan otomatis dibuat.

  11. Agar Cloud Build dapat mem-build sumber Anda, berikan peran Cloud Build Service Account ke akun layanan default Compute Engine dengan menjalankan perintah berikut:

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

    Ganti PROJECT_NUMBER dengan nomor project Google Cloud Anda, dan PROJECT_ID dengan project ID Google Cloud Anda. Untuk petunjuk mendetail tentang cara menemukan project ID dan nomor project, lihat Membuat dan mengelola project.

    Pemberian peran Akun Layanan Cloud Build ke akun layanan default Compute Engine memerlukan waktu beberapa menit untuk disebarkan.

Menulis contoh tugas

Untuk menulis tugas di Java:

  1. Buat sebuah direktori baru bernama jobs dan ubah ke direktori tersebut:

    mkdir jobs
    cd jobs
    
  2. Dalam direktori subdirektori yang bernama src/main/java/com/example, buat file JobsExample.java untuk kode tugas yang sebenarnya. Salin contoh baris berikut ke dalamnya:

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

    Tugas Cloud Run mengizinkan pengguna untuk menentukan jumlah tugas yang akan dijalankan oleh tugas tersebut. Kode contoh ini menunjukkan cara menggunakan variabel lingkungan CLOUD_RUN_TASK_INDEX bawaan. Setiap tugas mewakili satu salinan container yang berjalan. Perhatikan bahwa tugas-tugas biasanya dijalankan secara paralel. Menggunakan beberapa tugas akan berguna jika setiap tugas dapat memproses subset data Anda secara independen.

    Setiap tugas mengetahui indeksnya, yang disimpan dalam variabel lingkungan CLOUD_RUN_TASK_INDEX. Variabel lingkungan CLOUD_RUN_TASK_COUNT bawaan berisi jumlah tugas yang disediakan pada waktu eksekusi tugas melalui parameter --tasks.

    Kode yang ditampilkan juga menunjukkan cara mencoba ulang tugas, menggunakan variabel lingkungan CLOUD_RUN_TASK_ATTEMPT bawaan yang berisi berapa kali tugas ini telah dicoba ulang, mulai dari 0 untuk upaya pertama dan bertambah 1 untuk setiap percobaan ulang berturut-turut yang berhasil, hingga --max-retries.

    Kode ini juga memungkinkan Anda menghasilkan kegagalan sebagai cara untuk menguji percobaan ulang dan membuat log error sehingga Anda dapat melihat tampilannya.

  3. Buat file pom.xml dengan konten berikut:

    <?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. Buat file project.toml dengan konten-konten berikut, untuk mem-build dengan versi Java yang didukung oleh 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"
    

Kode Anda telah lengkap dan siap untuk dikemas dalam container.

Bangun container tugas, kirim ke Artifact Registry, lalu deploy ke Cloud Run

Penting: Panduan memulai ini mengasumsikan bahwa Anda memiliki peran pemilik atau editor dalam project yang Anda gunakan untuk panduan memulai tersebut. Atau, lihat peran Developer Sumber Cloud Run untuk mengetahui izin yang diperlukan guna men-deploy resource Cloud Run dari sumber.

Panduan memulai ini menggunakan deploy dari sumber, yang membuat container, mengunggahnya ke Artifact Registry, dan men-deploy tugas tersebut ke 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

dengan PROJECT_ID sebagai project ID Anda dan REGION adalah region Anda , misalnya, us-central1. Perhatikan bahwa Anda dapat mengubah berbagai parameter menjadi nilai apa pun yang Anda ingin gunakan untuk tujuan pengujian Anda. SLEEP_MS menyimulasikan pekerjaan dan FAIL_RATE menyebabkan X% tugas gagal sehingga Anda dapat bereksperimen dengan paralelisme dan mencoba ulang tugas yang gagal.

Menjalankan tugas di Cloud Run

Untuk menjalankan tugas yang baru saja Anda buat:

gcloud run jobs execute job-quickstart --region REGION

Ganti REGION dengan region yang Anda gunakan saat membuat dan men-deploy tugas, misalnya us-central1.

Langkah berikutnya

Untuk informasi lebih lanjut dalam mem-build container dari kode sumber dan penerapan untuk repositori, lihat: