Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

gitlab-runner locally - No such command sh

I have gitlab-runner installed locally.

km@Karls-MBP ~ $ gitlab-runner --version
Version:      10.4.0
Git revision: 857480b6
Git branch:   10-4-stable
GO version:   go1.8.5
Built:        Mon, 22 Jan 2018 09:47:12 +0000
OS/Arch:      darwin/amd64

Docker:

km@Karls-MBP ~ $ docker --version
Docker version 17.12.0-ce, build c97c6d6

.gitlab-ci.yml:

image: docker/compose:1.19.0

before_script:
  - echo wtf

test:
  script:
    - echo test

Results:

km@Karls-MBP ~ $ sudo gitlab-runner exec docker --docker-privileged test
WARNING: Since GitLab Runner 10.0 this command is marked as DEPRECATED and will be removed in one of upcoming releases 
WARNING: You most probably have uncommitted changes. 
WARNING: These changes will not be tested.         
Running with gitlab-runner 10.4.0 (857480b6)
  on  ()
Using Docker executor with image docker/compose:1.19.0 ...
Using docker image sha256:be4b46f2adbc8534c7f6738279ebedd6106969695f5e596079e89e815d375d9c for predefined container...
Pulling docker image docker/compose:1.19.0 ...
Using docker image docker/compose:1.19.0 ID=sha256:e06b58ce9de2ea3f11634e022ec814984601ea3a5180440c2c28d9217b713b30 for build container...
Running on runner--project-0-concurrent-0 via x.x.x...
Cloning repository...
Cloning into '/builds/project-0'...
done.
Checking out b5a262c9 as km/ref...
Skipping Git submodules setup
No such command: sh

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

Don't really know what the issue is.

like image 329
basickarl Avatar asked Feb 23 '18 10:02

basickarl


People also ask

What Shell does GitLab runner use?

The Shell executor is a simple executor that you use to execute builds locally on the machine where GitLab Runner is installed.

How do I see GitLab runner logs?

To view them, open the Event Viewer (from the Run menu, type eventvwr. msc or search for “Event Viewer”). Then go to Windows Logs > Application. The Source for Runner logs is gitlab-runner .


2 Answers

It seems that the docker/compose image is configured with docker-compose as an entrypoint.

You can override the default entrypoint of the docker/compose image in your .gitlab-ci.yml file :

image: 
  name: docker/compose:1.19.0
  entrypoint: [""]

before_script:
  - echo wtf

test:
  script:
    - echo test
like image 191
Noki Avatar answered Oct 13 '22 20:10

Noki


The docker/compose image has the command docker-compose as its entrypoint (until version 1.24.x), which enables a usage similar to this (assuming a compatible volume mount):

docker run --rm -t docker/compose -f some-dir/compose-file.yml up

Unfortunately that same feature makes it incompatible with usage within GitLab CI’s Docker Runner. Theoretically you could have a construct like this:

job-name:
    image: docker/compose:1.24.1
    script:
        - up
        - --build
        - --force-recreate

But the GitLab Docker Runner assumes the entrypoint is /bin/bash - or at least functions likewise (many Docker images thoughtfully use a shell script with "$@" as its final line for the entrypoint) - and from the array elements that you specify for the script, it creates its own temporary shell script on the fly. It starts with statements like set -e and set -o pipeline and will be used in a statement like sh temporary-script.sh as the container command. That’s what causes the unexpected error message you got.

This behaviour was recently documented more clearly:

The Docker executor doesn’t overwrite the ENTRYPOINT of a Docker image.

That means that if your image defines the ENTRYPOINT and doesn’t allow to run scripts with CMD, the image will not work with the Docker executor.

Overriding the entrypoint with [""] will allow usage of docker/docker-compose (before version 1.25.x) with the Docker Runner, but the script that GitLab will create on the fly is not going to run as process 1 and because of that the container will not stop at the end of the script. Example:

job-name:
    image:
        name: docker/docker-compose
        entrypoint: [""]
    script:
        - docker-compose
        - up
        - --build
        - --force-recreate

At the time I write this the latest version of docker/docker-compose is 1.25.0-rc2. Your mileage may vary, but it suffices for my purposes and entirely resolves both problems.

like image 31
ᴠɪɴᴄᴇɴᴛ Avatar answered Oct 13 '22 19:10

ᴠɪɴᴄᴇɴᴛ