405 lines
11 KiB
Bash
405 lines
11 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
set -e
|
|
|
|
usage() {
|
|
echo "Usage: $0 [-c] [-b branch] [-u username] version"
|
|
echo
|
|
echo "-b Branch to archive. Defaults to 'master'."
|
|
echo "-u Username to use for send to downloads.dojotoolkit.org."
|
|
echo " If not provided, manual upload is required."
|
|
echo "-c Build CDN release as well."
|
|
exit 1
|
|
}
|
|
|
|
while getopts cb:u: OPTION; do
|
|
case $OPTION in
|
|
c)
|
|
CDN=1
|
|
shift 1
|
|
OPTIND=1
|
|
;;
|
|
b)
|
|
BRANCH=$OPTARG
|
|
shift 2
|
|
OPTIND=1
|
|
;;
|
|
u)
|
|
USERNAME=$OPTARG
|
|
shift 2
|
|
OPTIND=1
|
|
;;
|
|
\?)
|
|
echo "Invalid option -$OPTARG"
|
|
exit 1
|
|
;;
|
|
:)
|
|
echo "Missing argument for -$OPTARG"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Version should be something like 0.9.0-beta or 0.9.0. See http://semver.org.
|
|
VERSION=$1
|
|
|
|
OLDIFS=$IFS
|
|
IFS="."
|
|
PRE_VERSION=($VERSION)
|
|
IFS=$OLDIFS
|
|
|
|
if [[ ${PRE_VERSION[2]} == *-* ]]; then
|
|
PRE_VERSION="${PRE_VERSION[0]}.${PRE_VERSION[1]}.$((PRE_VERSION[2]))-pre"
|
|
elif [[ ${PRE_VERSION[2]} -eq 0 ]]; then
|
|
PRE_VERSION="${PRE_VERSION[0]}.$((PRE_VERSION[1] + 1)).0-pre"
|
|
else
|
|
PRE_VERSION="${PRE_VERSION[0]}.${PRE_VERSION[1]}.$((PRE_VERSION[2] + 1))-pre"
|
|
fi
|
|
|
|
BRANCH=${BRANCH=master}
|
|
|
|
# Name used for directory and tar/zip file of prebuilt version
|
|
BUILD_NAME=dojo-release-$VERSION
|
|
|
|
# Name used for directory and tar/zip file of source version
|
|
SOURCE_NAME=$BUILD_NAME-src
|
|
|
|
# Name used for tar/zip file of demos
|
|
DEMOS_NAME=$BUILD_NAME-demos
|
|
|
|
# Name used for tarball of temporary archive for downloads.dojotoolkit.org
|
|
OUTPUT_NAME=release-$VERSION
|
|
|
|
# Name used for directory and zip file of CDN version
|
|
CDN_NAME=$VERSION
|
|
|
|
# Name used for directory and zip archive for archive.dojotoolkit.org
|
|
CDN_OUTPUT_NAME=$VERSION-cdn
|
|
|
|
# Build scripts directory (own directory)
|
|
UTIL_DIR=$(cd $(dirname $0) && pwd)
|
|
|
|
# Directory where all build operations will be rooted
|
|
ROOT_DIR=$UTIL_DIR/build
|
|
|
|
###########
|
|
# NOTE: OUTPUT_DIR, SOURCE_DIR, and CDN_OUTPUT_DIR *must* be children of ROOT_DIR for certain operations to work
|
|
# properly. They must also use $*_NAME variables as the last directory part too.
|
|
###########
|
|
|
|
# Directory into which final output for downloads.dojotoolkit.org is placed
|
|
OUTPUT_DIR=$ROOT_DIR/$OUTPUT_NAME
|
|
|
|
# Directory into which Dojo source is checked out
|
|
SOURCE_DIR=$ROOT_DIR/$SOURCE_NAME
|
|
|
|
# Directory where source Dojo build scripts exist
|
|
SOURCE_BUILD_DIR=$SOURCE_DIR/util/buildscripts
|
|
|
|
# Directory into which the source Dojo writes built data
|
|
SOURCE_RELEASE_DIR=$SOURCE_DIR/release
|
|
|
|
# Directory into which the source CDN writes built data for CDN
|
|
CDN_OUTPUT_DIR=$ROOT_DIR/$CDN_OUTPUT_NAME
|
|
|
|
# Repositories that are a part of the Dojo Toolkit
|
|
ALL_REPOS="demos dijit dojo dojox themes util"
|
|
|
|
zip="zip -dd -ds 1m -rq"
|
|
|
|
if [ $(echo $(zip -dd test 2>&1) |grep -c "one action") -eq 1 ]; then
|
|
# Zip 2.3 does not support progress output
|
|
zip="zip -rq"
|
|
fi
|
|
|
|
tar="tar --checkpoint=1000 --checkpoint-action=dot"
|
|
ant=~/.ant/bin/ant
|
|
|
|
if [ "$VERSION" == "" ]; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
if [ -d $SOURCE_DIR -o -d $OUTPUT_DIR ]; then
|
|
echo "Existing build directories detected at $ROOT_DIR"
|
|
echo "Aborted."
|
|
exit 1
|
|
fi
|
|
|
|
echo "This is an internal Dojo release script. You probably meant to run build.sh!"
|
|
echo "If you want to create Dojo version $VERSION from branch $BRANCH, press 'y'."
|
|
echo "The source version will be updated to $PRE_VERSION after the build."
|
|
echo "(You will have an opportunity to abort pushing upstream later on if something"
|
|
echo "goes wrong.)"
|
|
read -s -n 1
|
|
|
|
if [ "$REPLY" != "y" ]; then
|
|
echo "Aborted."
|
|
exit 0
|
|
fi
|
|
|
|
if [ ! -d $ROOT_DIR ]; then
|
|
mkdir $ROOT_DIR
|
|
fi
|
|
|
|
mkdir $SOURCE_DIR
|
|
mkdir $OUTPUT_DIR
|
|
|
|
VERSION_EXISTS=0
|
|
|
|
for REPO in $ALL_REPOS; do
|
|
# Clone pristine copies of the repository for the desired branch instead of trying to copy a local repo
|
|
# which might be outdated, on a different branch, or containing other unpushed/uncommitted code
|
|
git clone --recursive --single-branch --branch=$BRANCH git@github.com:dojo/$REPO.git $SOURCE_DIR/$REPO
|
|
|
|
cd $SOURCE_DIR/$REPO
|
|
|
|
set +e
|
|
git checkout $VERSION > /dev/null 2>&1
|
|
if [ $? -eq 0 ]; then
|
|
set -e
|
|
echo "Tag $VERSION already exists for $REPO; using existing tag"
|
|
VERSION_EXISTS=1
|
|
continue
|
|
fi
|
|
set -e
|
|
|
|
REVISION=$(git log -n 1 --format='%h')
|
|
VERSION_FILES=
|
|
|
|
if [ -f "package.json" ]; then
|
|
VERSION_FILES=package.json
|
|
fi
|
|
|
|
if [ -f "bower.json" ]; then
|
|
VERSION_FILES="$VERSION_FILES bower.json"
|
|
fi
|
|
|
|
if [ $REPO == "dojo" ]; then
|
|
# Dojo 1.7+
|
|
if [ -f "_base/kernel.js" ]; then
|
|
VERSION_FILES="$VERSION_FILES _base/kernel.js"
|
|
# Dojo 1.6-
|
|
elif [ -f "_base/_loader/bootstrap.js" ]; then
|
|
VERSION_FILES="$VERSION_FILES _base/_loader/bootstrap.js"
|
|
fi
|
|
fi
|
|
|
|
if [ $REPO == "util" ]; then
|
|
for FILENAME in doh/package.json doh/_rhinoRunner.js doh/mobileRunner.html doh/runner.html doh/_nodeRunner.js; do
|
|
if [ -f $FILENAME ]; then
|
|
VERSION_FILES="$VERSION_FILES $FILENAME"
|
|
fi
|
|
done
|
|
|
|
if [ -f "build/version.js" ]; then
|
|
VERSION_FILES="$VERSION_FILES build/version.js"
|
|
fi
|
|
fi
|
|
|
|
if [ -n "$VERSION_FILES" ]; then
|
|
for FILENAME in $VERSION_FILES; do
|
|
java -jar $UTIL_DIR/../shrinksafe/js.jar $UTIL_DIR/changeVersion.js $VERSION $REVISION $FILENAME
|
|
done
|
|
|
|
# These will be pushed later, once it is confirmed the build was successful, in order to avoid polluting
|
|
# the origin repository with failed build commits and tags
|
|
git commit -m "Updating metadata for $VERSION" $VERSION_FILES
|
|
fi
|
|
|
|
git tag -a -m "Release $VERSION" $VERSION
|
|
|
|
if [ -n "$VERSION_FILES" ]; then
|
|
for FILENAME in $VERSION_FILES; do
|
|
java -jar $UTIL_DIR/../shrinksafe/js.jar $UTIL_DIR/changeVersion.js $PRE_VERSION "" $FILENAME
|
|
done
|
|
|
|
git commit -m "Updating source version to $PRE_VERSION" $VERSION_FILES
|
|
fi
|
|
|
|
git checkout $VERSION
|
|
done
|
|
|
|
cd $ROOT_DIR
|
|
|
|
# Archive all source except for demos, which are provided separately so people do not have to download them
|
|
# with the source
|
|
echo -n "Archiving source..."
|
|
$zip $OUTPUT_DIR/$SOURCE_NAME.zip $SOURCE_NAME/ -x "*/.git" -x "*/.git/*" -x "$SOURCE_NAME/demos/*"
|
|
$tar --exclude="$SOURCE_NAME/demos" --exclude-vcs -zcf $OUTPUT_DIR/$SOURCE_NAME.tar.gz $SOURCE_NAME/
|
|
echo "Done"
|
|
|
|
# Temporarily rename $SOURCE_NAME ($SOURCE_DIR) to $BUILD_NAME to archive demos backwards-compatibly
|
|
mv $SOURCE_NAME $BUILD_NAME
|
|
echo -n "Archiving demos..."
|
|
$zip $OUTPUT_DIR/$DEMOS_NAME.zip $BUILD_NAME/demos/ -x "*/.git" -x "*/.git/*"
|
|
$tar --exclude-vcs -zcf $OUTPUT_DIR/$DEMOS_NAME.tar.gz $BUILD_NAME/demos/
|
|
mv $BUILD_NAME $SOURCE_NAME
|
|
echo "Done"
|
|
|
|
# Create the built release archive using the checked out release code
|
|
cd $SOURCE_BUILD_DIR
|
|
echo "Building release..."
|
|
./build.sh action=release profile=standard version=$VERSION releaseName=$BUILD_NAME cssOptimize=comments.keepLines optimize=shrinksafe.keepLines insertAbsMids=1 mini=true
|
|
cd $SOURCE_RELEASE_DIR
|
|
echo -n "Archiving release..."
|
|
$zip $OUTPUT_DIR/$BUILD_NAME.zip $BUILD_NAME/
|
|
$tar -zcf $OUTPUT_DIR/$BUILD_NAME.tar.gz $BUILD_NAME/
|
|
echo "Done"
|
|
|
|
# For backwards-compatibility, Dojo Base is also copied for direct download
|
|
cp $BUILD_NAME/dojo/dojo.js* $OUTPUT_DIR
|
|
|
|
# Second build with tests that is kept unarchived and placed directly on downloads.dojotoolkit.org
|
|
rm -rf $SOURCE_RELEASE_DIR
|
|
cd $SOURCE_BUILD_DIR
|
|
echo "Building downloads release..."
|
|
./build.sh action=release profile=standard version=$VERSION releaseName=$BUILD_NAME cssOptimize=comments.keepLines optimize=shrinksafe.keepLines insertAbsMids=1 copyTests=true mini=false
|
|
mv $SOURCE_RELEASE_DIR/$BUILD_NAME $OUTPUT_DIR
|
|
rmdir $SOURCE_RELEASE_DIR
|
|
echo "Done"
|
|
|
|
if [ $CDN ]; then
|
|
mkdir $CDN_OUTPUT_DIR
|
|
|
|
# Only this super-specific Ant version works!
|
|
if [ ! -d ~/.ant ]; then
|
|
mkdir ~/.ant
|
|
cd ~/.ant
|
|
echo "Installing ant 1.7.1 to ~/.ant..."
|
|
curl http://archive.apache.org/dist/ant/binaries/apache-ant-1.7.1-bin.tar.gz |tar --strip-components=1 -zx
|
|
echo "Done"
|
|
fi
|
|
|
|
echo "Building CDN release..."
|
|
|
|
# Build all locales
|
|
cd $SOURCE_BUILD_DIR/cldr
|
|
sed -i -e '/<property name="locales"/d' build.xml
|
|
|
|
$ant clean
|
|
|
|
# On first run of Ant, build.xml does some bad stuff that requires running ant twice
|
|
set +e
|
|
set -o pipefail
|
|
TMPFILE=$(mktemp)
|
|
$ant 2>&1 | tee $TMPFILE
|
|
EXITCODE=$?
|
|
set -e
|
|
set +o pipefail
|
|
if [ $EXITCODE -gt 0 ]; then
|
|
if [ $(grep -c "please re-run" $TMPFILE) -gt 0 ]; then
|
|
$ant
|
|
else
|
|
rm $TMPFILE
|
|
exit 1
|
|
fi
|
|
fi
|
|
rm $TMPFILE
|
|
unset TMPFILE EXITCODE
|
|
|
|
cd $SOURCE_BUILD_DIR
|
|
|
|
# Dojo 1.7+
|
|
if [ -f "profiles/cdn.profile.js" ]; then
|
|
./build.sh action=release profile=standard profile=cdn version=$VERSION releaseName=$CDN_NAME cssOptimize=comments.keepLines optimize=closure layerOptimize=closure stripConsole=normal copyTests=false mini=true
|
|
# Dojo 1.6
|
|
else
|
|
java -classpath ../shrinksafe/js.jar:../shrinksafe/shrinksafe.jar org.mozilla.javascript.tools.shell.Main build.js profile=standard version=$VERSION releaseName=$CDN_NAME cssOptimize=comments.keepLines optimize=shrinksafe layerOptimize=shrinksafe stripConsole=normal copyTests=false mini=true action=release loader=xdomain xdDojoPath="//ajax.googleapis.com/ajax/libs/dojo/$VERSION" xdDojoScopeName=window[\(typeof\(djConfig\)\!\=\"undefined\"\&\&djConfig.scopeMap\&\&djConfig.scopeMap[0][1]\)\|\|\"dojo\"]
|
|
fi
|
|
|
|
mv $SOURCE_RELEASE_DIR/$CDN_NAME $CDN_OUTPUT_DIR
|
|
rmdir $SOURCE_RELEASE_DIR
|
|
echo "Done"
|
|
|
|
echo -n "Generating CDN checksums..."
|
|
cd $CDN_OUTPUT_DIR
|
|
$zip $CDN_NAME.zip $CDN_NAME/
|
|
sha1sum $CDN_NAME.zip > sha1.txt
|
|
cd $CDN_OUTPUT_DIR/$CDN_NAME
|
|
find . -type f -exec sha1sum {} >> ../sha1.txt +
|
|
echo "Done"
|
|
|
|
cd $ROOT_DIR
|
|
echo -n "Creating CDN archive..."
|
|
$tar -cf $CDN_OUTPUT_NAME.tar $CDN_OUTPUT_NAME/
|
|
echo "Done"
|
|
|
|
cd $ROOT_DIR
|
|
fi
|
|
|
|
cd $OUTPUT_DIR
|
|
|
|
# Checksums, because who doesn't love checksums?!
|
|
md5=$(which md5 md5sum 2>/dev/null || true)
|
|
if [ -x $md5 ]; then
|
|
echo -n "Generating release checksums..."
|
|
for FILENAME in *.zip *.gz *.js; do
|
|
$md5 $FILENAME > $FILENAME.md5
|
|
echo -n "."
|
|
done
|
|
echo "Done"
|
|
else
|
|
echo "MD5 utility missing; cannot generate checksums"
|
|
fi
|
|
|
|
cd $ROOT_DIR
|
|
echo -n "Creating downloads archive..."
|
|
$tar -cf $OUTPUT_NAME.tar $OUTPUT_NAME/
|
|
echo "Done"
|
|
|
|
if [ "$USERNAME" == "" ]; then
|
|
echo "Build complete."
|
|
echo "Files are in: $OUTPUT_DIR"
|
|
echo "You did not provide a username so you will need to upload manually."
|
|
exit 0
|
|
fi
|
|
|
|
if [ $VERSION_EXISTS -eq 1 ]; then
|
|
echo "Please confirm build success, then press 'y' key to clean up archives"
|
|
echo "and upload, or any other key to bail."
|
|
else
|
|
echo "Please confirm build success, then press 'y' key to clean up archives, push"
|
|
echo "tags, and upload, or any other key to bail."
|
|
fi
|
|
read -p "> "
|
|
|
|
if [ "$REPLY" != "y" ]; then
|
|
echo "Aborted."
|
|
exit 0
|
|
fi
|
|
|
|
echo -n "Cleaning up archives..."
|
|
rm -rf $OUTPUT_DIR
|
|
if [ $CDN ]; then
|
|
rm -rf $CDN_OUTPUT_DIR
|
|
fi
|
|
echo "Done"
|
|
|
|
if [ $VERSION_EXISTS -eq 1 ]; then
|
|
echo "Skipping tag push, since tags already exist"
|
|
else
|
|
for REPO in $ALL_REPOS; do
|
|
cd $SOURCE_DIR/$REPO
|
|
echo "Pushing to repo $REPO"
|
|
git push origin $BRANCH
|
|
git push origin --tags
|
|
done
|
|
fi
|
|
|
|
cd $ROOT_DIR
|
|
|
|
HOST="$USERNAME@downloads.dojotoolkit.org"
|
|
|
|
echo "Copying to downloads.dojotoolkit.org..."
|
|
scp $OUTPUT_NAME.tar $HOST:/srv/www/vhosts.d/download.dojotoolkit.org
|
|
ssh $HOST "cd /srv/www/vhosts.d/download.dojotoolkit.org && tar -xf $OUTPUT_NAME.tar && rm $OUTPUT_NAME.tar"
|
|
|
|
if [ $CDN ]; then
|
|
echo "Copying to archive.dojotoolkit.org..."
|
|
scp $CDN_OUTPUT_NAME.tar $HOST:/srv/www/vhosts.d/archive.dojotoolkit.org/cdn
|
|
ssh $HOST "cd /srv/www/vhosts.d/archive.dojotoolkit.org/cdn && tar -xf $CDN_OUTPUT_NAME.tar && rm $CDN_OUTPUT_NAME.tar"
|
|
fi
|
|
|
|
echo "Upload complete. Please remember to update index.html."
|