Cloud Foundry is an opinionated Platform-as-a-Service that allows you to manage applications at scale. It supports multiple infrastructure platforms, and is able to standardize deployment, logging, scaling, and routing in a way friendly to a continuous delivery pipeline.
This article is Part 1 of a series on Cloud Foundry concepts:
- Deploying the spring-music webapp, Part 1
- Persisting spring-music data using Postgres service, Part 2
- Scaling the spring-music webapp, Part 3
- Logging for the spring-music webapp, Part 4
- Monitoring the spring-music webapp, Part 5
In this particular article, we will install the command line interface for Cloud Foundry on Ubuntu and then use that to deploy the Spring Boot based spring-music project to a CF provider.
Selecting a Cloud Foundry Provider
For purposes of simplicity, I’m going to recommend you sign up for a free Cloud Foundry trial directly from Pivotal. Click here to start.
Pick an arbitrary name for your org, I choose “fleetest1”, and you should see something similar after you have verified your account and logged in.
Install Command Line Tool
Install the CF CLI which is a console based client application that communicates with the CF Cloud Controller hosted at Pivotal.
$ wget -q -O - https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | sudo apt-key add - $ echo "deb http://packages.cloudfoundry.org/debian stable main" | sudo tee /etc/apt/sources.list.d/cloudfoundry-cli.list $ sudo apt-get update $ sudo apt-get install cf-cli
Then verify the CLI version, which should look similar to below:
$ cf --version cf version 6.31.0+b35df905d.2017-09-15
Now authenticate into your remote Pivotal CF org using the command ‘cf login’. The API endpoint will by default point at ‘https://api.run.pivotal.io’ which is correct for Pivotal CF. If you were using another provider, you would need to use the ‘-a’ option to override the API endpoint.
$ cf login API endpoint: https://api.run.pivotal.io Email> email@example.com Password> Authenticating... OK Targeted org fleetest1 Targeted space development API endpoint: https://api.run.pivotal.io (API version: 2.98.0) User: firstname.lastname@example.org Org: fleetest1 Space: development
There are no applications currently loaded, so listing them with ‘cf apps’ results in an empty list.
$ cf apps Getting apps in org fleetest1 / space development as email@example.com... OK No apps found
The spring-music project is a Spring Boot project that allows a user to browse and modify a collection of music. By default it persists to an in-memory database, although it can very easily persist to Postgres, SQL Server, or Oracle.
In order to create the spring-music.jar that will be pushed to CloudFoundry, we need to build the project from source. The project requires Java8, so the first step is to install Java8 on our Ubuntu host.
$ sudo add-apt-repository ppa:openjdk-r/ppa -y $ sudo apt-get update $ sudo apt-cache policy openjdk-8-jdk $ sudo apt-get install openjdk-8-jdk -y $ sudo update-alternatives --config java $ sudo update-alternatives --config javac $ /usr/bin/java -version openjdk version "1.8.0_141" OpenJDK Runtime Environment (build 1.8.0_141-8u141-b15-3~14.04-b15) OpenJDK 64-Bit Server VM (build 25.141-b15, mixed mode)
Then we grab the source code of the project from github and assemble it using the included gradle scripts:
$ sudo apt-get install git -y $ git clone https://github.com/fabianlee/spring-music $ cd spring-music $ ./gradlew clean assemble ... BUILD SUCCESSFUL
This should result in a ‘build/libs/spring-music.jar’ file, which is used in the staging process by the buildpacks when creating the droplet.
The ‘manifest.yml’ file found in the root directory is used as the driving configuration for the CF push.
--- applications: - name: spring-music memory: 1G random-route: true path: build/libs/spring-music.jar
This simple manifest provides a name and the path of the spring-music.jar used in the staging process. The ‘random-route’ property makes sure that the deployment URL is unique by suffixing two random words to ensure uniqueness.
Go ahead and push the application:
$ cf push
You should see output saying that buildpacks and app packages are downloading and finally that the instance is starting. At the end you will see something similar to below:
Showing health and status for app spring-music in org fleetest1 / space development as firstname.lastname@example.org... OK requested state: started instances: 1/1 usage: 1G x 1 instances
urls: spring-music-unadmissive-schiffli.cfapps.iolast uploaded: Thu Nov 9 20:20:48 UTC 2017 stack: cflinuxfs2 buildpack: client-certificate-mapper=1.2.0_RELEASE container-security-provider=1.8.0_RELEASE java-buildpack=v4.5-offline-https://github.com/cloudfoundry/java-buildpack.git#ffeefb9 java-main java-opts jvmkill-agent=1.10.0_RELEASE open-jdk-like-jre=1.8.0_1... state since cpu memory disk details #0 running 2017-11-09 03:22:48 PM 94.9% 323.1M of 1G 171.3M of 1G
The last line tells us the service is running, and how much cpu/memory is being consumed by the application.
The ‘urls:’ line means that the application can be found at ‘https://spring-music-unadmissive-schiffli.cfapps.io’, which can be tested in the browser.
http://cli.cloudfoundry.org/en-US/cf/ (command reference)