דלגו לתוכן

למנוע תקלות ידועות מראש

בדיקת grep לפני כל push של values

Section titled “בדיקת grep לפני כל push של values”
runs on: VM
grep -rn 'repoURL: ""' <FILE>
grep -rnE 'mountPath: *"?/run/secrets/?"?([^A-Za-z0-9_/-]|$)' <DIR>
grep -nP ' +$' <FILE>

איך מוודאים: כל שלוש הפקודות לא מדפיסות כלום. השנייה תופסת mountPath שהוא /run/secrets עצמו (חייב להיות /run/secrets/<APP_DIR>).

תחנה 1: repos, tokens, variables, runner

Section titled “תחנה 1: repos, tokens, variables, runner”
מלכודתמניעה זולהמתיתסמין אם מדלגיםקישור
group: display name במקום path (תרגול)להעתיק את ה-URL מכפתור Code; git ls-remote git@<GITLAB_HOST>:<GROUP>/<REPO>.gitביצירת repos, לפני ה-variable הראשוןclone ו-include נשבריםoverview
TRIDENT_GROUP ריק או Masked (תרגול)group variable רגיל עם ה-pathלפני ה-pipeline הראשון/trident-ci not foundvariables
Protect ON על variable של ה-token הכותב, ו-dev לא מוגן (תרגול)Mask ON, Protect OFF; להריץ job var-checkביצירת ה-variablepromote:dev מקבל 403, ה-token ריקvariables
מניחים project/group access tokens (תרגול)service account; PAT כ-fallbackלפני יצירת tokensאין כפתור ב-Freeidentities
role ו-scope מתערבבים (תרגול)לרשום לכל token: role (Members) ו-scope (יצירה) בנפרדביצירת כל token403 למרות token תקין; "נשנה scope ל-Reporter"permissions
bot לא member ב-repo אחד (תרגול)git ls-remote עם ה-credential של כל bot, על כל repoמיד אחרי ההזמנהHTTP Basic: Access denied על repo אחד; "ניתן Developer" הוא הכיוון הלא נכוןpermissions
deploy token מחפשים ב-Access tokens (תרגול)Settings → Repository → Deploy tokensביצירת token למשיכה"אין לי איפה ליצור"identities
Welcome to GitLab נחשב הרשאה (תרגול)אחרי ssh -T, גם git ls-remote על ה-repoב-VM חדשהproject could not be found or you don't have permissionssh
runner: אין group runner ב-Free; scope ו-tag (תרגול)project runner; לפתוח נעילה ולהפעיל לכל project שמריץ jobsלפני ה-pipeline הראשון בכל repopending, no runner for tags tridentrunners
sudo gitlab-runner run אחרי register (תרגול)רק register; sudo gitlab-runner listביצירת ה-runnerinstance שני בחזיתrunners
git push דוחף branch אחד, ו-tags בכלל לא (תרגול)git push -u origin poc dev ו-git push origin <TAG>; git ls-remote --heads originאחרי יצירת branches ו-tagsCI ו-Argo לא רואים branch; targetRevision: <TAG> לא נמצאbranches
משתני bootstrap הוגדרו כ-CI variables (תרגול)export באותו shell ובכל טרמינל חדש; echo "${VAR_NAME:-EMPTY}"לפני script bootstrap!URL_VAR: export …, הערך ריקvariables
gitlab-runner לא בקבוצת docker [COURSE]sudo -u gitlab-runner docker info --format '{{.ServerVersion}}'אחרי registerpermission denied while trying to connect to the docker APIrunners

תחנה 2: build ו-publish ל-GitLab Container Registry

