הגדרת הסדר של שלבי ה-build

אתם יכולים להגדיר את הסדר שבו שלבי הבנייה יבוצעו. כברירת מחדל, שלבי ה-build מופעלים ברצף, אבל אפשר להגדיר אותם כך שהם יפעלו במקביל.

בדף הזה מוסבר איך מגדירים את הסדר של שלבי הבנייה.

סדר של שלבי בנייה ויחסי תלות

משתמשים בשדה waitFor בשלב בנייה כדי לציין אילו שלבים חייבים לפעול לפני הפעלת שלב הבנייה. אם לא מספקים ערכים ל-waitFor, שלב הבנייה ימתין עד שכל שלבי הבנייה הקודמים בבקשת הבנייה יושלמו בהצלחה לפני שהוא יופעל.

כדי להפעיל שלב בנייה באופן מיידי בזמן הבנייה, משתמשים ב-- בשדה waitFor.

הסדר של שלבי הבנייה בשדה steps קובע את הסדר שבו השלבים יבוצעו. השלבים יפעלו ברצף או במקביל בהתאם לתלות שהוגדרה בשדות waitFor שלהם.

שלב מסוים תלוי בכל id בwaitFor שלו, והוא לא יופעל עד שכל התלות תושלם בהצלחה.

שלבים ללא השדה האופציונלי waitFor (או עם waitFor ריק) ימתינו עד שכל השלבים הקודמים יושלמו בהצלחה לפני ההפעלה. לכן, אם אף שלב לא מכיל id בשדה waitFor שלו, כל השלבים יופעלו ברצף לפי הסדר שבו הם מוגדרים.

השלבים יכולים להיות תלויים בתחילת הבנייה אם waitFor מכיל רק -. ההצהרה ששלב מסוים תלוי רק ב-- גורמת לכך שהשלב יפעל באופן מיידי כשמתחילים את הבנייה. השלב הראשון שמוגדר תלוי באופן מרומז בהתחלה.

בקטע הקוד הבא מוצגת הגדרת build עם שני שלבים שמופעלים ברצף:

YAML

steps:
- name: foo
- name: bar

JSON

{
    "steps": [{
        "name": "foo"
    },
    {
        "name": "bar"
    }
    ]
}

בקטע הקוד הבא מוצגים שני שלבים מקבילים ששניהם תלויים בשלב start. השלב השלישי ממתין להשלמה מוצלחת של שני השלבים הראשונים לפני ההפעלה. ה-build המקביל הזה מריץ את השלבים A ו-B בתחילת ה-build. השלב השלישי ימתין באופן מרומז עד ששני השלבים הקודמים יסתיימו לפני שהוא יתחיל. אפשר לפשט את הדוגמה הזו על ידי השמטת השדות id שלא מוזכרים ב-waitFor הבא.

YAML

steps:
- name: foo
  id: A
- name: bar
  id: B
  waitFor: ['-']
- name: baz

JSON

{
    "steps": [
    {
        "name": "foo",
        "id": "A"
    },
    {
        "name": "bar",
        "id": "B",
        "waitFor": ["-"]
    },
    {
        "name": "baz"
    }
    ]
}

בקטע הקוד הבא מוצגים שלבים מקבילים שתלויים בשלב קודם. שלב A מופעל מיד כשה-build מתחיל. השלבים B ו-C מופעלים במקביל אחרי ששלב A הושלם בהצלחה. שימו לב: אפשר להשמיט את השדות id ו-waitFor בשלב B ואת השדה id בשלב C בלי לשנות את סדר הביצוע.

YAML

steps:
- name: foo
  id: A
- name: bar
  id: B
  waitFor:
  - A
- name: baz
  id: C
  waitFor:
  - A

JSON

{
    "steps": [
    {
        "name": "foo",
        "id": "A"
    },
    {
        "name": "bar",
        "id": "B",
        "waitFor": [
            "A"
        ]
    },
    {
        "name": "baz",
        "id": "C",
        "waitFor": [
            "A"
        ]
    }
    ]
}

דוגמאות

בדוגמה הבאה, השלבים gcloud storage ו-wget מופעלים בו-זמנית. אחרי שהשלבים האלה מסתיימים, מתבצעת קריאה לשלב ubuntu.

YAML

steps:
# Download the binary and the data in parallel.
- name: 'gcr.io/cloud-builders/wget'
  args: ['https://example.com/binary']
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['storage', 'cp', 'gs://$PROJECT_ID-data/rawdata.tgz', '.']
  waitFor: ['-']  # The '-' indicates that this step begins immediately.

# Run the binary on the data, once both are downloaded.
- name: 'ubuntu'
  args: ['./binary', 'rawdata.tgz']

JSON

{
  "steps": [
    {
      "name": "gcr.io/cloud-builders/wget",
      "args": [
        "https://example.com/binary"
      ]
    },
    {
      "name": "gcr.io/cloud-builders/gcloud",
      "args": [
        "storage",
        "cp",
        "gs://$PROJECT_ID-data/rawdata.tgz",
        "."
      ],
      "waitFor": [
        "-"
      ]
    },
    {
      "name": "ubuntu",
      "args": [
        "./binary",
        "rawdata.tgz"
      ]
    }
  ]
}

בדוגמה הבאה נעשה שימוש בשדה id כדי לזהות שלבים מסוימים ב-build. הערכים מ-id משמשים ב-waitFor כדי להגדיר את סדר שלבי ה-build:

  • בשלב fetch-resources נעשה שימוש ב-gcloud storage כדי להעתיק את המשאבים המקומיים מ-Cloud Storage. במקביל, go יוצר, בודק ומתקין את קוד המקור.
  • לאחר מכן, dockerשלב ה-build יוצר את התמונה אחרי שכל שאר השלבים מסתיימים.

YAML

steps:
- name: 'gcr.io/cloud-builders/go'
  args: ['generate']
- name: 'gcr.io/cloud-builders/go'
  args: ['test', './...']
- name: 'gcr.io/cloud-builders/go'
  args: ['install', 'mytarget']
  id: 'go-install'

- name: 'gcr.io/cloud-builders/gcloud'
  args: ['storage', 'cp', '-r', './somefiles', 'gs://my-resource-bucket/somefiles']
  waitFor: ['-']  # The '-' indicates that this step begins immediately.
  id: 'fetch-resources'

- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/mytarget', '.']
  waitFor: ['go-install', 'fetch-resources']

images: ['gcr.io/$PROJECT_ID/mytarget']

JSON

{
  "steps": [
    {
      "name": "gcr.io/cloud-builders/go",
      "args": [
        "generate"
      ]
    },
    {
      "name": "gcr.io/cloud-builders/go",
      "args": [
        "test",
        "./..."
      ]
    },
    {
      "name": "gcr.io/cloud-builders/go",
      "args": [
        "install",
        "mytarget"
      ],
      "id": "go-install"
    },
    {
      "name": "gcr.io/cloud-builders/gcloud",
      "args": [
        "storage",
        "cp",
        "-r",
        "./somefiles",
        "gs://my-resource-bucket/somefiles"
      ],
      "waitFor": [
        "-"
      ],
      "id": "fetch-resources"
    },
    {
      "name": "gcr.io/cloud-builders/docker",
      "args": [
        "build",
        "-t",
        "gcr.io/$PROJECT_ID/mytarget",
        "."
      ],
      "waitFor": [
        "go-install",
        "fetch-resources"
      ]
    }
  ],
  "images": [
    "gcr.io/$PROJECT_ID/mytarget"
  ]
}

המאמרים הבאים