Создание приложения iOS React Native с помощью GitHub Actions - PullRequest
0 голосов
/ 06 августа 2020

Похоже, что тип компьютера macOS (runs-on) в GitHub Actions (CI / CD) устанавливает RCT_NO_LAUNCH_PACKAGER=1. Я проверил это поведение, создав голое репо с простым рабочим процессом GH для macOS , и убедился, что переменная ENV установлена.

RCT_NO_LAUNCH_PACKAGER=1

Эта переменная проблематична c. Это оказывает значительное влияние на процесс сборки Xcode. Фаза сборки Start packager по умолчанию в Xcode не запускает метро-упаковщик, если установлено RCT_NO_LAUNCH_PACKAGER, как здесь.

...
if [ -z "${RCT_NO_LAUNCH_PACKAGER+xxx}" ] ; then
...

Поскольку упаковщик никогда не запускается, запускается сценарий Bundle React Native code and images. обречена на провал. Сборка завершается неудачно с этой ошибкой, и пакет JS никогда не создается для архива приложения, потому что упаковщик не запущен.

** ARCHIVE FAILED **

Следующая сборка сбой команд: PhaseScriptExecution Bundle \ React \ Native \ code \ and \ images ... (1 сбой) [23:43:23]: Статус выхода: 65

Это спецификация c часть этой фазы сборки, которая завершается неудачей.

+ ../node_modules/expo-updates/scripts/create-manifest-ios.sh
Error: Failed to connect to the packager server. If you did not start this build by running 'react-native run-android', you can start the packager manually by running 'react-native start' in the project directory. (Error: connect ECONNREFUSED 127.0.0.1:8081)
    at /Users/will/dev/changes/node_modules/expo-updates/scripts/createManifest.js:40:11
    at processTicksAndRejections (internal/process/task_queues.js:93:5)

На ум приходят несколько вопросов:

  • Почему GitHub установил эту переменную? Я не могу найти по нему какой-либо значимой документации. По умолчанию он нарушает «нормальный» процесс сборки Xcode React Native.
  • Кажется, что переменная ENV намеренно установлена ​​GitHub, поэтому к какой альтернативе они подталкивают пользователей, чтобы сгенерировать React Native iOS build?
  • Отключение RCT_NO_LAUNCH_PACKAGER кажется жизнеспособным вариантом, но есть ли у этого подхода недостатки? Я бы предположил, что он был изначально установлен по уважительной причине.

Я понимаю, что команда react-native bundle существует и позволяет явно объединять JS ресурсы, но это кажется странным чтобы сделать это, когда у нас уже есть идеальная фаза сборки Bundle React Native code and images, которая предназначена для выполнения sh именно этого.

1 Ответ

0 голосов
/ 07 августа 2020

Почему GitHub установил эту переменную?

Я не уверен, честно. GitHub описывает некоторые их переменных окружения по умолчанию с существенным упущением RCT_NO_LAUNCH_PACKAGER для моей ситуации.

Кажется, что переменная ENV намеренно установлена GitHub, так к какой альтернативе они подталкивают пользователей для создания сборки React Native iOS?

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

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

Есть некоторые недостатки. Или, скорее, простое отключение этой переменной не является «исправлением», которое решает все проблемы. По крайней мере, не в моем случае.

Мое решение заключалось в том, чтобы взломать пару сценариев фазы сборки и использовать переменную env CI, которая установлена ​​на "true" в GitHub.

Start Packager

Я добавил это вверху.

export RCT_METRO_PORT="${RCT_METRO_PORT:=8081}"
echo "export RCT_METRO_PORT=${RCT_METRO_PORT}" > "${SRCROOT}/../node_modules/react-native/scripts/.packager.env"

# My changes...
if [ "${CI}" = "true" ];
then
  sh -c "bash $SRCROOT/../node_modules/react-native/scripts/launchPackager.command" &> /tmp/packager.log &
  exit 0
fi

... rest of the script.

Bundle React Native code and images

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

export NODE_BINARY=$(which node)
../node_modules/react-native/scripts/react-native-xcode.sh
../node_modules/expo-updates/scripts/create-manifest-ios.sh
if [ "${CI}" = "true" ];
then
    kill -9 `ps ax | grep -i 'launchPackager.command' | grep -v grep | awk '{print $1}'` || true
    kill -9 `ps ax | grep -i 'cli.js start' | grep -v grep | awk '{print $1}'` || true
fi

Наконец, то, чего я не ожидал, было после того, как упаковщик заработал, я обнаружил другую проблему. [CP-User] [RNFB] Core Configuration завис навсегда.

Это известная проблема , и , которые описаны в их документах . Для меня исправление заключалось в том, чтобы просто добавить пустой firebase.json файл

{
  "react-native": {
  }
}

При этом сборки продолжаются, как и ожидалось. Некоторые из них могут быть просто общими: «Получайте удовольствие от устранения неполадок в среде CI!» типов проблем, но RCT_NO_LAUNCH_PACKAGER был тонким и особенно раздражающим.

...