18

My problem is the bash script I created got this error "/bin/sh: eval: line 88: ./deploy.sh: not found" on gitlab. Below is my sample script .gitlab-ci.yml.

I suspect that gitlab ci is not supporting bash script.

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

And this also my deploy.sh.

#!/bin/bash

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

All I want is to execute deploy.sh after docker push but unfortunately got this error about /bin/bash thingy.

I really need your help guys. I will be thankful if you can solve my problem about gitlab ci bash script got error "/bin/sh: eval: line 88: ./deploy.sh: not found".

redwolfgang20
  • 368
  • 1
  • 5
  • 15

3 Answers3

24

This is probably related to the fact you are using Docker-in-Docker (docker:dind). Your deploy.sh is requesting /bin/bash as the script executor which is NOT present in that image.

You can test this locally on your computer with Docker:

docker run --rm -it docker:dind bash

It will report an error. So rewrite the first line of deploy.sh to

#!/bin/sh

After fixing that you will run into the problem that the previous answer is addressing: ssh is not installed either. You will need to fix that too!

  • In my case, the hashbang was already `#!/bin/sh`, I have to mention `- sh ./deploy.sh` to make it working. – Adiii Dec 29 '20 at 08:01
18

docker:latest is based on alpine linux which is very minimalistic and does not have a lot installed by default. For example, ssh is not available out of the box, so if you want to use ssh commands you need to install it first. In your before_script, add:

- apk update && apk add openssh
1615903
  • 32,635
  • 12
  • 70
  • 99
9

Thanks. This worked for me by adding bash

before_script:
  - apk update && apk add bash

Let me know if that still doesn't work for you.

  • Yup this worked for me too. The script I was trying to run required using bash to run it, but bash was not available, so it kept defaulting to `sh` – smac89 Mar 22 '20 at 07:12
  • 1
    I just got bitten by this too, the error message on Gitlab's side is really vague... – Elven Spellmaker Apr 07 '22 at 09:11