【问题标题】:./deploy.sh not working on gitlab ci./deploy.sh 不适用于 gitlab ci
【发布时间】:2018-04-08 20:00:10
【问题描述】:

我的问题是我创建的 bash 脚本在 gitlab 上出现此错误 "/bin/sh: eval: line 88: ./deploy.sh: not found"。下面是我的示例脚本 .gitlab-ci.yml

我怀疑 gitlab ci 不支持 bash 脚本。

image: docker:latest

variables:
  IMAGE_NAME: registry.gitlab.com/$PROJECT_OWNER/$PROJECT_NAME
  DOCKER_DRIVER: overlay

services:
  - docker:dind

stages:
  - deploy

before_script:
 - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com
 - docker pull $IMAGE_NAME:$CI_BUILD_REF_NAME || true

production-deploy:
  stage: deploy
  only:
    - master@$PROJECT_OWNER/$PROJECT_NAME
  script:
    - echo "$PRODUCTION_DOCKER_FILE" > Dockerfile
    - docker build --cache-from $IMAGE_NAME:$CI_BUILD_REF_NAME -t $IMAGE_NAME:$CI_BUILD_REF_NAME .
    - docker push $IMAGE_NAME:$CI_BUILD_REF_NAME
    - echo "$PEM_FILE" > deploy.pem
    - echo "$PRODUCTION_DEPLOY" > deploy.sh
    - chmod 600 deploy.pem
    - chmod 700 deploy.sh
    - ./deploy.sh
  environment:
    name: production
    url: https://www.example.com

这也是我的 deploy.sh

#!/bin/bash

ssh -o StrictHostKeyChecking=no -i deploy.pem ec2-user@targetIPAddress << 'ENDSSH'
 // command goes here
ENDSSH

我想要的只是在 docker push 之后执行 deploy.sh 但不幸的是得到了这个关于 /bin/bash 的错误。

我真的需要你们的帮助。如果你能解决我关于 gitlab ci bash script got error "/bin/sh: eval: line 88: ./deploy.sh: not found"的问题,我将不胜感激。

【问题讨论】:

  • “不工作”不是一个有用的问题描述。请更新您的问题以包含实际发生的情况以及您预期会发生的情况。
  • 用词过多
  • "/bin/sh: eval: line 88: ./deploy.sh: not found",我遇到了这个问题@vitr,你能帮帮我吗?
  • 你可以试试- bash ./deploy.sh
  • @1615903 我得到了 ssh: 未找到。如何解决这个问题?

标签: bash continuous-integration gitlab gitlab-ci gitlab-ci-runner


【解决方案1】:

这可能与您使用 Docker-in-Docker (docker:dind) 的事实有关。您的 deploy.sh 请求 /bin/bash 作为该映像中不存在的脚本执行程序。

您可以使用 Docker 在您的计算机上进行本地测试:

docker run --rm -it docker:dind bash

会报错。所以将deploy.sh的第一行改写为

#!/bin/sh

修复后,您将遇到上一个答案正在解决的问题:ssh 也未安装。你也需要解决这个问题!

【讨论】:

  • 在我的例子中,hashbang 已经是#!/bin/sh,我必须提到- sh ./deploy.sh 才能使其正常工作。
【解决方案2】:

docker:latest 基于 alpine linux,它非常简约,默认情况下没有安装很多。例如,ssh 没有开箱即用,所以如果你想使用 ssh 命令,你需要先安装它。在您的before_script 中,添加:

- apk update && apk add openssh

【讨论】:

    【解决方案3】:

    谢谢。通过添加 bash

    这对我有用
    before_script:
      - apk update && apk add bash
    

    如果这仍然不适合你,请告诉我。

    【讨论】:

    • 是的,这对我也有用。我试图运行的脚本需要使用 bash 来运行它,但是 bash 不可用,所以它一直默认为 sh
    猜你喜欢
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2021-05-06
    • 2021-03-28
    • 2021-07-31
    • 2022-10-12
    • 2022-12-21
    相关资源
    最近更新 更多