sup icon indicating copy to clipboard operation
sup copied to clipboard

Group commands based on networks?

Open pyrossh opened this issue 8 years ago • 7 comments

Just as we have different hosts, can't we have commands that run on different host. Like I don't want to run the build command on my production host but would like to have it only in development. In ansible we generally use roles for this I think.

networks:
  dev:
    hosts:
      - localhost
  prod:
    hosts:
      - api1.example.com
      - api2.example.com

commands:
  dev:
    build:
      desc: Build the go binary
      run: go build . -o project
  prod:
    upload:
      desc: Upload the go binary
      upload: ./project

pyrossh avatar May 05 '16 06:05 pyrossh

Sup don't have these rules, instead it let you free to leverage the sh shell or bash. I have created a basic solution. Actually I think you have two options.

First:

version: 0.3

networks:
  dev:
    hosts:
      - dev.example.com

  prod:
    hosts:
      - prod.example.com

commands:
  build:
    run: |
      if [[ $SUP_NETWORK != dev ]]; then exit 0; fi
      echo "BUILD!"

  something:
    run: echo "FOOBAR"

targets:
  deploy:
    - build
    - something

Second:

version: 0.3

networks:
  dev:
    hosts:
      - dev.example.com

  prod:
    hosts:
      - prod.example.com

commands:
  build:
    run: echo "BUILD!"

  something:
    run: echo "FOOBAR"

targets:
  run_dev:
    - build
    - something

  run_prod:
    - something

eduardonunesp avatar May 05 '16 12:05 eduardonunesp

We considered having this functionality, since this is quite common use case - but we wanted to keep SUP as simple as possible.

That's why we introduced $SUP_NETWORK env var instead so you can nest sup commands like this:

Supfile:

networks:
  production:
     hosts:
        - api1.example.com
        - api2.example.com
        - api3.example.com

commands:
  build:
    local: sup -f ./Supfile.builder $SUP_NETWORK build

Supfile.builder:

networks:
  production:
     hosts:
        - builder.example.com

commands:
  build:
    run: docker build -t image . && docker push image

sup production build will build docker image only on builder.example.com.

@pyros2097 @eduardonunesp Does this make sense? I didn't do a good job documenting this feature, let me fix that.

VojtechVitek avatar May 05 '16 14:05 VojtechVitek

I think the sup_networks and targets think is what suits me for now. I'm not very keen on maintaining many supfiles for now as it is very small project for now. Maybe that would help a lot when you have many things to do and on different hosts. Thanks! :smile:

pyrossh avatar May 06 '16 09:05 pyrossh

Ok, great. Closing for now. Feel free to reopen, if you have any further suggestions/questions.

VojtechVitek avatar May 06 '16 19:05 VojtechVitek

I am trying to run far away from Ansible and I am currently using Sup with docker-machine/docker-compose. It is almost perfect for that task but I have kind of the same problem.

For example, I would love to be able to have a "init" command that creates a new development docker-machine VM, but that command should only appear in the CLI under the "dev" network as the creation of a dev VM in production doesn't make any sense.

Using the above example, maybe something like that?

networks:
  dev:
    hosts:
      - localhost
  prod:
    hosts:
      - api1.example.com
      - api2.example.com

commands:
  build:
    desc: Build the go binary
    run: go build . -o project
    networks:
      - dev

  upload:
    desc: Upload the go binary
    upload: ./project
    networks:
      - prod
``

solher avatar Aug 03 '16 17:08 solher

@VojtechVitek @solher I believe we set a $SUP_NETWORK env var.. you could check that and exit if $SUP_NETWORK isn't "dev" .. right in your command. I believe its the best way without having to change anything in sup.

pkieltyka avatar Aug 03 '16 17:08 pkieltyka

I totally got that but it feels like a weird behavior. A user would try:

$ sup prod
Targets:

Commands:
- init   Initialize a new dev VM using docker-machine.

Usage: sup [OPTIONS] NETWORK COMMAND [...]
       sup [ --help | -v | --version ]

And would probably wonder "Why is there a dev command in production?". And a sup prod init would print "No you can't use a dev command in production".

It isn't really a technical issue and it is probably not urgent but I know it may confuse people to use a tool like that.

solher avatar Aug 03 '16 18:08 solher