הרצת סקריפטים של Bash

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

אפשר להריץ סקריפטים של bash בשלב בנייה כדי להגדיר מספר תהליכי עבודה, כולל:

  • הפעלת כמה פקודות בשלב בנייה אחד.
  • קריאה ממערכת הקבצים.
  • הוספת לוגיקה כמו ניסיונות חוזרים או תנאים.
  • פלט ליומן, לדוגמה, הרצת echo $VARNAME.

שימוש בשדה script

ב-Cloud Build יש שדה script שבו אפשר לציין סקריפטים של מעטפת להפעלה בשלב build. השדה script מקבל ערך מחרוזת יחיד.

אפשר להוסיף shebang לפני ערך המחרוזת כדי לציין את המעטפת שבה הסקריפט יפורש. לדוגמה, מוסיפים #!/usr/bin/env bash כדי לציין את מעטפת Bash. אם לא מוסיפים את התו #! לפני מחרוזת הסקריפט, Cloud Build משתמש ב-#!/bin/sh, שהוא מעטפת sh בסיסית, ולא במעטפת Bash.

אם מציינים script בשלב בנייה, אי אפשר לציין args או entrypoint באותו שלב.

בקטע הקוד הבא אפשר לראות את השדה script:

YAML

steps:
- name: 'bash'
  script: |
    #!/usr/bin/env bash
    echo "Hello World"
- name: 'ubuntu'
  script: echo hello
- name: 'python'
  script: |
    #!/usr/bin/env python
    print('hello from python')

JSON

{
  "steps": [
  {
    "name": "bash",
    "script": "#!/usr/bin/env bash echo 'Hello World'"
  },
  {
    "name": "ubuntu",
    "script": "echo hello"
  },
  {
    "name": "python",
    "script": "#!/usr/bin/env python\nprint('hello from python')\n"
  }
  ]
}

שימוש בהחלפות בשדה script

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

מיפוי אוטומטי של החלפות

  • ברמת ה-build. כדי למפות באופן אוטומטי את כל ההחלפות למשתני סביבה שיהיו זמינים לאורך כל תהליך ה-build, מגדירים את automapSubstitutions ל-true כאפשרות ברמת ה-build. לדוגמה, בקובץ הגדרות הבנייה הבא מוצג המיפוי של ההחלפה שהוגדרה על ידי המשתמש $_USER וההחלפה שמוגדרת כברירת מחדל $PROJECT_ID למשתני סביבה:

    YAML

    steps:
    - name: 'ubuntu'
      script: |
        #!/usr/bin/env bash
        echo "Hello $_USER"
    - name: 'ubuntu'
      script: |
        #!/usr/bin/env bash
        echo "Your project ID is $PROJECT_ID"
    options:
      automapSubstitutions: true
    substitutions:
      _USER: "Google Cloud"
    

    JSON

    {
      "steps": [
        {
          "name": "ubuntu",
          "script": "#!/usr/bin/env bash echo 'Hello $_USER'"
        },
        {
          "name": "ubuntu",
          "script": "#!/usr/bin/env bash echo 'Your project ID is $PROJECT_ID'"
        }
      ],
      "options": {
        "automap_substitutions": true
      },
      "substitutions": {
        "_USER": "Google Cloud"
      }
    }
    
  • ברמת השלב. כדי למפות באופן אוטומטי את כל ההחלפות ולהפוך אותן למשתני סביבה בפעולה אחת, מגדירים את השדה automapSubstitutions לערך true בשלב הזה. בדוגמה הבאה, רק בשלב השני יוצגו ההחלפות בצורה נכונה, כי רק בו מופעל מיפוי אוטומטי של החלפות:

    YAML

    steps:
    - name: 'ubuntu'
      script: |
        #!/usr/bin/env bash
        echo "Hello $_USER"
    - name: 'ubuntu'
      script: |
        #!/usr/bin/env bash
        echo "Your project ID is $PROJECT_ID"
      automapSubstitutions: true
    substitutions:
      _USER: "Google Cloud"
    

    JSON

    {
      "steps": [
        {
          "name": "ubuntu",
          "script": "#!/usr/bin/env bash echo 'Hello $_USER'"
        },
        {
          "name": "ubuntu",
          "script": "#!/usr/bin/env bash echo 'Your project ID is $PROJECT_ID'",
          "automap_substitutions": true
        }
      ],
      },
      "substitutions": {
        "_USER": "Google Cloud"
      }
    

    בנוסף, אפשר להגדיר את ההחלפות כמשתני סביבה בכל הבנייה, ואז להתעלם מהן בשלב אחד. מגדירים את automapSubstitutions ל-true ברמת ה-build, ואז מגדירים את אותו השדה ל-false בשלב שבו רוצים להתעלם מההחלפות. בדוגמה הבאה, למרות שהחלפות מיפוי מופעלות ברמת ה-build, מזהה הפרויקט לא יודפס בשלב השני, כי automapSubstitutions מוגדר ל-false בשלב הזה:

    YAML

    steps:
    - name: 'ubuntu'
      script: |
        #!/usr/bin/env bash
        echo "Hello $_USER"
    - name: 'ubuntu'
      script: |
        #!/usr/bin/env bash
        echo "Your project ID is $PROJECT_ID"
      automapSubstitutions: false
    options:
      automapSubstitutions: true
    substitutions:
      _USER: "Google Cloud"
    

    JSON

    {
      "steps": [
        {
          "name": "ubuntu",
          "script": "#!/usr/bin/env bash echo 'Hello $_USER'"
        },
        {
          "name": "ubuntu",
          "script": "#!/usr/bin/env bash echo 'Your project ID is $PROJECT_ID'",
          "automap_substitutions": false
        }
      ],
      "options": {
        "automap_substitutions": true
      },
      },
      "substitutions": {
        "_USER": "Google Cloud"
      }
    

