You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 15:39:17