Travis CI: Как мне избежать пароля для работы `travis encrypt`? - PullRequest
0 голосов
/ 05 февраля 2019

В документах по шифрованию travis упоминается, что я должен экранировать свой пароль перед его шифрованием:

Примечание по экранированию определенных символов

Когда вы используете travis encrypt для шифрования конфиденциальных данных, важно отметить, что они будут обрабатываться как оператор bash.Это означает, что секрет, который вы шифруете, не должен вызывать ошибки, когда bash его анализирует.Наличие неполных данных приведет к тому, что bash сохранит оператор ошибки в журнале, который содержит части ваших конфиденциальных данных.

Таким образом, вам нужно экранировать специальные символы, такие как фигурные скобки, скобки, обратные слеши и символы канала.Например, если вы хотите присвоить строку 6&a(5!1Ab\ для FOO, вам необходимо выполнить:

travis encrypt "FOO=6\\&a\\(5\\!1Ab\\\\"

Кажется, что ответ для bash вращается вокруг printf "%q", но все еще слишком сложно понять, как соединить printf с travis cli.

Что такое однострочник bash для travis encryptделать то, что он должен делать?

Я имею в виду, я хочу вставить имя моей переменной и ее значение и быть уверенным, что она будет зашифрована правильно, не беспокоясь о возможности выхода из bash.Мы можем остаться с примером выше, предполагая, что я хочу присвоить строку 6&a(5!1Ab\ переменной FOO.

И пока мы это делаем, какой будет соответствующая строка для travis env set?Это поможет тем, кто борется с ошибкой data too large.

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

На основании ответа Армали :

read -r && travis encrypt "$(printf %q "$REPLY")"

, затем вставьте вашу переменную и ее значение:

FOO=6&a(5!1Ab\
0 голосов
/ 27 февраля 2019

гораздо проще просто base64 строки и декодировать ее в вашей сборке.Сохраняет все недоразумения благодаря экранированию в travis.

Travis и любая другая служба CI / CD позволяют скрытно хранить секретные переменные среды, которые будут использоваться для каждой сборки.В настройке сборки вашего проекта добавьте параметр переменной среды.Чтобы отобразить пароль в cli для использования в base64, вам все равно нужно экранировать строку, так как она должна быть оценена bash.создайте временный файл с вашим паролем.Затем:

cat /tmp/secret | base64 -w 0

скопируйте строку и вставьте ее в поле значения для настройки travis ci env var

в .travis.yaml файле, чтобы просто получить секрет:

echo $SECRET | base64 -d

Хотя могут быть крайние случаи, но это должно решить большинство случаев использования.

0 голосов
/ 06 февраля 2019

Что такое однострочный bash для того, чтобы travis encrypt делал то, что должен делать?

Я имею в виду, я хочу вставить имя моей переменной и ее значение иубедитесь, что он будет зашифрован должным образом, не беспокоясь о том, что bash может быть экранирован.

Как правило, это невозможно, потому что, если значение должно быть вставлено в командную строку, необходима какая-то цитата.следовательно, по крайней мере один символ кавычки (если ему разрешено встречаться в значении) должен обрабатываться специально и не может быть просто вставлен в;это причина, по которой включение значения в ' ' не работает, если в значении присутствует ' (и, конечно, ' должно быть разрешено в пароле).Таким образом, требование возможности вставлять значение может быть выполнено только в том случае, если требование однострочный отброшено, и значение предоставляется в качестве ввода.
Затем,поскольку команде travis encrypt требуется дополнительное цитирование аргумента (возможно, потому что, как считает Чепнер, вызывается eval), мы можем предоставить это цитирование с помощью printf %q, например,

<code>read -r
<b>6&a(5!1Ab\</b>
travis encrypt "$(printf %q "FOO=$REPLY")"
(жирная строка должна бытьвставлено).

Как насчет помещения VAR=VALUE в оператор read, чтобы собрать все воедино?read -r, вставьте FOO=6&a(5!1Ab\ и, наконец, travis encrypt "$(printf %q "$REPLY")".

Конечно, это также сработает.

Кроме того, действительно нет способа передать результатот read -r до travis encrypt?

Если вы имеете в виду буквально для канала , то нет, нет способа передать что-либо команде, которая ожидает только аргументы.Но если вам просто интересно, можем ли мы объединить команды, тогда да, мы также можем написать, например,

<code>read -r; travis encrypt "$(printf %q "$REPLY")"
<b>FOO=6&a(5!1Ab\</b>
...