Как настроить CI / CD для nativescript с помощью Visual studio online / Azure dev ops tools

#nativescript #nativescript-angular

#nativescript #nativescript-angular

Вопрос:

Я пытаюсь настроить конвейер CI / CD для приложения Nativescript, добавил команды для установки node и npm install, но у nativescript есть зависимости, которые ему нужны. Как мне динамически работать с Azure dev ops без необходимости создания виртуальной машины, на которой установлен nativescript и все его зависимости, и настройки

Итак, я использовал виртуальную машину и установил на нее nativescript, а также использовал агент and для подключения к компьютеру и сборки решения, я сделал то же самое с помощью jenkins, но jenkins был запущен на виртуальной машине, нет, я хочу перенести весь конвейер на azure dev ops

команда, используемая на этапе сборки: tns build android

Ответ №1:

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

Следует отметить пару важных моментов. Сначала имя вашего репозитория изменяется на ‘s’, что приводит к путанице с наименованием вашего файла прав доступа … или, по крайней мере, это произошло для меня. Я исправляю это с помощью файла bash, который я добавляю в свой репозиторий, который изменяет имя пути в build.xcconfig для переменной CODE_SIGN_ENTITLEMENTS. Я добавил команду npm run entite в свой файл package.json, чтобы запустить это перед сборкой. Во-вторых, вы захотите сохранить все файлы и безопасные пароли в разделе библиотеки в разделе конвейеры в вашем проекте Azure Devops. В-третьих, использование классического редактора — ваш лучший друг для понимания yaml, поскольку в большинстве заданий есть возможность просмотра YAML. Вы также можете использовать классический редактор в качестве альтернативы файлу YAML

В приведенных ниже файлах YAML и bash показан пример того, как можно создать ipa-и apk-файлы, которые хранятся как артефакт. Затем вы можете использовать этот запуск конвейера выпуска для запуска play и app Store.

 # YAML File
name: Release Build
trigger:
- release/* # will start build for pull request into release branch ie. realease/version_1_0_0, release/version_2_0_0

pool:
  vmImage: 'macOS-10.13'

variables:
  scheme: 's'   # default name/scheme created on this machine for ipa
  sdk: 'iphoneos'
  configuration: 'Release'


steps:
- task: NodeTool@0
  inputs:
    versionSpec: '10.14'
  displayName: 'Install Node.js'

# Download Secure File for Android
# Note: if multiple secure files are downloaded... variable name will change and break pipeline
- task: DownloadSecureFile@1
  displayName: 'download android keystore file'
  inputs:
    secureFile: myKeystore.keystore

#Install Apple Certificate(Distrobution)
- task: InstallAppleCertificate@2
  displayName: 'Install an Apple certificate Distribution (yourcertificate.p12)'
  inputs:
    certSecureFile: '00000000-0000-0000-0000-000000000000' # got id from viewing file in clasic editor for pipeline
    certPwd: '$(myCertificatePasswordP12)' # password stored in Library

# Install Apple Provisioning Profile(Distrobution)
- task: InstallAppleProvisioningProfile@1
  displayName: 'Apple Provisioning Profile(myProvisioningProfile.mobileprovision)'
  inputs:
    provisioningProfileLocation: 'secureFiles' # Options: secureFiles, sourceRepository
    provProfileSecureFile: '00000000-0000-0000-0000-000000000000' # Required when provisioningProfileLocation == SecureFiles

# General Set Up
- script: |
    npm install -g nativescript@latest
    npm install
  displayName: 'Install native script and node Modules'

# variable explination
# $DOWNLOADSECUREFILE_SECUREFILEPATH is keystore file downloaded earlier
# $KEYSTORE_PASSWORD refers to the environment variable in this script which references library variable
# $(MyPlayStoreAlias) refers to library variable for your apps alias
# $BUILD_SOURCESDIRECTORY location where apk is built to

# Android
- script: |
    tns build android --env.production --release --key-store-path $DOWNLOADSECUREFILE_SECUREFILEPATH --key-store-password $KEYSTORE_PASSWORD --key-store-alias $(MyPlayStoreAlias) --key-store-alias-password $KEYSTORE_PASSWORD --bundle --copy-to $BUILD_SOURCESDIRECTORY   #creates apk
  displayName: 'Build Android Release apk'
  env:
    KEYSTORE_PASSWORD: $(MyPlayStoreKeystore)

# create apk artifact
- task: PublishBuildArtifacts@1
  inputs:
    pathtoPublish: '$(Build.SourcesDirectory)/app-release.apk' 
    artifactName: 'apkDrop'
  displayName: 'Publishing apkDrop artifact'

# have to use xcode 10.1 to meet min standards for uploading ipa... default version for this machine was lower than 10.1
#changing xcode version
- script: |
    xcodebuild -version
    /bin/bash -c "echo '##vso[task.setvariable variable=MD_APPLE_SDK_ROOT;]'/Applications/Xcode_10.1.app;sudo xcode-select --switch /Applications/Xcode_10.1.app/Contents/Developer"
    xcodebuild -version
  displayName: 'changing xcode to 10.1'

# Optional... was running into build issues with latest version
#downgrading cocoapods version
- script: |
    sudo gem uninstall cocoapods
    sudo gem install cocoapods -v 1.5.3
  displayName: 'Using cocoapods version 1.5.3'

#iOS
- script: |
    xcodebuild -version # makeing sure the correct xcode version is being used
    pip install --ignore-installed six  # fixes pip 6 error
    npm run entitle #custom bash script used to change entitlement file
    tns run ios --provision     #see what provisioning profile and certificate are installed... helpful for debugging
    tns build ios --env.production --release --bundle    #creates xcworkspace
  displayName: 'Build ios Release xcworkspace'

#build and sign ipa
- task: Xcode@5
  displayName: 'Xcode sign and build'
  inputs:
    sdk: '$(sdk)'   # custom var
    scheme: '$(scheme)' # must be provided if setting manual path to xcworkspace
    configuration: '$(configuration)'   # custom var
    xcodeVersion: 'specifyPath'
    xcodeDeveloperDir: '/Applications/Xcode_10.1.app' #using xcode 10.1
    xcWorkspacePath: 'platforms/ios/s.xcworkspace'
    exportPath: '$(agent.buildDirectory)/output/$(sdk)/$(configuration)'    #location where ipa file will be stored
    packageApp: true    #create ipa
    signingOption: manual
    signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)' # distribution certificate
    provisioningProfileUuid: '$(APPLE_PROV_PROFILE_UUID)' # distribution profile

#creating ipa artifact
- task: PublishBuildArtifacts@1
  displayName: 'Publishing ipaDrop artifact'
  inputs:
    pathtoPublish: '$(agent.buildDirectory)/output/$(sdk)/$(configuration)/s.ipa'
    artifactName: 'ipaDrop'
  

Файл Bash

 #!/usr/bin/env bash
# filename: pipeline-entitlements.sh
echo "Editing build.xcconfig"
TARGET_KEY="CODE_SIGN_ENTITLEMENTS"
REPLACEMENT_VALUE="s/Resources/YOURENTITLEMENTFILENAME.entitlements"
CONFIG_FILE="./app/App_Resources/iOS/build.xcconfig"
echo "Editing $TARGET_KEY and replaceing value with $REPLACEMENT_VALUE"
sed -i.bak "s/($TARGET_KEY *= *).*/1$REPLACEMENT_VALUE/" $CONFIG_FILE
echo "Finished editing build.xcconfig"
  

