Сборка XCode работает из командной строки, но не в crontab? - PullRequest
0 голосов
/ 06 сентября 2018

Все

У меня есть скрипт, который собирает и архивирует проект моего приложения для iPhone, а затем экспортирует пакет Enterprise для копирования в общедоступное веб-пространство. Я хочу настроить его так, чтобы он делал ночные сборки для тестирования. Хотя он отлично работает из командной строки, он не работает вообще в cron - он достигает стадии подписи и не может найти профили обеспечения.

Мой сценарий - конфиденциальные данные отредактированы (каталог appdeploy представляет собой сопоставленный общий ресурс samba с веб-сервером):

#!/bin/bash

cd ${HOME}/logistics-phonegap

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

security unlock-keychain -p $(base64 -D <<<"**REDACTED**") login.keychain
echo "securty unlock-keychain completed with return code $?"

GITDESC=$(git describe)
IFS='v.-' read empty major minor patch depth hash <<<"$GITDESC"
if [ $1 ]
then
    CHANNEL=$1
else
    CHANNEL=stable
fi
hash=$(printf "%d" 0x${hash:1:7})

EXPORTPLIST=export.$$.plist

pushd platforms/ios

cat > ${EXPORTPLIST} <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>compileBitcode</key>
    <false/>
    <key>method</key>
    <string>enterprise</string>
    <key>provisioningProfiles</key>
    <dict>
        <key>com.myapp.myapp</key>
        <string>In House Distribution</string>
    </dict>
</dict>
</plist>
EOF

ARCHIVEPATH=${PWD}/build/${major}.${minor}.${patch}.${depth}/"MyApp".xcarchive
EXPORTPATH=~/Exports/${major}.${minor}.${patch}.${depth}

/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${major}.${minor}.${patch}.${depth}" "MyApp/MyApp-Info.plist"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${major}.${minor}.${patch}.${depth}.${hash}" "MyApp/MyApp-Info.plist"

echo '*******************************************************************************'
echo '******************************** Build Package ********************************'
echo '*******************************************************************************'

xcodebuild -workspace "MyApp".xcworkspace -scheme "MyApp" -sdk iphoneos -configuration AppStoreDistribution archive -archivePath "${ARCHIVEPATH}"

mkdir -p ${EXPORTPATH}

echo '*******************************************************************************'
echo '******************************* Export Archive ********************************'
echo '*******************************************************************************'

xcodebuild -exportArchive -archivePath "${ARCHIVEPATH}" -exportPath ${EXPORTPATH} -exportOptionsPlist ${EXPORTPLIST}

if [ -a ${EXPORTPATH}/"MyApp.ipa" ]
then

    cat > ${EXPORTPATH}/manifest.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>items</key>
    <array>
        <dict>
            <key>assets</key>
            <array>
                <dict>
                    <key>kind</key>
                    <string>software-package</string>
                    <key>url</key>
                    <string>https://api.myapp.com/app/${CHANNEL}/EmployeePortal.ipa</string>
                </dict>
                <dict>
                    <key>kind</key>
                    <string>display-image</string>
                    <key>url</key>
                    <string>https://api.myapp.com/app/icon.57x57.${CHANNEL}.png</string>
                </dict>
                <dict>
                    <key>kind</key>
                    <string>full-size-image</string>
                    <key>url</key>
                    <string>https://api.myapp.com/app/icon.512x512.${CHANNEL}.png</string>
                </dict>
            </array>
            <key>metadata</key>
            <dict>
                <key>bundle-identifier</key>
                <string>com.myapp.myapp</string>
                <key>bundle-version</key>
                <string>$major.$minor.$patch.$depth</string>
                <key>kind</key>
                <string>software</string>
                <key>title</key>
                <string>MyApp</string>
            </dict>
        </dict>
    </array>
</dict>
</plist>
EOF

    cp -v "${EXPORTPATH}/MyApp.ipa" ~/appdeploy/${CHANNEL}/MyApp.ipa
    cp -v ${EXPORTPATH}/manifest.plist ~/appdeploy/${CHANNEL}
fi

rm ${EXPORTPLIST}

popd

РЕДАКТИРОВАТЬ: Выходные данные скрипта с флагом -x и stderr, переданным в stdout, находятся здесь (слишком долго для переполнения стека): https://gist.github.com/thirdwheel/5a6f3b3626fd382c5a1bf16cb2bba2fb

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Ответ, похоже, должен использовать launchd, а не cron. Launchd может обращаться к цепочкам для ключей как к вашей учетной записи - cron, очевидно, не может, потому что он запускается от имени пользователя root и отбрасывает разрешения на запуск в качестве различных пользователей с заданиями на выполнение.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.mycompany.myapp.auto</string>

  <key>ProgramArguments</key>
  <array>
    <string>/Users/developer/myapp-phonegap/deployIOS.sh</string>
    <string>test</string>
  </array>

  <key>StartCalendarInterval</key>
  <dict>
     <key>Hour</key>
     <integer>0</integer>
     <key>Minute</key>
     <integer>0</integer>
  </dict>

  <key>RunAtLoad</key>
  <true/>

  <key>StandardErrorPath</key>
  <string>/Users/developer/deployIOS-test.err</string>

  <key>StandardOutPath</key>
  <string>/Users/developer/deployIOS-test.out</string>
</dict>
</plist>
0 голосов
/ 06 сентября 2018

Crontab не имеет прав для разблокировки цепочки для ключей

security unlock-keychain -p $(base64 -D <<<"**REDACTED**") login.keychain
...