Manifest File
A manifest file contains metadata for a group of accompanying files which are part of coherent unit. For example, the files of a computer program may have a manifest describing the name, version number, license and the constituent files of the program.
Manifests provide consistency and reproducibility, and can help you automate deploying apps. The manifest file can be read through JenkinsFile in Jenkins pipeline to automate the Jenkins deployment jobs.
Here I am going to show you how to create manifest files for PCF (Pivotal Cloud Foundry) based app.
Related Post:
Manifest Format
Manifest files are written in YAML files. The manifest illustrates some YAML conventions, such as, a version property specifies the schema version and this property in manifest file is optional. If not specified, the version property defaults to 1.
Let’s create a manifest file called manifest.yml in the project’s root directory with the following content:
---
version: 1
applications:
- name: service-api
target: https://api.dev.roytuts.com/
space: app-dev
organization: roytuts-com
disk_quota: 1024M
memory: 1024M
instances: 2
buildpacks:
- java-buildpack-openjdk-v4-49-1
stack: cflinuxfs3
routes:
- route: dev.roytuts.com/serviceapi-dev
services:
- svcmysql
env:
SPRING_PROFILE: dev
JAVA_OPTS: -Duser.timezone=America/New_York -Dappdynamics.http.proxyHost=proxy.roytuts.com -Dappdynamics.http.proxyPort=8080 -Dappdynamics.agent.applicationName=ServiceAPI -Dappdynamics.agent.tierName=service-api-dev
PROXY_HOST: proxy.roytuts.com
ssl_enabled: true
If you need to create multiple manifest files then you can create a folder (for example, manifest) under project’s root directory and create manifest files under this folder.
In the above manifest file, I have declared how much memory (RAM), disk space (disk_quota) I want to allocate for an application. The memory attribute to specify the memory limit for all instances of an app. This attribute requires a unit of measurement: M, MB, G, or GB, in upper case or lower case. Similarly, the disk_quota (disk space) attribute requires a unit of measurement: M, MB, G, or GB, in upper case or lower case.
I am also specifying how many instances (for example, 1, 2, 3, etc.) I want to start for the application. The instances attribute is used to set the number of app instances. The default number of instances is 1. To ensure that platform maintenance does not interrupt your app, run at least two instances.
I am also specifying Java Buildpack version for deploying the application into PCF environment. The java-buildpack is a Cloud Foundry buildpack for running JVM-based applications. It is designed to run many JVM-based applications (Grails, Groovy, Java Main, Play Framework, Spring Boot, and Servlet) with no additional configuration, but supports configuration of the standard components, and extension to add custom components.
You can add multiple buildpacks under buildpacks tag. For example:
...
buildpacks:
- java-buildpack-openjdk-v4-49-1
- java-buildpack-2
routes
attribute is used to provide multiple HTTP and TCP routes. Each route for this app is created if it does not already exist.
Optionally, specify the protocol
attribute to configure which network protocol the route uses for app ingress traffic. The available protocols are http2, http1, and tcp.
routes:
- route: example.com
protocol: http2
The stack
attribute is used to specify which stack to deploy your app to.
Apps can bind to services such as databases, messaging, and key-value stores.
Apps are deployed into App Spaces. An app can only bind to services instances that exist in the target App Space before the app is deployed.
The services block consists of a heading, then one or more service instance names.
Other property env and its sub-properties are also declared for specific purpose. The env
block consists of a heading, then one or more environment variable/value pairs. The variables belong to the container environment.
Add Variables to Manifest
You can use variables to create app manifests with values shared across all applicable environments in combination with references to environment-specific differences defined in separate files.
To add variables to an app manifest, do the following:
Create a file called vars.yml.
Add attributes to your vars.yml file. See the following example:
instances: 2
memory: 1G
Add the variables to your app manifest file using the following format: ((VARIABLE-NAME)).
---
applications:
- name: service-api
memory: ((memory))
instances: ((instances))
Configure Multiple Applications
You can use a single manifest file to configure multiple applications. For example, the following manifest file configures two applications which can be deployed in PCF environment.
---
applications:
- name: service
target: https://api.roytuts.com/
space: app-prod
organization: roytuts-com
disk_quota: 1024M
memory: 1024M
instances: 2
buildpacks:
- java-buildpack-openjdk-v4-49-1
stack: cflinuxfs3
routes:
- route: prod.roytuts.com/serviceapi-prod
path: /service/
services:
- svcmysql
env:
SPRING_PROFILE: prod
JAVA_OPTS: -Duser.timezone=America/New_York -Dappdynamics.http.proxyHost=proxy.roytuts.com -Dappdynamics.http.proxyPort=8080 -Dappdynamics.agent.applicationName=ServiceAPI -Dappdynamics.agent.tierName=service-api-prod
PROXY_HOST: proxy.roytuts.com
ssl_enabled: true
- name: ui
target: https://ui.roytuts.com/
space: ui-prod
organization: roytuts-com
disk_quota: 1024M
memory: 1024M
instances: 2
buildpacks:
- java-buildpack-openjdk-v4-49-1
stack: cflinuxfs3
routes:
- route: prod.roytuts.com/ui-prod
path: /ui/
env:
SPRING_PROFILE: prod
JAVA_OPTS: -Duser.timezone=America/New_York -Dappdynamics.http.proxyHost=proxy.roytuts.com -Dappdynamics.http.proxyPort=8080 -Dappdynamics.agent.applicationName=UI -Dappdynamics.agent.tierName=ui-prod
PROXY_HOST: proxy.roytuts.com
ssl_enabled: true
You need to add a path
line to each application description so that PCF will pick up the application from the correcrt location.
Minimize Duplications with YAML Anchors
In manifests where multiple apps share settings or services, you may see duplicated content. While the manifests still work, duplication increases the risk of typographical errors, which cause deployments to fail.
You can declare shared configuration using a YAML anchor, which the manifest refers to in app declarations by using an alias.
---
defaults: &defaults
buildpacks:
- java-buildpack-openjdk-v4-49-1
memory: 1G
instances: 2
disk_quota: 1024M
organization: roytuts-com
stack: cflinuxfs3
applications:
- name: service
target: https://api.roytuts.com/
space: app-prod
organization: roytuts-com
<<: *defaults
routes:
- route: prod.roytuts.com/serviceapi-prod
path: /service/
services:
- svcmysql
env:
SPRING_PROFILE: prod
JAVA_OPTS: -Duser.timezone=America/New_York -Dappdynamics.http.proxyHost=proxy.roytuts.com -Dappdynamics.http.proxyPort=8080 -Dappdynamics.agent.applicationName=ServiceAPI -Dappdynamics.agent.tierName=service-api-prod
PROXY_HOST: proxy.roytuts.com
ssl_enabled: true
- name: ui
target: https://ui.roytuts.com/
space: ui-prod
<<: *defaults
routes:
- route: prod.roytuts.com/ui-prod
path: /ui/
env:
SPRING_PROFILE: prod
JAVA_OPTS: -Duser.timezone=America/New_York -Dappdynamics.http.proxyHost=proxy.roytuts.com -Dappdynamics.http.proxyPort=8080 -Dappdynamics.agent.applicationName=UI -Dappdynamics.agent.tierName=ui-prod
PROXY_HOST: proxy.roytuts.com
ssl_enabled: true
This is how you can create manifest files in YAML/YML format for deploying your applications into PCF environment.