Section titled “תחנה 2: build ו-publish ל-GitLab Container Registry”
מלכודתמניעה זולהמתיתסמין אם מדלגיםקישור
build context הוא services/<SERVICE> (תרגול)-f services/<SERVICE>/Dockerfile services/: ה-context מכיל כל COPYבכתיבת ה-build"/common/trident": not founddocker
דגלי build בתוך docker push (תרגול)docker push <IMAGE>:<CANDIDATE> בלבדבהעתקה מ-buildpush נכשלci/patterns
for על כמה פריטי - (תרגול)בלוק אחד עם - |; Pipeline editor → Validateבכתיבת jobssyntax error, כל פריט ב-shell משלוci/patterns
הנחה ש-artifacts מעבירים images (תרגול)shell executor = daemon אחד; artifacts = קבציםבחלוקה ל-build ו-publishעם docker executor ה-image חסר ב-job הבאci/patterns
"ה-CI דוחף images ל-gitops" (תרגול)<IMAGE> = $CI_REGISTRY_IMAGE/<SERVICE>; ל-gitops מגיע רק ה-tagבהגדרת IMAGE_REPOpath שגוי, image לא נמצאregistry
פירוק שגוי של שם image, api:8f3a2c1 (תרגול)server עד ה-/ הראשון, tag אחרי ה-: האחרון, שם ה-service ב-pathבכתיבת ה-refmanifest unknowndocker
DNS ב-build (תרגול)cat /etc/docker/daemon.json ו-cat /etc/resolv.conf; להחיל מראש אם יש 127.0.0.53לפני ה-build הראשוןTemporary failure in name resolutiondocker
containerd snapshotter של Docker 29 (תרגול)docker info --format '{{.Driver}}' מצופה overlay2לפני ה-push הראשוןblob unknown to registry ב-push השניdocker
החלפת store מרוקנת את ה-images (תרגול)אחרי שינוי daemon.json: להריץ את כל ה-pipeline (commit ריק), לא retryאחרי systemctl restart dockerpublish לא מוצא imagedocker
אין docker login לפני push [COURSE]--password-stdin עם CI_REGISTRY_*, לפני ה-pushבכתיבת publishdenied: access forbiddenci/patterns
latest או retag [COURSE]תמיד <CANDIDATE>תמידאי אפשר להוכיח איזו גרסה רצהregistry
מלכודתמניעה זולהמתיתסמין אם מדלגיםקישור
clone מקומי של gitops מאחור (תרגול)git pull לפני כל עריכהלפני כל עריכה"שינוי ה-CI לא אצלי"; rejected (non-fast-forward)sync
--force כדי לעקוף דחייה (תרגול)git pull, ואז push; אף פעם לא --forceכשנדחה pushנמחק ה-commit של ה-CI, ה-tag חוזר ל-"", ה-render נשברsync
commit מקומי תועה שלא נדחף (תרגול)git status -sb לפני merge; ב-reset הארגומנט הוא היעדלפני merge ל-mainfatal: Not possible to fast-forwardsync
promote.sh בלי cd ל-clone (תרגול)לקרוא את הסקריפט שורה-שורה: מי רץ ואיפהבהרכבת הסקריפטcommit ו-push בתיקייה הלא נכונהtemplates
git diff --cached --quiet ו-set -e (תרגול)if ! git diff --cached --quiet; then …; fi; exit 0 = אין שינויבכתיבת ה-pushהסקריפט מת בדיוק כשיש שינויci/patterns
קוראים run ישן, main-20260928… (תרגול)לבדוק ב-CANDIDATE את ה-branch והתאריךלפני קריאת logמתקנים את ה-pipeline הלא נכוןci/overview
promote:prod ב-pipeline ישן (תרגול)ללחוץ רק ב-pipeline ש-staging שלו אומתלפני prodprod מקבל candidate ישןci/patterns
403 מוסבר בסיבה אחת (תרגול)להרחיב: token פג או בוטל, Protect עם token ריק, URL, token ב-project שגויכשיש 403נשארים בקטגוריה אחתpermissions
[skip ci] ב-repo עם CI [COURSE]להוסיף להודעת ה-commit של ה-promoteבכתיבת ה-pushלולאת pipelinesci/patterns
CI_JOB_TOKEN דוחף ל-repo אחר [COURSE]service account tokenבבחירת ה-credential403ci/overview

תחנה 4: values ו-render של ה-chart