מיפוי ידני של החלפות

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

בדוגמה הבאה אפשר לראות איך ממפים את ההחלפה $PROJECT_ID למשתנה הסביבה BAR:

YAML

steps:
- name: 'ubuntu'
  env:
  - 'BAR=$PROJECT_ID'
  script: 'echo $BAR'

JSON

{
  "steps": [
    {
      "name": "ubuntu",
      "env": [
        "BAR=$PROJECT_ID"
      ],
      "script": "echo $BAR"
    }
  ]
}

הרצת סקריפטים של bash בדיסק

אם סקריפט ה-Bash שלכם שמור בקובץ, מאחסנים את הקובץ יחד עם מקור ה-build ומפנים לקובץ הסקריפט בקובץ התצורה של ה-build:

YAML

steps:
- name: 'bash'
  args: ['./myscript.bash']

JSON

{
  "steps": [
  {
    "name": "bash",
    "args": [
      "./myscript.bash"
     ]
  }
  ]
}

כדי להשתמש בסקריפט bash בקובץ אם bash לא מוגדר כנקודת הכניסה של ברירת המחדל של התמונה שבה אתם משתמשים, מוסיפים שדה entrypoint שמפנה אל bash:

YAML

steps:
- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args: ['tools/myScript.sh','--foo']

JSON

{
  "steps": [
  {
    "name": "gcr.io/cloud-builders/gcloud",
    "entrypoint": "bash",
    "args": [
      "tools/myScript.sh",
      "--foo"
    ]
  }
  ]
}

הרצת סקריפטים מוטבעים של Bash

כדי להריץ פקודות bash באמצעות קובץ האימג' bash, מציינים את bash כname של שלב ה-build, ואת הפקודה בשדה args:

YAML

steps:
- name: 'bash'
  args: ['echo', 'I am running a bash command']

JSON

{
  "steps": [
    {
      "name": "bash",
      "args": [
        "echo",
        "I am running a bash command"
       ]
    }
  ]
}

אם התמונה שבה אתם משתמשים מגיעה עם bash, אבל bash לא מוגדר כנקודת הכניסה שמוגדרת כברירת מחדל, צריך להוסיף שדה entrypoint שמפנה אל bash. בדוגמה שלמטה, נקודת הכניסה bash משמשת להרצת פקודות gcloud שמריצות שאילתה ב-Cloud Build לגבי סטטוס בנייה, ומציגות רשימה של בנייות עם סטטוס שנכשל.

YAML

steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: 'bash'
  args:
  - '-eEuo'
  - 'pipefail'
  - '-c'
  - |-
    gcloud builds list > builds.txt
    while read line; do
        if grep -q "FAILURE" <<< "$line"; then
            echo "$line"
        fi
    done < builds.txt

JSON

{
  "steps": [
  {
    "name": "gcr.io/google.com/cloudsdktool/cloud-sdk",
    "entrypoint": "bash",
    "args": [
      "-eEuo",
      "pipefail",
      "-c",
      "gcloud builds list > builds.txt\nwhile read line; do\n    if grep -q \"FAILURE\" <<< \"$line\"; then\n        echo \"$line\"\n    fi\ndone < builds.txt"
    ]
  }
  ]
}

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

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