Bitbucket Pipeline无法传递已安装GCloud命令,报错‘gcloud: command not found’
问题原因
Bitbucket Pipeline 的每个 step 都是独立运行的 Docker 容器,前一个 step 中安装的软件、配置的环境变量只会存在于当前容器中,不会自动传递到后续 step。你在第一个 step 里安装的 Google Cloud SDK(包括gcloud、kubectl、gsutil)只在第一个容器中有效,后续 step 启动的是全新容器,自然找不到这些命令。
解决方案
推荐以下两种最直接的解决方式:
方式一:使用预安装 Google Cloud SDK 的基础镜像
直接替换所有需要用到 GCSDK 的 step 的基础镜像为官方预装好 GCSDK(含kubectl、gsutil)的版本,省去手动安装步骤,且所有 step 环境一致。
修改后的配置示例
# 用带 Python 3.7 和 GCSDK 的镜像作为基础镜像 image: google/cloud-sdk:3.7-slim pipelines: default: - step: name: Configure Google Cloud SDK script: - export BUILD_TAG=stage-xxx:$BITBUCKET_BUILD_NUMBER - echo $GCLOUD_API_KEYFILE | base64 -d > ${HOME}/gcloud-service-key.json - gcloud auth activate-service-account --key-file=${HOME}/gcloud-service-key.json - gcloud config set project $PROJECT_ID - gcloud config list # 无需手动安装 kubectl/gsutil,镜像已自带 - step: name: Build Docker image and push to GCR services: - docker script: - export BUILD_TAG=stage-kredily:$BITBUCKET_BUILD_NUMBER - gcloud container clusters get-credentials gke-xxx-xxx-as1-service-01 --zone asia-south1-a --project prj-srv-xxx-xxx-01 - gsutil -m rm -r gs://bkt-xxx-static-files-01/static/* - gsutil -m rsync -r static/ gs://bkt-xxxx-static-files-01/static/ - docker build -t asia-south1-docker.pkg.dev/prj-srv-xxxx-beta-01/repo-xxxx-stage-as1-01/$BUILD_TAG . - gcloud auth configure-docker asia-south1-docker.pkg.dev - docker push asia-south1-docker.pkg.dev/prj-srv-xxxx-beta-01/repo-xxxx-stage-as1-01/$BUILD_TAG - step: name: Deploy to QA App Server # 复用官方 GCSDK 镜像,已自带 kubectl image: gcr.io/google.com/cloudsdktool/google-cloud-cli:alpine script: # 先完成 GCP 认证和集群凭证获取 - gcloud auth activate-service-account --key-file=<(echo $GCLOUD_API_KEYFILE | base64 -d) - gcloud config set project $PROJECT_ID - gcloud container clusters get-credentials gke-xxx-xxx-as1-service-01 --zone asia-south1-a --project prj-srv-xxx-xxx-01 # 修正原命令中 latest 后的多余短横线 - kubectl set image deployment/xx-app xx-app=asia-south1-docker.pkg.dev/prj-srv-xx-beta-01/repo-xx-stage-as1-01/stage-xx:latest --record --namespace=xx-beta
方式二:将安装与使用步骤合并
如果必须使用原基础镜像,可把安装 GCSDK 的逻辑合并到每个需要用到它的 step 中(因为每个 step 是独立容器,需要重新安装)。
修改后的配置示例(以构建镜像 step 为例)
image: python:3.7 pipelines: default: - step: name: Build Docker image and push to GCR services: - docker script: - export BUILD_TAG=stage-kredily:$BITBUCKET_BUILD_NUMBER # 在当前 step 中重新安装 GCSDK - echo $GCLOUD_API_KEYFILE | base64 -d > ${HOME}/gcloud-service-key.json - apt-get update && apt-get install -y curl - curl https://sdk.cloud.google.com | bash -s -- --disable-prompts --install-dir=/usr/local/gcloud - export PATH=$PATH:/usr/local/gcloud/google-cloud-sdk/bin - gcloud auth activate-service-account --key-file=${HOME}/gcloud-service-key.json - gcloud config set project $PROJECT_ID - gcloud components install kubectl gsutil # 执行原有的构建推送逻辑 - gcloud container clusters get-credentials gke-xxx-xxx-as1-service-01 --zone asia-south1-a --project prj-srv-xxx-xxx-01 - gsutil -m rm -r gs://bkt-xxx-static-files-01/static/* - gsutil -m rsync -r static/ gs://bkt-xxxx-static-files-01/static/ - docker build -t asia-south1-docker.pkg.dev/prj-srv-xxxx-beta-01/repo-xxxx-stage-as1-01/$BUILD_TAG . - gcloud auth configure-docker asia-south1-docker.pkg.dev - docker push asia-south1-docker.pkg.dev/prj-srv-xxxx-beta-01/repo-xxxx-stage-as1-01/$BUILD_TAG - step: name: Deploy to QA App Server image: gcr.io/google.com/cloudsdktool/google-cloud-cli:alpine script: - gcloud auth activate-service-account --key-file=<(echo $GCLOUD_API_KEYFILE | base64 -d) - gcloud config set project $PROJECT_ID - gcloud container clusters get-credentials gke-xxx-xxx-as1-service-01 --zone asia-south1-a --project prj-srv-xxx-xxx-01 - kubectl set image deployment/xx-app xx-app=asia-south1-docker.pkg.dev/prj-srv-xx-beta-01/repo-xx-stage-as1-01/stage-xx:latest --record --namespace=xx-beta
注意事项
- 方式一的效率更高,避免重复安装依赖,是官方推荐的最佳实践;
- 所有 step 中需要用到 GCP 资源的,都要确保完成认证和项目配置(如
gcloud auth activate-service-account、gcloud config set project); - 原部署 step 中的命令
latest--record存在语法错误,需修正为latest --record。
内容的提问来源于stack exchange,提问作者Jarvis Reacher
相关产品推荐
相关产品推荐

