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

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

Я добавил триггер для запуска до интеграции, где я пытаюсь выполнить "git lfs pull", чтобы он перетаскивал большие файлы во временный каталог, который 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 B / 139,13 МБ

Git LFS: (0 из 1 файлов) 0 B / 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 Не удалось оформить файл

Не удалось записать файл рабочего каталога: Ошибка при открытии файла мультимедиа. goroutine 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/goit/lfs.: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 github.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 checkoutFromFetchChan /Users/rick/go/src/github.com/github/git-lfs/commands/command_checkout.go:80 +0x439

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 

Люди, я не уверен, если есть проблема с оригинальным решением, но если у вас есть проблемы, попробуйте что-то вроде ниже - это работало для меня с Xcode Build Server от 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
Другие вопросы по тегам