as-app/scripts/expo-publish-selfhosted.sh

111 lines
3.1 KiB
Bash
Executable file

#!/bin/bash
set -e
# This is the publish script for self-hosted expo updates.
RELEASECHANNEL=$1
PROJECTPATH=$2
UPLOADKEY=$3
APISERVER=$4
showUsage () {
printf "Usage: expo-publish-selfhosted.sh <release-channel> <expo-project-folder> <upload-key> <api-server> \n"
printf "Example: expo-publish-selfhosted.sh staging ~/expo/myproject abc123def456 http://localhost:3000 \n"
}
###############################################################################
# Check that all the required parameters are present.
###############################################################################
# Checking Release Channel
if [ -z "$RELEASECHANNEL" ]; then
printf "Error: missing release channel parameter.\n"
showUsage
exit 1
fi
# Checking Project Path
if [ -z "$PROJECTPATH" ]; then
printf "Error: missing project folder directory release channel parameter.\n"
showUsage
exit 1
fi
# Checking Upload Key
if [ -z "$UPLOADKEY" ]; then
printf "Error: missing upload key parameter.\n"
showUsage
exit 1
fi
# Checking API Server
if [ -z "$APISERVER" ]; then
printf "Error: missing API Server parameter.\n"
showUsage
exit 1
fi
# Checking project path
cd $PROJECTPATH
if [ ! -f "app.json" ] && [ ! -f "app.config.js" ]; then
printf "Error: app.json or app.config.js not found in $(pwd)\n"
exit 1
fi
###############################################################################
# Publish the update
###############################################################################
# Getting project slug for project name and runtime version
if [ -f "app.json" ]; then
SLUG=$(grep -o '"slug": "[^"]*' app.json | grep -o '[^"]*$')
RUNTIMEVERSION=$(grep -o '"runtimeVersion": "[^"]*' app.json | grep -o '[^"]*$')
elif [ -f "app.config.js" ]; then
SLUG=$(node -p "require('./app.config.js').expo.slug")
RUNTIMEVERSION=$(node -p "require('./app.config.js').expo.runtimeVersion")
fi
BUILDFOLDER=/tmp/$SLUG-$RUNTIMEVERSION-$RELEASECHANNEL
BUILDNAME=$(basename $BUILDFOLDER)
PAYLOAD="$BUILDNAME.zip"
# Idempotent cleanup
rm -rf $BUILDFOLDER
rm -f $BUILDFOLDER.zip
mkdir $BUILDFOLDER
# Build update
yarn expo export --experimental-bundle --output-dir $BUILDFOLDER
# Add app.json/app.config.js & package.json to the build for info & Metadata
if [ -f "app.json" ]; then
cp app.json $BUILDFOLDER/
else
# Convert app.config.js to app.json and copy to build folder
node -e "const fs = require('fs'); const config = require('./app.config.js').expo; fs.writeFileSync('$BUILDFOLDER/app.json', JSON.stringify({ expo: config }, null, 2));"
fi
cp package.json $BUILDFOLDER/
# Compress update
cd $BUILDFOLDER
zip -q "$BUILDNAME.zip" -r ./*
cd -
# Upload update
curl --location --request POST "$APISERVER/upload" \
--form "uri=@$BUILDFOLDER/$PAYLOAD" \
--header "project: $SLUG" \
--header "version: $RUNTIMEVERSION" \
--header "release-channel: $RELEASECHANNEL" \
--header "upload-key: $UPLOADKEY" \
--header "git-branch: $(git rev-parse --abbrev-ref HEAD)" \
--header "git-commit: $(git log -n 1 --format="%H")"
# Cleanup
# rm -rf "$BUILDFOLDER"
# rm -f "$BUILDNAME.zip"
printf "\n\nPublish Done"