2014-01-11 2 views
8

enter image description hereКак настроить TeamCity CI так, чтобы он распаковывал компоненты Xamarin?

В Visual Studio все работает, и каталог компонентов создается с соответствующими DLL. Однако TeamCity не может извлекать DLL библиотеки поддержки Android, потому что триггер для восстановления - это плагин Xamarin VS, который запускается при загрузке решения. Эквивалент восстановления пакета nuget для Xamarin равен xamarin-component. Я поместил xamarin-component.exe в каталог C: \ Windows. Чтобы настроить TeamCity, я предваряется шаг сборки командной строки с

Command executable: xamarin-component 
Command parameters: restore mysolution.sln 

TeamCity работает как NT Authority \ System. Таким образом, используя PsExec,

psexec -i -s %SystemRoot%\system32\cmd.exe 

Если я затем запустить «Xamarin-компонента входа»

INFO (login): Computed cookie jar path: C:\Windows\system32\config\systemprofile\.xamarin-credentials 
INFO (login): Computed cookie jar path: C:\Windows\system32\config\systemprofile\.xamarin-credentials 
INFO (login): Credentials successfully stored. 

Когда я иду к моему решению в ЦМД и попытка восстановления, я попытался загрузить CompoNet, а затем ошибка разбора Json. Это та же ошибка, что и в TeamCity.

teamcity

