Сборка конвейера ci / cd для собственного приложения ios реакции: как запустить expo build в gitlab-ci? - PullRequest
1 голос
/ 09 апреля 2020

Я помогаю настроить конвейер gitlab ci для собственного приложения, которое было разработано с expo . Вот мой gitlab-ci.yml:

image: node/apline
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - ~/.npm

stages:
  - deploy
  - tag
before_script:
  - echo $CI_BUILD_REF
  - echo $CI_PROJECT_DIR
  - apk add --no-cache bash build-base gcc git python3 curl
  - PATCH=`git log --pretty=oneline | wc -l | sed -e 's/^[[:space:]]*//'`
  - VERSION=`cat VERSION`
  - VERSION=${VERSION%?}
  - TAG="${VERSION}${PATCH}"
  - echo "Build version = ${TAG}"

expo-build:
  stage: deploy
  artifacts:
    paths:
    - ipas/
  script:
    - sed -i "s/0.0.0/${TAG}/g" app.json
    - npm ci --production --cache .npm --prefer-offline
    - npx expo login -u $EXPO_USERNAME -p $EXPO_PASSWORD
    - EXPO_DEBUG=true npx expo build:ios --non-interactive
    - mkdir -p ipas
    - curl "$(npx expo url:ipa --non-interactive)" -o ipas/my-app-$TAG.ipa
  only:
    - master

Я пытаюсь сделать так, чтобы приложение создавало новый .ipa каждый раз, когда есть пу sh для освоения. Таким образом, я могу загрузить .ipa в мой MDM для распространения приложения.

Проблема заключается в том, что если я каждый собираю свое приложение (у меня есть несколько приложений, с которыми я пытаюсь это сделать), то кажется, что шаг сборки должен быть запущен локально, прежде чем его можно будет снова запустить в ci. Я имею в виду, что команда npx expo build:ios --non-interactive нуждается в вмешательстве в выбор правильных сертификатов каждый раз, когда я делаю отдельную сборку, используя свои учетные данные Apple.

Вот выходные данные неудачной сборки (которая была успешно выполнена в конвейере). раньше без изменений кода):

- Making sure project is set up correctly...
[17:26:33] Checking if there is a build in progress...
[17:26:34] Fetching available credentials
[17:26:38] Unable to validate distribution certificate due to insufficient Apple Credentials
[17:26:38] Unable to determine validity of Push Keys due to insufficient Apple Credentials
[17:26:38] CommandError: Input is required, but Expo CLI is in non-interactive mode.
Required input:
> Push Notifications Key (Key ID: XXX, Team ID: XXX)
>     not used by any apps
>     ✅ Currently valid on Apple's servers. 
>  Would you like to use this Push Key?
   at prompt (/expo-cli@3.17.17/src/prompt.ts:22:11)
   at CreateOrReusePushKey.open (/expo-cli@3.17.17/src/credentials/views/IosPushCredentials.ts:281:31)
   at processTicksAndRejections (internal/process/task_queues.js:97:5)
   at CredentialsManager.run (/expo-cli@3.17.17/src/credentials/route.ts:42:12)
   at runCredentialsManager (/expo-cli@3.17.17/src/credentials/route.ts:13:10)
   at IOSBuilder.produceCredentials (/expo-cli@3.17.17/src/commands/build/ios/IOSBuilder.ts:168:7)
   at IOSBuilder.prepareCredentials (/expo-cli@3.17.17/src/commands/build/ios/IOSBuilder.ts:124:7)
   at IOSBuilder.run (/expo-cli@3.17.17/src/commands/build/ios/IOSBuilder.ts:46:7)
   at IOSBuilder.command (/expo-cli@3.17.17/src/commands/build/BaseBuilder.ts:29:7)
   at Command.<anonymous> (/expo-cli@3.17.17/src/exp.ts:85:7) {
 code: 'NON_INTERACTIVE',
 isCommandError: true
}
[17:26:39] Failed to prepare all credentials. 
The next time you build, we will automatically use the following configuration:
[17:26:39]
[17:26:39] Project Credential Configuration:
[17:26:39]   Experience: @team/app, bundle identifier: com.app.profile
[17:26:39]     Provisioning profile (ID: XXX)
[17:26:39]     Apple Team ID: XXX,  Apple Team Name: ---------
[17:26:39]
[17:26:39]   Distribution Certificate - Certificate ID: XXX
[17:26:39]     Apple Team ID: XXX,  Apple Team Name: A Company, LLC (In-House)
[17:26:39]     used by
     @team/app, (com.app.profile)
[17:26:39] 
[17:26:39] Error
   at CredentialsManager.doQuit [as _quit] (/expo-cli@3.17.17/src/credentials/views/Select.ts:176:9)
   at CredentialsManager.run (/expo-cli@3.17.17/src/credentials/route.ts:49:42)
   at runCredentialsManager (/expo-cli@3.17.17/src/credentials/route.ts:13:10)
   at IOSBuilder.produceCredentials (/expo-cli@3.17.17/src/commands/build/ios/IOSBuilder.ts:168:7)
   at IOSBuilder.prepareCredentials (/expo-cli@3.17.17/src/commands/build/ios/IOSBuilder.ts:124:7)
   at IOSBuilder.run (/expo-cli@3.17.17/src/commands/build/ios/IOSBuilder.ts:46:7)
   at IOSBuilder.command (/expo-cli@3.17.17/src/commands/build/BaseBuilder.ts:29:7)
   at Command.<anonymous> (/expo-cli@3.17.17/src/exp.ts:85:7)

