17
votes

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".

3
"Not working" is not a useful problem description. Please update your question to include what actually happens and what you expected to happen instead.l0b0
excessive wordingvitr
"/bin/sh: eval: line 88: ./deploy.sh: not found", I got this issue @vitr can you help me about it?redwolfgang20
You could try running it as - bash ./deploy.sh1615903
@1615903 I got ssh: not found. How to fix this one?redwolfgang20

3 Answers

20
votes

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!

17
votes

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
8
votes

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.