deployphp / action

GitHub Action for Deployer
MIT License
227 stars 46 forks source link

Optional inputs don't work #3

Closed jonnitto closed 3 years ago

jonnitto commented 3 years ago

If I run the deploy command with optional input values, I get always the error Too many arguments, expected arguments "command" "stage".

If I run this command from my local machine, everything works fine.

This is my configuration

- name: Deploy website
  uses: deployphp/action@v1.0.5
  with:
    private-key: ${{ secrets.SSH_PRIVATE_KEY }}
    known-hosts: ${{ secrets.SSH_KNOWN_HOSTS }}
    dep: deploy ${{ steps.extract-branch.outputs.branch }} --composer_auth '${{ env.composer_auth }}'

And this is in my PHP file:

use Symfony\Component\Console\Input\InputOption;

option('composer_auth', null, InputOption::VALUE_OPTIONAL, 'Add a composer authentification configuration');
antonmedv commented 3 years ago

Difficult to tell what is wrong. Maybe it's some error with calling dep from nodejs: https://github.com/deployphp/action/blob/master/index.js#L48

Also, please var_dump $argv from deploy.php file, lets print and see what the actual command is.

jonnitto commented 3 years ago

I think the main problem, is that the parameter contains spaces: http-basic.domain.tld user password. I wrote the task who uses this input to use URL decode so that I'm able to write http-basic.domain.tld+user+password. With this, it works. But now I can't (or at least I don't know how) replace the spaces with an + in the secret. (I need the secret also in another place with the spaces)

jonnitto commented 3 years ago

What do you mean with

Also, please var_dump $argv from deploy.php file, lets print and see what the actual command is.

Do you have a code example?

antonmedv commented 3 years ago

var_dump($argv);

jonnitto commented 3 years ago

This is the output:

array(7) {
  [0] => string "bin/dep"
  [1] => string "deploy"
  [2] => string "staging"
  [3] => string "--composer_auth"
  [4] => string "'domain.tld"
  [5] => string "user"
  [6] => string"password'"
}

But it should be

array(7) {
  [0] => string "bin/dep"
  [1] => string "deploy"
  [2] => string "staging"
  [3] => string "--composer_auth"
  [4] => string "domain.tld user password"
}

This is what I get if I run the command dep deploy staging --composer_auth "domain.tld user password" in the CLI manually

antonmedv commented 3 years ago

Yes, looks like there can be a better solution with correct splitting in js code. Will implement it.

jonnitto commented 3 years ago

In the meantime, I was able to able to change the secret dynamically like that:

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    env:
      composer_auth: ${{ secrets.COMPOSER_AUTH }}
    steps:
      - name: Set environment variables
        run: |
          echo "composer_auth_deployer=${composer_auth//' '/'+'}" >> $GITHUB_ENV
      # Do all the checkout, building, etc...
      - name: Deploy website
        uses: deployphp/action@v1.0.5
        with:
          private-key: ${{ secrets.SSH_PRIVATE_KEY }}
          known-hosts: ${{ secrets.SSH_KNOWN_HOSTS }}
          dep: deploy ${{ env.stage }} --composer_auth ${{ env.composer_auth_deployer }}

and in the PHP:

if (input()->hasOption('composer_auth')) {
    $config = input()->getOption('composer_auth');
    if ($config) {
        cd('{{release_path}}');
        run('{{bin/composer}} config --auth ' . urldecode($config));
    }
}

But of course, it would be much nicer if I could use composer_auth directly.

antonmedv commented 3 years ago

Released v1.0.6. Please test it.

jonnitto commented 3 years ago

With 1.0.6 I'll following error:

internal/modules/cjs/loader.js:800
    throw err;
    ^

Error: Cannot find module 'argv-split'
Require stack:
- /home/runner/work/_actions/deployphp/action/v1.0.6/index.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:797:15)
    at Function.Module._load (internal/modules/cjs/loader.js:690:27)
    at Module.require (internal/modules/cjs/loader.js:852:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Object.<anonymous> (/home/runner/work/_actions/deployphp/action/v1.0.6/index.js:4:15)
    at Module._compile (internal/modules/cjs/loader.js:959:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
    at Module.load (internal/modules/cjs/loader.js:815:32)
    at Function.Module._load (internal/modules/cjs/loader.js:727:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1047:10) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '/home/runner/work/_actions/deployphp/action/v1.0.6/index.js' ]
}
antonmedv commented 3 years ago

This is strange. Will fix it.

jonnitto commented 3 years ago

If you made the commit, I can make a test against @master

antonmedv commented 3 years ago

Release a fix in v1.0.7

antonmedv commented 3 years ago

Is it fixed?

jonnitto commented 3 years ago

Yeah, it works now as expected, thank you a lot 🎉