мой вопрос: поддерживается ли этот рабочий процесс expo / gitlab-ci, и если да, то что я делаю неправильно? Мне бы хотелось, чтобы это было надежно построено, чтобы я мог разработать конвейер solid ci / cd для этого реактивного приложения. Если для этого варианта использования есть лучший способ, которым я должен следовать (сборка и развертывание приложения ios собственного реагирования), я тоже весь в ушах. Все помогает.

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

После прочтения документации и общения с любезными ребятами на выставке. Вот заключение, к которому я наконец-то пришел, чтобы получить надежные сборки ci для моего реактивного ios приложения в gitlab-ci.

Вот этап сборки из моего файла gitlab-ci.yml:

expo-build:
  stage: deploy
  artifacts:
    paths:
    - ipas/
  script:
    - sed -i "s/0.0.0/${TAG}/g" app.json
    - npm ci --prefer-offline
    - echo $P8_KEY > ${HOME}/${CI_PROJECT_NAME}.p8
    - echo $P12_DIST | base64 -d > ${HOME}/${CI_PROJECT_NAME}.p12
    - echo $PROVISIONING_PROFILE | base64 -d > ${HOME}/${CI_PROJECT_NAME}.mobileprovision
    - npx expo login -u $EXPO_USERNAME -p $EXPO_PASSWORD
    - npx expo build:ios --team-id $APPLE_TEAM_ID --push-id $PUSH_KEY_ID --dist-p12-path ${HOME}/${CI_PROJECT_NAME}.p12 --push-p8-path ${HOME}/${CI_PROJECT_NAME}.p8 --provisioning-profile-path ${HOME}/${CI_PROJECT_NAME}.mobileprovision --no-publish --non-interactive
    - mkdir -p ipas
    - curl "$(npx expo url:ipa --non-interactive)" -o ipas/${CI_PROJECT_NAME}-${TAG}.ipa
  only:
    - ci-build-test # Build api without pushing to master (protected branch)
    - master

Обратите внимание, что команда build содержит все следующие флаги:

--team-id 
--push-id
--dist-p12-path 
--push-p8-path
--provisioning-profile-path 
--no-publish 
--non-interactive

Важно отметить, что используются все переменные среды. Обратите внимание, что используются имя пользователя и пароли моей учетной записи разработчика Apple и учетной записи expo:

  • APPLE_ID
    • my appleid
    • используется для взаимодействия с порталом Apple Developer
    • необходимо войти в Apple из командной строки
  • APPLE_TEAM_ID
    • Идентификатор моей команды из портала Apple Developer
    • , явно не используемый командой ci но должен быть в env с этим ключом
  • EXPO_APPLE_PASSWORD
    • пароль приложения c пароль, созданный с помощью моего appleid
    • , необходимый для входа в apple из командной строки
    • явно не используется командой ci, но должен находиться в env с этим ключом
  • EXPO_USERNAME
    • имя пользователя моей учетной записи expo
  • EXPO_PASSWORD
    • пароль для указанной учетной записи пользователя

Следующие значения были созданы после построения приложения через стандартное приглашение для сборки expo bi, а затем получение созданных / созданных учетных данных с expo fetch:ios:certs. Затем двоичные файлы были закодированы в base64 перед загрузкой в ​​виде строк. Они также отображаются как переменные среды.

  • P8_KEY
    • имя приложения _apns_key.p8
    • , используемое непосредственно в CI
  • P12_DIST
    • имя приложения _dist.p12
    • , закодированное в base64 перед загрузкой в ​​качестве переменной env
  • PROVISIONING_PROFILE
    • имя приложения .mobileprovision
    • , закодированное в base64 перед загрузкой в ​​качестве переменной env
  • PUSH_KEY_ID
    • вывод по команде expo fetch:ios:certs.
    • первоначально я разрешил expo генерировать это при первом создании приложения.
  • EXPO_IOS_DIST_P12_PASSWORD
    • Из сгенерированного expo сертификата подписи
    • , выводимого командой expo fetch:ios:certs.

Надеюсь, это поможет всем, кто столкнулся с теми же проблемами, что и я!

1 голос
/ 14 апреля 2020

Вы можете передать свои учетные данные через флаги сборки. Например, чтобы передать сертификат распространения, вам нужно будет передать флаг --dist-p12-path (см. Документы здесь )

Исходя из вашего вывода, это выглядит как ваш pu sh ключ не связан с приложением, в котором вы публикуете. Сборка с флагом non-interactive будет работать только в том случае, если ваши учетные данные уже установлены для приложения (ie), вы уже выбрали клавишу pu sh, чтобы связать ее с вашим приложением.

...