Deploy Meteor 2.1 IBM Cloud Foundry

I’ve been trying to deploy to IBM Cloud Foundry for some time. Using Mongo and passing some Settings in METEOR_SETTINGS. Someone managed to put together a script to create a build and deploy pipeline.

shell build

#!/bin/bash
METEOR_HOME=.meteor/local
PATH=$METEOR_HOME/usr/bin:$METEOR_HOME/usr/lib/meteor/bin:PATH indent() { c='s/^/ /' case (uname) in
Darwin) sed -l “$c”;; # mac/bsd sed: -l buffers on line boundaries
) sed -u "c";; # unix/gnu sed: -u unbuffered (arbitrary) chunks of data esac } status() { echo "-----> "
}
install_meteor() {
status “Installing Meteor (ignore any warnings about launcher scripts)”
export PATH=/usr/bin:$PATH # necessary for install script to run from URL
curl https://install.meteor.com | sh
status “Updating PATH with Meteor”
PATH=$HOME/.meteor:$PATH
}
build() {
(
status “Building meteor bundle”
meteor npm install
meteor build $ARCHIVE_DIR --directory --server-only --architecture os.linux.x86_64
status “Installing dependencies”
cd $ARCHIVE_DIR/bundle/programs/server/
npm install
cd …/…/
chmod -R +w+x *
mkdir $WORKSPACE/$ARCHIVE_DIR/bin
cp $WORKSPACE/bin/* $WORKSPACE/$ARCHIVE_DIR/bin/
status “Build complete”
)
}
install_meteor
build

It works correctly.

Now in the deployment pipeline, I don’t know if it’s correct, but I can’t implement it

shell pipeline deploy

#!/bin/bash

Grab jq path for later and set execute permission

DIR=( cd "( dirname “${BASH_SOURCE[0]}” )" && pwd )
jq=$DIR/bin/jq
chmod +x $jq

Source code is located in the ‘bundle’ directory - let’s go there

cd bundle

Create a basic package file - we just need the meteor-node-stubs package

cat <<-JSON > package.json
{
“name”: “bundle”,
“version”: “1.0.0”,
“main”: “main.js”,
“dependencies”: {
“meteor-node-stubs”: “^0.2.11”
},
“scripts”: {
“start”: “node main.js”
}
}
JSON

Push to Bluemix but don’t start just yet…

cf push “${CF_APP}” --no-start -b nodejs_buildpack -m 256M --no-manifest

Bind the MongoDB service

- MONGO_SERVICE environment variable is required

if [ -z “{MONGO_SERVICE}" ]; then echo "Set the MONGO_SERVICE environment variable to the name of the MongoDB service" exit 1 else cf bind-service "{CF_APP}” “${MONGO_SERVICE}”
fi

Grab the application guid for later

GUID=cf curl /v2/apps?q=name:${CF_APP} | $jq -r '.resources[0].metadata.guid'

Set the MongoDB URL

- assumes the Bluemix provided “compose-for-mongodb” service is used

MONGO_URL=cf curl /v2/apps/${GUID}/env | $jq -r '.system_env_json.VCAP_SERVICES["compose-for-mongodb"][0].credentials.uri'
cf set-env “{CF_APP}" MONGO_URL "{MONGO_URL}”

Set the Root URL

ROOT_URL=cf curl /v2/apps/${GUID}/env | $jq -r '.application_env_json.VCAP_APPLICATION.uris[0]'
ROOT_URL=“https://ROOT_URL" cf set-env "{CF_APP}” ROOT_URL “${ROOT_URL}”

Restage and start

cf restage “{CF_APP}" cf start "{CF_APP}”