Я получаю сообщение об ошибке, если я использую «Администратор» (в котором хранятся учетные данные в C:.. \ Users \ Administrator Раньше, когда я использовал свой личный счет, он сделал работу, однако после того, как я удалил C: \ Users \ tim \ AppData \ Local \ Xamarin \ Cache \ Components, эта же проблема возникла. Fiddler показывает, что вместо того, чтобы вернуть Json (как и при вводе недопустимого токена), мы получаем перенаправление 302, которое говорит Объект переехал здесь А вот Войти страница Xamarin -..., очевидно, не Json

Пробовал 1. Установите COOKIE_JAR_PATH в C: \ Users \ tim.xamarin-Полномочия - xpkg подхватывает, но ту же ошибку 2. Скопируйте .xamarin-учетные данные из Config \ system32 в D: \, установите COOKIE_JAR_PATH в D: .xamarin -credentials - xpkg подхватывает, но такая же ошибка 3. Перемещение .xamarin-учетных данных в C: \, установите COOKIE_JAR_PATH - же ошибка 4. Повторно Войти в NT Authority с COOKIE_JAR_PATH в C: .xamarin-учетные данные - такая же ошибка

Моей временной идеей является выяснение того, где компонент хамарина NT Authority ищет кеш и ставит t он там.

C:\Windows\system32\config\systemprofile\AppData\Local\Xamarin\Cache\Components\xamandroidsupportv4-18-4.18.1.xam 

версия моего Xamarin-компонента 0,99 - на 100, мы стараться ...

ответ

3

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

В результате я добавил переменную среды, которую инструмент будет читать (я являюсь ее главным автором в Xamarin :-), который указывает путь к файлу cookie для чтения, и это решило проблему для других, используя TeamCity. Переменная среды - COOKIE_JAR_PATH.

Вы можете установить его из параметров среды TeamCity, чтобы указать путь к файлу cookie за пределами каталога профиля system32 (я думаю, что в моем первоначальном тестировании я помещал его в корень диска C :, но он может быть где угодно , действительно).

+0

Спасибо Боян. Я надеялся услышать от вас. Я попробую. Предложите, чтобы предупреждение было встроено в следующую версию - или, возможно, вариант для указания местоположения банка cookie. – tofutim

+0

Да, мне нужно потратить некоторое время на улучшение обработки ошибок/документации на инструменте. –

+0

Хмм, указывая на мой личный C: \ Users \ tim \ .xamarin-credentials дает ту же ошибку, хотя инструмент действительно подбирает изменения. – tofutim

3

Как взломать, я скопировал папку Cache из

C:\Users\tim\AppData\Local\Xamarin 

в

C:\Windows\system32\config\systemprofile\AppData\Local\Xamarin\ 

Это обходили связь с сервером Xamarin.

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

GET /api/available_versions?alias=xamandroidsupportv4-18 HTTP/1.1 

, который возвращает «Object переехал сюда», где «здесь» нет нигде.

oh noes

При запуске Visual Studio после удаления папки Cache и компоненты (рядом с раствором), Xamarin делает вызов

GET /api/download/xamandroidsupportv4-18/4.18.1 HTTP/1.0 

, который имеет аналогичный глядя переместить объект, но на этот раз он направляет вас xamarin-components.s3.amazonaws.com/

oh yes

GET /fdca922d2b77799fe208a08c9f3444fe/xamandroidsupportv4-18-4.18.1.xam HTTP/1.0 

Возможно, что-то изменилось или изменился API доступных_версий.

+0

отличная новость! Я сообщил об этой ошибке Xamarin, и они определили проблему. Они ожидают, что фиксированный API будет доступен к концу недели. –

2

Большое спасибо за этот вопрос и ваши ответы на него. Мне не очень понравилась идея хранения файла cookie auth на узле сборки или его копии вручную, поэтому я придумал свое собственное решение, поэтому я взломал эту проблему быстрым сценарием Powershell, который имитирует поведение xamarin-component.exe restore действия:

param 
(
    [Parameter(Mandatory=$true)] 
    $authCookie, 

    [Parameter(Mandatory=$true)] 
    $componentDirectory, 

    [Parameter(Mandatory=$true)] 
    $project 
) 

[void]([System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')) 
$xml = [xml] $(cat $project); 
$components = $xml.Project.ItemGroup.XamarinComponentReference | ? { $_.Include.Length -gt 0 } | % { $_.Include }; 

if (!(test-path $componentDirectory)) 
{ 
    echo "$componentDirectory didn't exist, so it was created."; 
    [void](mkdir $componentDirectory); 
} 

foreach ($component in $components) 
{ 
    $source = "http://components.xamarin.com/download/$component"; 
    $destination = "$componentDirectory\$component.zip"; 

    if (test-path $destination) 
    { 
     echo "$destination already exists, skipping..."; 
     continue; 
    } 

    echo "Downloading $component from $source to $destination..."; 

    $client = New-Object System.Net.WebClient 
    $client.Headers.Add([System.Net.HttpRequestHeader]::Cookie, "XAM_AUTH=$authCookie"); 

    try 
    { 
     $client.DownloadFile($source, $destination); 
    } 
    catch 
    { 
     # The error message will be on one of these lines hopefully: 
     write-error "Failed to download! Errors are below:"; 
     write-error $_ 
     write-error $_.Exception 
     write-error $_.Exception.InnerException 
     write-error $_.Exception.InnerException.InnerException 
     exit 1; 
    } 

    if (!(test-path $destination)) 
    { 
     write-error "$destination doesn't exist - the download must have failed!"; 
     exit 1; 
    } 

    echo "Decompressing $source to $componentDirectory" 
    [System.IO.Compression.ZipFile]::ExtractToDirectory($destination, $componentDirectory) 
    echo "" 
} 

echo "Done!"; 

параметр -authCookie может быть извлечен либо из XAM_AUTH куков в вашем браузере или из .xamarin-мандатного «cookiejar» в вашем домашнем каталоге. Приятно настроить его таким образом, чтобы сохранить его как секретную переменную в TeamCity.

Параметр componentDirectory должен быть полным путем к каталогу компонентов - он будет создан, если он не существует.

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

К сожалению, это не очень удобно для прихотей Xamarin - простое изменение API могло бы сделать это бесполезным, поэтому, очевидно, лучшим решением является ждать, пока Xamarin исправит это. Я отправил по электронной почте поддержку Xamarin, чтобы жаловаться на эту проблему, но я не думаю, что я получу своевременный ответ (они кажутся очень занятыми в эти дни). Надеюсь, это полезно!

0

Создание каталога и положить, что путь к каталогу в переменной окружения XAMARIN_CACHEPATH

enter image description here

Смежные вопросы