concourseconcourse-pipeline

How do I send a command to a remote system via ssh with concourse


I have the need to start a java rest server with concourse that lives on an Ubuntu 18.04 machine. The version of concourse my company uses is 5.5.11. The server code is written in Java, so a simple java -jar <uber.jar> suffices from the command line (see below). In production, I will not have this simple luxury, hence my question.

I have an scp command working that copies the .jar from concourse to the target Ubuntu machine:

scp -i /tmp/key.p8 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ./${NEW_DIR}/${ARTIFACT_NAME}.${ARTIFACT_FILE_TYPE} ${SRV_ACCOUNT_USER}@${JAVA_VM_HOST}:/var/www

Note that my private key is passed with -i and I can confirm that is working.

I followed this other SO Q&A that seemed to be promising: Getting ssh to execute a command in the background on target machine , but after trying a few permutations of the suggested solution and other answers, I still don't have my rest service kicked off.

I've tried a few permutations of this line in my concourse script:

ssh -f -i /tmp/pvt_key1.p8 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${SRV_ACCOUNT_USER}@${JAVA_VM_HOST} "bash -c 'nohup java -jar /var/www/${ARTIFACT_NAME}.${ARTIFACT_FILE_TYPE} -c \"/opt/testcerts/clientkeystore\" -w \"password\" > /dev/null 2>&1 &'"

I've tried with and without the -f and -t switches in ssh, with and without the file stream redirection, with and without nohup and the Linux background ('&') command and various ways to escape the quotes.

At the bash prompt, this line successfully starts my server. The two switches are needed to point to the certificate and provide the password:

java -jar rest-service.jar -c "/opt/certificates/clientkeystore" -w "password"

I really think this is possible to do in Concourse, but I'm stuck at this point.


Solution

  • After a lot of trial an error, it seems I needed to do this:

    ssh -f -i /tmp/pvt_key1.p8 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${SRV_ACCOUNT_USER}@${JAVA_VM_HOST} "bash -c 'sudo java -jar /var/www/${ARTIFACT_NAME}.${ARTIFACT_FILE_TYPE} -c \"/path/to/my/certificate\" -w \"password\" > /var/www/log.txt 2>&1 &'"
    

    The key was I was missing the 'sudo' portion of the command. Using nohup as opposed to putting in a Linux bash background indicator ('&') seems to give me an error in the pipeline. This works for me, but others are welcome to post responses with better answers or methods that might be a better practice.