Непрерывная интеграция сервера Xcode и git lfs

Я создал бота в Xcode для непрерывной интеграции в мой проект.

Я добавил триггер для запуска перед интеграцией, где я пытаюсь выполнить «извлечение git lfs», чтобы он извлекал большие файлы во временный каталог, который Xcode использует для выполнения сборки.

Как заставить «git lfs pull» работать, чтобы интеграция прошла успешно?

В настоящее время я не могу заставить его успешно загружать большие файлы. Мой сценарий выглядит следующим образом:

#!/bin/bash

changeToRepo() {
    cd ${XCS_SOURCE_DIR}/My-Project-Name
}

changeToRepo
/usr/local/bin/git-lfs pull

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

Git LFS: (0 из 1 файлов) 0 Б / 139,13 МБ

Git LFS: (0 из 1 файлов) 0 Б / 139,13 МБ
Не удалось извлечь файл git-lfs/1.1.0 (GitHub; darwin amd64; go 1.5.1; git 258acf1) git версии 2.5.4 (Apple Git -61)

$ git-lfs pull Не удалось извлечь файл

Не удалось записать файл рабочего каталога: ошибка при открытии медиафайла. горутина 66 [работает]: github.com/github/git-lfs/lfs.Stack(0x0, 0x0, 0x0) /Users/rick/go/src/github.com/github/git-lfs/lfs/errors.go :557 +0x80 github.com/github/git-lfs/commands.logPanicToWriter(0x89a1e8, 0xc82002e018, 0x896028, 0xc82000e480) /Users/rick/go/src/github.com/github/git-lfs/commands/commands.go :184 +0xf7f github.com/github/git-lfs/commands.logPanic(0x896028, 0xc82000e480, 0x0, 0x0) /Users/rick/go/src/github.com/github/git-lfs/commands/commands.go :148 +0x421 github.com/github/git-lfs/commands.handlePanic(0x896028, 0xc82000e480, 0x0, 0x0) /Users/rick/go/src/github.com/github/git-lfs/commands/commands.go :123 +0x4e github.com/github/git-lfs/commands.LoggedError(0x896028, 0xc82000e480, 0x548060, 0x17, 0x0, 0x0, 0x0) /Users/rick/go/src/github.com/github/git-lfs /commands/commands.go:73 +0x82 github.com/github/git-lfs/commands.checkoutWithChan(0xc82012c4e0) /Users/rick/go/src/github.com/github/git-lfs/commands/command_checkout.go :202 +0x860 гит ub.com/github/git-lfs/commands.checkoutFromFetchChan.func1(0xc82012c4e0, 0xc82018e040) /Users/rick/go/src/github.com/github/git-lfs/commands/command_checkout.go:78 +0x21 создано github.com/github/git-lfs/commands.checkoutFromFetchChan/Users/rick/go/src/github.com/github/git-lfs/commands/command_checkout.go:80 +0x439


person Chris Livdahl    schedule 28.01.2016    source источник


Ответы (2)


Вот как я заставил git lfs работать в боте. Во-первых, я отредактировал скрипт запуска триггера бота «До интеграции», чтобы он выглядел следующим образом:

введите описание изображения здесь

#!/bin/bash
export PATH="$PATH:/opt/local/bin:/opt/local/sbin:/usr/local/bin"
(cd ${XCS_SOURCE_DIR}/My-Project_Dir/My-Subfolder-Dir; sudo git lfs pull)

Мы экспортируем PATH b/c git lfs внутри user/local/bin (эти другие местоположения могут применяться в зависимости от того, как вы его установили или какой сервер вы используете). В противном случае git lfs не может быть найден.

Каталог My-Project_Dir/My-Subfolder-Dir является расположением проекта. Сервер Xcode загрузит мой исходный код в ${XCS_SOURCE_DIR}, которая является временной папкой, но файл .git, относящийся к моему большому файлу, находится в My-Project_Dir/My-Subfolder-Dir.

Обратите внимание, что команды cd и git lfs заключены в круглые скобки, потому что команда cd порождает дочерний процесс. Если бы у нас была только строка с cd и git lfs на следующей строке, каталог не остался бы измененным, потому что после выхода дочернего процесса родительский все еще находится в исходном каталоге. Команда git lfs не будет выполняться внутри этого нового каталога дочернего процесса, если только мы не запустим команды последовательно внутри этого дочернего процесса.

Также обратите внимание, что мне нужно использовать sudo с git lfs, иначе у git lfs нет разрешения. Бот работает в пространстве пользователя, отличном от пространства администратора моего сервера, с именем пользователя _xcsbuildd.

Итак, добавляем пользователя _xcsbuildd в sudoers. В Терминале используйте следующую команду:

$ sudo visudo

Найдите строку «%admin ALL=(ALL) ALL», нажмите «a» для редактирования файла, а под ней добавьте следующую строку:

_xcsbuildd ALL=(ALL) NOPASSWD: ALL

Нажмите Esc, а затем напишите и выйдите, набрав:

:wq 

Проверьте правильность sudoers:

$ sudo cat /etc/sudoers | grep _xcsbuildd
_xcsbuildd ALL=(ALL) NOPASSWD: ALL 
person Chris Livdahl    schedule 01.06.2016

Ребята, я не уверен, есть ли проблема с исходным решением, но если у вас есть проблемы, попробуйте что-то вроде ниже - у меня это сработало с сервером сборки Xcode из Xcode 9.2 / не требует никаких разрешений / sudoing и т. д. В основном речь идет об установке git-lfs через homebrew и выполнении git lfs pull сразу после этого.

#!/bin/sh -ex
pushd "${XCS_SOURCE_DIR:?}"

rm -rf homebrew
mkdir homebrew
curl -L "https://github.com/Homebrew/brew/tarball/master" | tar xz --strip 1 -C homebrew
export PATH="$PATH:$PWD/homebrew/bin"
brew install git-lfs

cd YourCheckedOutRepository
git lfs pull

popd
person Grigory Entin    schedule 20.01.2018