Комментарии:

1. Моя проблема в том, что sudo не работает в конвейере, если вы разрешаете azure динамически создавать виртуальную машину на этой стороне, поэтому некоторые компоненты не могут быть установлены, и я хочу, чтобы весь конвейер сборки находился в azure dev ops

2. Интересно… Я использую sudo (как показано в примере YAML выше) на их динамически создаваемых виртуальных машинах и не испытывал никаких проблем… выдает ли это какие-либо ошибки? Какие компоненты вы не можете установить? Под размещением в azure dev ops вы имеете в виду не использование файла YAML, который находится в вашем репозитории, а скорее их классический редактор, который вы можете редактировать онлайн через сайт azure dev ops, или я не совсем понимаю, что вы имеете в виду? Просто пытаюсь лучше понять, что вас сдерживает.

3. В настоящее время я использую классический способ построения конвейера без использования yaml. Ниже приведен пример ошибки. По ссылке nativescript ниже показаны компоненты, необходимые для успешной сборки. У меня есть на моем компьютере разработчика и, полагаю, не существует на виртуальной машине сборки. Убедитесь, что ваша среда настроена в соответствии с системными требованиями, описанными на docs.nativescript.org/setup/ns-cli-setup / … . 2019-04-25T09:06:15.9570473Z ##[ошибка]Bash завершается с кодом ‘127’. 2019-04-25T09:06:15.9582276 Z ## [раздел] Завершение: сборка, отладка APK

4. Итак, эта настройка предназначена для Linux. Не уверен, намеренно это или нет, но для создания приложения для iOS вам нужно будет запустить их виртуальную машину macOS, которую использует мой пример. Если вы создаете только Android, вам может сойти с рук виртуальная машина Linux, но я никогда не пробовал, поскольку хотел создавать как для iOS, так и для Android. Если вы попробуете переключиться на macOS, держу пари, вам повезет больше. Вот ссылка для настройки на Mac docs.nativescript.org/start/ns-setup-os-x . Есть ли конкретная причина для Linux?

5. В настоящее время я создаю только для Android, поэтому я использовал Linux.