Контекст
У меня есть сценарий оболочки, который вызывается из 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
не запущен, и, следовательно, приложение не находится в пути.