Как я могу убедиться, что приложение правильно найдено по пути с Ubuntu SSH - PullRequest
0 голосов
/ 03 сентября 2018

Контекст

У меня есть сценарий оболочки, который вызывается из Jenkins удаленно через SSH. Если я SSH к учетной записи пользователя вручную, а затем запустить скрипт, он работает. Однако, когда Jenkins делает это (та же учетная запись пользователя, но выполняет команду в качестве аргумента команды SSH), ему не удается найти приложение по пути.

Окружающая среда

lsb_release -a Модули LSB не доступны. Идентификатор распространителя: Ubuntu Описание: Ubuntu 16.04.5 LTS Релиз: 16.04 Кодовое название: xenial

uname-a Linux 4.4.0-1066-aws # 76-Ubuntu SMP чт 16 августа 16:21:21 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux

Содержание домашнего каталога

ls -la
total 76
drwxr-xr-x 7 app  app   4096 Sep  3 07:49 .
drwxr-xr-x 4 root root  4096 Aug 19 14:31 ..
-rw------- 1 app  app  12235 Sep  3 07:52 .bash_history
drwx------ 3 app  app   4096 Aug 28 17:06 .cache
drwx------ 2 app  app   4096 Aug 22 16:07 .docker
-rw-rw-r-- 1 app  app   6064 Sep  1 15:19 docker-compose.yml
drwx------ 4 app  app   4096 Aug 22 14:37 .local
drwxrwxr-x 2 app  app   4096 Aug 28 17:15 .nano
-rw-rw-r-- 1 app  app     97 Aug 22 16:00 .profile
-rwxrw-r-- 1 app  app    177 Aug 28 07:45 run-all-apps.sh
-rwxrw-r-- 1 app  app    476 Aug 28 07:45 run-apps.sh
-rw-rw-r-- 1 app  app     66 Aug 28 17:15 .selected_editor
drwx------ 2 app  app   4096 Sep  3 07:49 .ssh
-rw------- 1 app  app  10496 Sep  3 07:49 .viminfo

Содержимое .profile:

cat .profile 
# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

Содержимое ошибочного скрипта

cat ./run-apps.sh 
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

# Authenticate for ECR
eval $(aws ecr get-login --region eu-west-1 --no-include-email)

Как работает скрипт

В Jenkinsfile у нас есть это:

sshagent(credentials: ['server-ssh']) {
                        sh "ssh -o StrictHostKeyChecking=no -p 22 -l app ${ENVIRONMENT_HOST_NAME} './run-apps.sh'"
}

Наблюдаемый результат запуска скрипта

. / Run-apps.sh: строка 12: aws: команда не найдена

Другая информация

Если я использую SSH к серверу, используя того же пользователя, что и Jenkins, я могу запустить CLI AWS:

whoami
app

и

which aws
/home/app/.local/bin/aws

наконец:

aws --version
aws-cli/1.15.83 Python/2.7.12 Linux/4.4.0-1066-aws botocore/1.10.82

Возможно, это как-то связано с использованием eval, а среда не распространяется или что-то подобное, например, .profile не запущен, и, следовательно, приложение не находится в пути.

...