GitLab CI流水线build正常但deploy-job报command not found
问题根因
build-job可正常运行,是因为该Job显式指定了预装AWS CLI的amazon/aws-cli作为执行镜像,所有依赖命令都在镜像内存在。deploy-job未配置image字段,GitLab CI会默认使用Runner注册时配置的基础镜像(通常是极简版Alpine或Ubuntu镜像),镜像内既没有aws命令,也没有脚本中用到的jq工具,因此每条命令执行都会返回command not found。- 原配置还存在额外隐患:脚本中用到的
$REPOSITORY_URI、$IMAGE_TAG两个变量未在全局或Job内定义,命令问题修复后也会因为变量为空导致执行逻辑异常。
修复方案
给deploy-job指定包含所需依赖的执行镜像,补全缺失的变量定义,优化冗余的shell写法,修复后的完整.gitlab-ci.yml配置如下:
variables: DOCKER_REGISTRY: 775362094965.dkr.ecr.us-west-2.amazonaws.com AWS_DEFAULT_REGION: us-west-2 APP_NAME: flask-app DOCKER_HOST: tcp://docker:2375 # 补全deploy阶段依赖的全局变量,可根据实际构建传参规则调整 REPOSITORY_URI: $DOCKER_REGISTRY/$APP_NAME IMAGE_TAG: latest stages: - build - deploy build-job: stage: build image: name: amazon/aws-cli entrypoint: [""] services: - docker:dind before_script: - amazon-linux-extras install docker - aws --version - docker --version script: - docker build -t $DOCKER_REGISTRY/$APP_NAME:latest . - aws ecr get-login-password | docker login --username AWS --password-stdin $DOCKER_REGISTRY - docker push $DOCKER_REGISTRY/$APP_NAME:latest deploy-job: stage: deploy # 指定带AWS CLI的基础镜像,和build阶段环境保持一致 image: name: amazon/aws-cli entrypoint: [""] before_script: # 安装deploy阶段需要的jq工具 - amazon-linux-extras install epel -y - yum install jq -y - aws --version - jq --version script: - aws ecs describe-task-definition --task-definition $CI_AWS_ECS_TASK_DEFINITION --region us-west-2 > input.json - cat input.json | jq '.taskDefinition.containerDefinitions[].image="'$REPOSITORY_URI':'$IMAGE_TAG'"' > input.json - cat input.json | jq '.taskDefinition' > input.json - cat input.json | jq 'del(.taskDefinitionArn, .revision, .status, .requiresAttributes, .compatibilities, .registeredAt, .registeredBy)' > input.json - aws ecs register-task-definition --cli-input-json file://input.json --region us-west-2 - revision=$(aws ecs describe-task-definition --task-definition $CI_AWS_ECS_TASK_DEFINITION --region us-west-2 | egrep "revision" | tr "/" " " | awk '{print $2}' | sed 's/"$//' | cut -d "," -f 1) - aws ecs update-service --cluster $CI_AWS_ECS_CLUSTER --service $CI_AWS_ECS_SERVICE --task-definition $CI_AWS_ECS_TASK_DEFINITION:$revision --region us-west-2
优化说明
- 移除了原脚本中无意义的
echo $(...)嵌套,直接将命令输出重定向到文件,减少不必要的shell解析开销,避免特殊字符转义问题。 - 合并了多次jq调用的字段删除逻辑,减少文件重复读写次数。
- 在before_script阶段提前校验aws、jq命令版本,可第一时间暴露依赖缺失问题。
内容的提问来源于stack exchange,提问作者MP32
相关产品推荐
相关产品推荐