Section titled “תחנה 4: values ו-render של ה-chart”
מלכודתמניעה זולהמתיתסמין אם מדלגיםקישור
-f לוקח את המילה הבאה (תרגול)helm template <RELEASE> <CHART_DIR> -n <NS> -f <FILE> …: chart ראשון, -f לכל קובץבכל renderError: open … או non-absolute URLs should be in form of repo_name/path_to_charthelm/overview
values בתיקייה הלא נכונה (תרגול)ls על כל נתיב ב--f; ה-values ב-clone של gitopsבכל renderno such file or directory = נתיב, לא YAMLhelm/overview
$values ב-bash, ו-. תועה (תרגול)נתיבים אמיתיים; $values קיים רק ב-Applicationבכל render מקומי$values ריק; invalid release namehelm/overview
defaultImageTag ריק (תרגול)--set defaultImageTag=probe לבידוד; לעשות promote ל-envב-render של env שלא קודםYAML parse error … line N, השורה ב-renderhelm/overview
רווח חסר אחרי : (תרגול)render אחרי כל עריכהבכל עריכת valuesmountPath:/run/secrets/<APP_DIR> הוא scalar; השגיאה בשורה הבאהhelm/overview
מפתח מחוץ ל-generic: ב-col 0, או Secret במקום secret (תרגול)grep -c 'image: /' "$R" מצופה 0אחרי כל renderimage: /ingest-api:… או מפתח שמתעלמים ממנוhelm/values
storage.className נשכח, אף שהערת הקובץ מונה אותו (תרגול)לעבור על רשימת המפתחות מההערה, מפתח-מפתח; grep -c 'storageClassName: course-local-path' "$R" מצופה 1בכתיבה הראשונה של postgrespostgres-0 Pending, unbound immediate PersistentVolumeClaimsvalues
StorageClass default בקלאסטר כתיקון (תרגול)ה-class נקבע ב-values, ב-Gitכשה-PVC Pendingלא ב-Git, ויקשור גם PVC לא קשוריםstorage-probes
volumeClaimTemplates של StatefulSet immutable (תרגול)לתקן ב-Git לפני ה-sync הראשון: render, grep ורק אז pushלפני ה-create הראשון של postgresStatefulSet.apps "postgres" is invalid … Forbiddenstorage-probes
Secret מאונט ב-/run/secrets עצמו (תרגול)mountPath: /run/secrets/<APP_DIR>, ו-env מצביע על הקובץ; ה-grep שבראש העמודלפני pushStartError … read-only file systemsecrets
hostname ב-Ingress מופיע פעמיים (תרגול)לשנות גם hosts[].hostname וגם extraTls[].hostsבכל envcert שגוי או 404values
envConfigmaps לא לפי ה-CONTRACT (תרגול)לכל service: טבלת audience מול הרשימהבכתיבת base.yamlservice מקבל config שלא מיועד לוcompose-to-k8s
required לא נתפס ב-lint (תרגול)helm template על ה-values של כל env, לא helm lintבבדיקת CIlint ירוק, render נכשלtesting
רשימה מוחלפת ולא ממוזגת [COURSE]בדריסת list להעתיק את כל האיברים; grep -c livenessProbe "$R"בדריסת containers או extraVolumesprobes נעלמיםhelm/overview
מלכודתמניעה זולהמתיתסמין אם מדלגיםקישור
Secret רק ב-namespace אחד (תרגול, פעמיים)לולאה על כל ה-environments, ואז kubectl -n <NS> get secret <SECRET> לכל <NS>אחרי כל הרצת prepare-environment.shImagePullBackOff ב-staging, not found ב-prodsnippets
--docker-server עם https:// או נתיב (תרגול)--docker-server=registry.gitlab.com: מארח בלבדביצירת ה-Secretpull נכשלsecrets
deploy token לא נבדק (תרגול)jwt/auth מחזיר 200 לפני שיוצרים Secretאחרי יצירת ה-tokenImagePullBackOff, ו-401 בבדיקהregistry
קובץ credential: שם שגוי, 664, token = username (תרגול)לקרוא את ה-header של הסקריפט; ls -l <FILE>, wc -c <FILE>, cmp -s <FILE> <FILE>; תיקיות 700לפני הרצת scriptcredential file is not readable and non-emptytemplates
newline בסוף ה-token (תרגול)printf %s, read -rs, umask 077בכתיבת קבצי credentialסיסמה שגויה בלי הודעהsecrets
סיסמה כ-env ולא כקובץ (תרגול)POSTGRES_PASSWORD_FILE=/run/secrets/<APP_DIR>/postgres_passwordבכתיבת valuesדליפה ל-describe וללוגיםsecrets
create נכשל בהרצה שנייה (תרגול)create … --dry-run=client -o yaml, ואז apply --server-sideבכתיבת scriptAlreadyExistssecrets
url ב-repo Secret שונה מ-repoURL (תרגול)kubectl -n argocd get secret <SECRET> -o jsonpath='{.data.url}', מפוענח base64, זהה בייט-לבייטאחרי יצירת repo Secretrepository not foundoperate
register-repository.sh --verify בודק צורה בלבד (תרגול)git ls-remote עם אותו credentialאחרי registerArgo מקבל Access deniedoperate
scripts בלי +x, או CRLF (תרגול / [COURSE])bash <FILE>; sed -i 's/\r$//' <FILE>לפני ההרצה הראשונהPermission denied או \r: command not foundenv-cards
Secrets אחרי ה-sync, וסקריפט bootstrap/ כאילו Argo קורא אותו (תרגול)להכין namespace ו-Secrets לפני rootלפני ה-bootstrap של rootFailed אחרי 5 ניסיונותoperate
מלכודתמניעה זולהמתיתסמין אם מדלגיםקישור
repoURL: "" נשאר (תרגול)grep -rn 'repoURL: ""' <FILE>לפני ה-bootstrapהסקריפט מסרב, או repository not foundapplications
source שלישי מצביע על templates במקום gitops, בגלל העתקת שורה קודמת (תרגול)לקרוא את כל הבלוק: path לא מתחיל ב-charts/, וה-revision הוא mainבכתיבת Applicationobservability ריקapplications
tag על gitops (תרגול)templates על <TAG>; values, root ו-kustomize על mainבכתיבת targetRevisionשום env לא מתעדכן אחרי promoteapplications
syncPolicy: {} נשאר (תרגול)automated: {prune: true, selfHeal: true}בכתיבת Applicationנשאר OutOfSync, בלי self-healapplications
אחרי push kubectl get applications ריק (תרגול)kubectl apply -f <FILE> של root, פעם אחתאחרי ההכנהNo resources foundargocd/overview
שינוי מקומי שלא נדחף (תרגול)git log origin/main..HEAD ריקלפני שמסיקים מסקנה על ArgoArgo לא רואה את ה-clonesync
Unknown + Healthy נראה תקין (תרגול)לקרוא SYNC קודם, ואז .status.conditionsבכל בדיקת סטטוסstaging ו-prod "תקינים" בלי משאב אחדoperate
ComparisonError ב-env שלא קודם (תרגול)לעשות promote; לא לערוך את ה-chartלפני render של envYAML parse error … line 47operate
Argo ויתר אחרי 5 ניסיונות (תרגול)לתקן את ה-cluster, ואז sync ידני; finishedAt מול date -uאחרי כל FailedoperationState.phase: Failed; refresh=hard לא מתניע; push לא עוזרoperate
kubectl edit או scale על משאב של Argo (תרגול)לתקן ב-Git: edit, commit, pushלפני כל תיקוןselfHeal מחזיר את השינויoperate
ה-path של root מכיל את root עצמו [COURSE]root מצביע על argocd/apps, לא על קובץ ה-rootבכתיבת rootנעילה עצמית במחיקהapplications
מלכודתמניעה זולהמתיתסמין אם מדלגיםקישור
Synced + Healthy נחשב "עובד" (תרגול)/info פעמיים; accepted עולהבכל envenv שלא עובד נראה ירוקnetworking
detections=0 נקרא כתקלה (תרגול)להפעיל quick-transit בסימולטור ולבדוק count ב-DBבהוכחת מסלול ה-DBחיפוש באג שלא קייםnetworking
אין לוגים, ומחפשים ב-init container (תרגול)kubectl -n <NS> describe pod <POD> ו-Events; -c <CONTAINER>, --previousכש-logs ריקלא רואים StartErrorkubernetes/overview
אותה התנגשות mount גם ב-signal-processor, ומניחים "downstream של ה-DB" (תרגול)Events של כל Pod שנופללפני שמסיקים שהסיבה משותפתמתקנים רק חציsymptoms
תיקון template ב-StatefulSet, ומחכים שה-Pod יוחלף (תרגול)kubectl -n <NS> delete pod <POD> (רק StatefulSet; Deployment מחליף לבד)אחרי push של תיקוןה-Pod השבור נשאר, כי ה-rolling update מחכה ל-Readystorage-probes
מחיקה בלי לשאול מי מחזיק את ה-data (תרגול)kubectl -n <NS> get pvc; ה-controller כבר מטפל?לפני כל deleteאובדן data או מחיקה מיותרתstorage-probes
promote:prod לפני שאומת staging (תרגול)/info של staging נכון, ורק אז הכפתורלפני prodprod עולה עם גרסה לא מאומתתci/patterns
תיקון ב-Git לפני ה-create הראשון של prod (תרגול)להכניס את className וה-mount ל-base.yaml לפני שמקדמים ל-prodלפני promote:prodאחרת צריך למחוק StatefulSet ו-PVC גם ב-prodstorage-probes
עובד ב-dev ולא ב-staging (תרגול)לחפש את מה שמבדיל: namespace, קובץ values, tagבכל כשל חלקיניחושים במקום differentialdebugging/overview
/ready מחזיר 503 [COURSE]kubectl -n <NS> logs deploy/<SERVICE> --tail=30: איזו תלות חסרהכש-Pod Running ולא Readyחיפוש בעיה ב-probe במקום בתלותstorage-probes
מלכודתמניעה זולהמתיתסמין אם מדלגיםקישור
ב-prepare-observability.sh: בלוק postgres מועתק, $ENV לא מוגדר ב-set -u, נתיב TLS שגוי (תרגול)bash -n <FILE>; לקרוא כל שורה מול ה-header; להריץ פעמייםלפני הרצהunbound variable, Secret לא נוצרtemplates
trident-grafana-admin בלי שני המפתחות (תרגול)--from-file לכל מפתח; kubectl -n <NS> get secret <SECRET> -o jsonpath='{.data}', מפוענח ל-keysאחרי ההרצהGrafana לא עולהobservability
ה-App אדום כי ה-namespace וה-Secrets הוכנו אחרי הניסיון (תרגול)להכין, ואז sync ידני; push של bootstrap/ לא עוזראחרי ההכנהFailed אחרי 5 ניסיונותobservability
source של ה-dashboards על templates (תרגול)path לא מתחיל ב-charts/ ו-revision הוא mainבכתיבת ה-Applicationdashboard ריקapplications
שם Service קצר בין namespaces (תרגול)FQDN: <SERVICE>.<NS>.svc.cluster.localבהגדרת target מ-namespace אחרשם לא נפתרnetworking
relabel_configs מוחק את namespace [COURSE]count by (namespace) (up)אחרי עליית Prometheusdashboard ריק או מערבב env-יםobservability
מלכודתמניעה זולהמתיתסמין אם מדלגיםקישור
exit codes הפוכים (תרגול)0 = הצלחה או אין שינוי; echo "exit=$?"בכתיבת כל בדיקהתנאי הפוך, סקריפט שמתci/patterns
cleanup.sh נכשל בהרצה שנייה [COURSE]--ignore-not-found ובדיקת קיום; "כבר נעדר" = הצלחהבכתיבת cleanupהרצף האידמפוטנטי נשברcleanup
מוחקים namespace לפני root, או את argocd [COURSE]root קודם; רק namespaces של הפרויקטבניקויArgo מייצר מחדש; נמחקים PVC ו-datacleanup
דלתא בהעתקה, חצי זוג חוקים, placeholder שנשאר, תוצר לא הוגש, מונים לא נבדקו, עצירה ב-PASS [COURSE]grep -rnE 'TODO|repoURL: ""' <FILE>; רשימת deliverables מול הקבצים; /info אחרי PASSלפני הגשהנכשלים בתהליך, לא בידעexam-method
docker system prune או שינוי שם project של compose [COURSE]לא להריץ על ה-VM של הקורסבניקוינמחקים images ו-cache של שאר המערכתdocker
token או סיסמה ב-Git [COURSE]grep לפני הגשה: last-20-minutesלפני הגשהcredential ב-historylast-20-minutes
מלכודתמניעה זולהמתיתסמין אם מדלגיםקישור
רווח אחרי \ בהמשך שורה (תרגול, 3 פעמים)grep -nP ' +$' <FILE> ו-bash -n <FILE>לפני כל commit וכל הרצההפקודה נשברת באמצעexam-method
לא יודעים איפה הפקודה רצה (תרגול)kubectl, helm, docker על ה-VM; CI variables רק ב-jobבכל פקודה חדשהמשתנה ריק, או kubeconfig חסרarchitecture/overview
מנחשים סיבה שהטקסט לא תומך בה (תרגול)grep -iE 'denied|403|unauthorized' על ההודעהבכל שגיאהתיקונים לא קשוריםwhen-stuck
תסמין בלי סיווג: קוד או סביבה (תרגול)AssertionError = קוד; Cannot connect to the Docker daemon = סביבהבכל שגיאהמתקנים קוד שלא שבורdebugging/overview