diff --git a/Dockerfile b/Dockerfile index 88ff09f6..f817d593 100644 --- a/Dockerfile +++ b/Dockerfile @@ -467,6 +467,21 @@ ENV PATH "$PATH:/opt/buildhome/.dotnet" ENV DOTNET_ROOT "/opt/buildhome/.dotnet" #populate local package cache RUN dotnet new + + +################################################################################ +# +# Swift +# +################################################################################ +USER buildbot +ENV NETLIFY_BUILD_SWIFT_VERSION 5.2 +ENV SWIFTENV_ROOT "/opt/buildhome/.swiftenv" +RUN git clone --depth 1 https://github.com/kylef/swiftenv.git "$SWIFTENV_ROOT" +ENV PATH "$SWIFTENV_ROOT/bin:$SWIFTENV_ROOT/shims:$PATH" +RUN swiftenv install ${NETLIFY_BUILD_SWIFT_VERSION} +RUN swift --version + WORKDIR / # Cleanup diff --git a/included_software.md b/included_software.md index 7666f271..565a1370 100644 --- a/included_software.md +++ b/included_software.md @@ -24,6 +24,9 @@ The specific patch versions included will depend on when the image was last buil * 7.4 * Go - `GO_VERSION` * 1.12 (default) +* Swift - `SWIFT_VERSION`, `.swift-version` + * 5.2 (default) + * Any version that `swiftenv` can install newer than `4.x`. Versions `4.x` and below will not work due to incompatible shared libraries. * Java * 8 (default) * Emacs diff --git a/run-build-functions.sh b/run-build-functions.sh index 04f7987e..68d855a8 100755 --- a/run-build-functions.sh +++ b/run-build-functions.sh @@ -17,6 +17,7 @@ export GIMME_CGO_ENABLED=true export NVM_DIR="$HOME/.nvm" export RVM_DIR="$HOME/.rvm" +export SWIFTENV_ROOT="${SWIFTENV_ROOT:-${HOME}/.swiftenv}" # Pipenv configuration export PIPENV_RUNTIME=2.7 @@ -32,6 +33,7 @@ NC="\033[0m" # No Color # language versions mkdir -p $NETLIFY_CACHE_DIR/node_version mkdir -p $NETLIFY_CACHE_DIR/ruby_version +mkdir -p $NETLIFY_CACHE_DIR/swift_version # pwd caches mkdir -p $NETLIFY_CACHE_DIR/node_modules @@ -39,6 +41,7 @@ mkdir -p $NETLIFY_CACHE_DIR/.bundle mkdir -p $NETLIFY_CACHE_DIR/bower_components mkdir -p $NETLIFY_CACHE_DIR/.venv mkdir -p $NETLIFY_CACHE_DIR/wapm_packages +mkdir -p $NETLIFY_CACHE_DIR/.build # HOME caches mkdir -p $NETLIFY_CACHE_DIR/.yarn_cache @@ -162,6 +165,7 @@ install_dependencies() { local defaultYarnVersion=$3 local defaultPHPVersion=$4 local installGoVersion=$5 + local defaultSwiftVersion=$6 # Python Version if [ -f runtime.txt ] @@ -401,6 +405,48 @@ install_dependencies() { fi fi + # Swift Version + : ${SWIFT_VERSION="$defaultSwiftVersion"} + if [ -f .swift-version ] + then + SWIFT_VERSION=$(cat .swift-version) + echo "Attempting Swift version '$SWIFT_VERSION' from .swift-version" + fi + + swiftenv global ${SWIFT_VERSION} > /dev/null 2>&1 + export CUSTOM_SWIFT=$? + + if [ -d $NETLIFY_CACHE_DIR/swift_version/$SWIFT_VERSION ] + then + echo "Started restoring cached Swift version" + rm -rf $SWIFTENV_ROOT/versions/$SWIFT_VERSION + cp -p -r $NETLIFY_CACHE_DIR/swift_version/${SWIFT_VERSION} $SWIFTENV_ROOT/versions/ + swiftenv rehash + echo "Finished restoring cached Swift version" + fi + + if swiftenv install -s $SWIFT_VERSION + then + echo "Using Swift version $SWIFT_VERSION" + else + echo "Failed to install Swift version '$SWIFT_VERSION'" + exit 1 + fi + + # SPM dependencies + if [ -f Package.swift ] + then + echo "Building Swift Package" + restore_cwd_cache ".build" "swift build" + if swift build + then + echo "Swift package Built" + else + echo "Error building Swift package" + exit 1 + fi + fi + # NPM Dependencies : ${YARN_VERSION="$defaultYarnVersion"} @@ -627,7 +673,8 @@ cache_artifacts() { cache_cwd_directory "bower_components" "bower components" cache_cwd_directory "node_modules" "node modules" cache_cwd_directory ".venv" "python virtualenv" - cache_cwd_directory "wapm_packages", "wapm packages" + cache_cwd_directory "wapm_packages" "wapm packages" + cache_cwd_directory ".build" "swift build" cache_home_directory ".yarn_cache" "yarn cache" cache_home_directory ".cache" "pip cache" @@ -669,6 +716,20 @@ cache_artifacts() { else rm -rf $NETLIFY_CACHE_DIR/ruby_version fi + + # cache the version of Swift installed + if [[ "$CUSTOM_SWIFT" -ne "0" ]] + then + if ! [ -d $NETLIFY_CACHE_DIR/swift_version/$SWIFT_VERSION ] + then + rm -rf $NETLIFY_CACHE_DIR/swift_version + mkdir $NETLIFY_CACHE_DIR/swift_version + mv $SWIFTENV_ROOT/versions/$SWIFT_VERSION $NETLIFY_CACHE_DIR/swift_version/ + echo "Cached Swift version $SWIFT_VERSION" + fi + else + rm -rf $NETLIFY_CACHE_DIR/swift_version + fi } move_cache() { diff --git a/run-build.sh b/run-build.sh index f3f9558d..996d06b2 100755 --- a/run-build.sh +++ b/run-build.sh @@ -23,9 +23,10 @@ cd $NETLIFY_REPO_DIR : ${YARN_VERSION="1.13.0"} : ${PHP_VERSION="5.6"} : ${GO_VERSION="1.12"} +: ${SWIFT_VERSION="5.2"} echo "Installing dependencies" -install_dependencies $NODE_VERSION $RUBY_VERSION $YARN_VERSION $PHP_VERSION $GO_VERSION +install_dependencies $NODE_VERSION $RUBY_VERSION $YARN_VERSION $PHP_VERSION $GO_VERSION $SWIFT_VERSION echo "Installing missing commands" install_missing_commands diff --git a/test-tools/start-image.sh b/test-tools/start-image.sh index 63b7857e..7b155881 100755 --- a/test-tools/start-image.sh +++ b/test-tools/start-image.sh @@ -11,6 +11,7 @@ docker run --rm -t -i \ -e HUGO_VERSION \ -e PHP_VERSION \ -e GO_VERSION \ + -e SWIFT_VERSION \ -v ${REPO_PATH}:/opt/repo \ -v ${BASE_PATH}/run-build.sh:/usr/local/bin/build \ -v ${BASE_PATH}/run-build-functions.sh:/usr/local/bin/run-build-functions.sh \ diff --git a/test-tools/test-build.sh b/test-tools/test-build.sh index 4c6e53bc..e69dede6 100755 --- a/test-tools/test-build.sh +++ b/test-tools/test-build.sh @@ -23,6 +23,7 @@ fi : ${HUGO_VERSION="0.54.0"} : ${PHP_VERSION="5.6"} : ${GO_VERSION="1.12"} +: ${SWIFT_VERSION="5.2"} BASE_PATH=$(pwd) REPO_PATH="$(cd $1 && pwd)" @@ -51,6 +52,7 @@ docker run --rm \ -e NETLIFY_VERBOSE \ -e GO_VERSION \ -e GO_IMPORT_PATH \ + -e SWIFT_VERSION \ -v "${REPO_PATH}:/opt/repo" \ -v "${BASE_PATH}/run-build.sh:/usr/local/bin/build" \ -v "${BASE_PATH}/run-build-functions.sh:/usr/local/bin/run-build-functions.sh" \