Проблемы с кэшем при попытке создания приложений для iOS с параллельным конвейером Jenkins на одном компьютере Mac - PullRequest
1 голос
/ 04 октября 2019

У меня есть конвейерное задание Jenkins, которое создает код iOS, создает файл .app и запускает на нем тесты. эти задания запускаются PR в репозитории iOS. Одновременно может быть запущено около 4-5 параллельных сборок.

Конфигурация машины сборки:

  • 1 одиночная машина Mac с установленным xcode и другими зависимостями
  • Этот компьютер Mac является подчиненным агентом Jenkins
  • При запуске сборки в рабочей области создается папка, в которой исходный репозиторий клонируется для сборки.

Например

jenkins-workspace-folder-on-mac-machine/
-> build/ (folder created by a job that builds .app file for a PR)
-> build@2/ (another folder created by a parallel job that builds .app for a PR)
-> build@3/ (another folder created by a parallel job that builds .app for a PR)

Это мой сценарий Jenkinsfile для справки:

stages {

  stage('Clean Workspace') {
   steps {
    cleanWs deleteDirs: true, patterns: [[pattern: '**/Podfile.lock', type: 'EXCLUDE'], [pattern: '**/Pods/**', type: 'EXCLUDE'], [pattern: '**/Podfile', type: 'EXCLUDE'], [pattern: '**/Carthage/**', type: 'EXCLUDE'], [pattern: '**/Cartfile', type: 'EXCLUDE'], [pattern: '**/Cartfile.lock', type: 'EXCLUDE'], [pattern: '**/Cartfile.private', type: 'EXCLUDE'], [pattern: '**/Cartfile.resolved', type: 'EXCLUDE'], [pattern: '**/Gemfile', type: 'EXCLUDE'], [pattern: '**/Gemfile.lock', type: 'EXCLUDE']]
   }
  }

  /* Download and checkout iOS repository in the workplace.
  Also set all the keys for iOS into .env file */
  stage('Checkout iOS Source repository') {
      steps{
            checkout([$class: 'GitSCM', branches: [[name: "${PR_BRANCH}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'abc', url: 'https://github.com/abc']]])
        }
    }

  /* Install all dependencies. These will be skipped if repo folder is not cleaned in the beginning. 
  Full install will be done if an executor has to clone the repository from scratch*/
  stage('Install dependencies') {
    steps {
      sh '''
         bundle install
         make install
         '''
      }
  }

  stage('Build .app file and trigger tests') {
    steps {//This will perform xcode build and build .app file }

Проблемы, с которыми я сталкиваюсь:

  • Сборки занимают слишком много времени, когда я каждый раз очищаю рабочее пространство перед началом сборки. Я ожидал, что если я уберу рабочее пространство, кроме файлов и папок Podfile, Pod folder, podfile.lock, Carthage folder, Cartfile, Cartfile.private, Cartfile.resolved, Gemfile, Gemfile.lock, это ускорит сборку. Но это не работает.
  • Есть случайные сбои сборки из-за проблем с кешем, таких как:
*** Checking out Nimble at "v8.0.4"
A shell task (/usr/bin/env git checkout --quiet --force v8.0.4 (launched in /Users/user/Library/Caches/org.carthage.CarthageKit/dependencies/Nimble)) failed with exit code 1:
error: pathspec 'v8.0.4' did not match any file(s) known to git

make: *** [carthage-install] Error 1
### Error
Errno::ENOENT - No such file or directory @ rb_file_s_stat - /Users/user/Library/Caches/CocoaPods/Pods/Release/Flurry-iOS-SDK/8.4.0-0c448
bundle exec pod install
Analyzing dependencies
Pre-downloading: `CLImageEditor` from `git@github.com/CLImageEditor.git`, commit `96e78cdf95761170d5bf11653a8257a3ccfeb19a`
[!] Failed to download 'CLImageEditor': Directory not empty @ dir_s_rmdir - /Users/user/Library/Caches/CocoaPods/Pods
make: *** [pod-install] Error 1

Было бы замечательно, если бы кто-то мог помочь понять, чтоЯ здесь делаю не так.

1 Ответ

0 голосов
/ 04 октября 2019

Я вижу, что вы делаете pod install в своем скрипте сборки, а Cocoapods загружает зависимости. Я думаю, что несколько экземпляров Cocoapods, загружающих зависимости одновременно, могут быть причиной 2 из 3 ошибок, которые вы опубликовали. По крайней мере, это определенно замедлит ваши сборки.

Реально ли проверить ваш каталог Pods в git вместе с вашим исходным кодом? Есть плюсы и минусы в этом, но это обычная практика, и даже рекомендуется разработчиками Cocoapods . Затем вы можете удалить шаг pod install из вашего скрипта сборки, что должно значительно ускорить процесс.

...