בדף הזה מוסבר איך להגדיר את 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.
המאמרים הבאים
- איך מתחילים בנייה באופן ידני
- איך יוצרים אוטומטית באמצעות טריגרים
- איך מגדירים את הסדר של שלבי הבנייה
- איך משתמשים בבוני תרשימים שנוצרו על ידי הקהילה ובבוני תרשימים בהתאמה אישית