---
title: World Simplest BOSH Release (New BOSH CLI version)
tags: ["BOSH", "BOSH-Lite", "English"]
categories: ["Dev", "Infrastructure", "BOSH"]
date: 2017-01-23T15:59:05Z
updated: 2017-06-04T15:45:59Z
---

**⚠️ This article is [new BOSH CLI](https://github.com/cloudfoundry/bosh-cli) version of [this one](https://blog.ik.am/entries/399)**.

I'd like to show how to create smallest [BOSH](http://bosh.io) release from scratch.

I've tested with bosh-lite created in [this article](https://blog.ik.am/entries/404).

```
$ bosh -version
version 0.0.147-ba602d1-2017-01-11T20:05:06Z
```

**Table of Contents**
<!-- toc -->

### Create a project

```
bosh init-release --dir=simple-http-server-boshrelease --git
cd simple-http-server-boshrelease
```

### Create a job

```
bosh generate-job simple-http-server
```

Create `jobs/simple-http-server/templates/ctl.erb`:

``` bash
#!/bin/bash

JOB_NAME=simple-http-server
RUN_DIR=/var/vcap/sys/run/$JOB_NAME
LOG_DIR=/var/vcap/sys/log/$JOB_NAME
PIDFILE=${RUN_DIR}/pid
PORT=<%= p("server.port") %>

case $1 in

  start)
    mkdir -p $RUN_DIR $LOG_DIR
    chown -R vcap:vcap $RUN_DIR $LOG_DIR

    cp /var/vcap/packages/$JOB_NAME/index.html .
    echo $$ > $PIDFILE
    exec chpst -u vcap:vcap python -m SimpleHTTPServer $PORT \
         >>$LOG_DIR/$JOB_NAME.log 2>&1

    ;;

  stop)
    kill -9 `cat $PIDFILE`
    rm -f $PIDFILE

    ;;

  *)
    echo "Usage: ctl {start|stop}" ;;

esac
```

Create `jobs/simple-http-server/spec`:

``` yaml
---
name: simple-http-server
templates:
  ctl.erb: bin/ctl
packages:
properties:
  server.port:
    description: "Port on which server is listening"
    default: 8080
```

Create `jobs/simple-http-server/monit`:

```
check process simple-http-server
  with pidfile /var/vcap/sys/run/simple-http-server/pid
  start program "/var/vcap/jobs/simple-http-server/bin/ctl start"
  stop program "/var/vcap/jobs/simple-http-server/bin/ctl stop"
  group vcap
```

### Create a package

```
bosh generate-package simple-http-server
```

Create source files:

```
mkdir src/simple-http-server
echo 'Hello BOSH!' > src/simple-http-server/index.html
```

Create `packages/simple-http-server/packaging`:

```
# abort script on any command that exits with a non zero value
set -e -x

cp -a simple-http-server/index.html $BOSH_INSTALL_TARGET
```

Create `packages/simple-http-server/spec`:

```
---
name: simple-http-server

dependencies:

files:
- simple-http-server/index.html
```

Then update `jobs/simple-http-server/spec`:

``` yaml
---
name: simple-http-server
templates:
  ctl.erb: bin/ctl
packages:
- simple-http-server
properties:
  server.port:
    description: "Port on which server is listening"
    default: 8080
```

### Create and Upload a release

Create `config/final.yml`:

```
---
blobstore:
  provider: local
  options:
    blobstore_path: /tmp/simple-http-server
final_name: simple-http-server
```

and

```
bosh create-release --name=simple-http-server --force && bosh -e vbox upload-release
```

### Create a manifest

```
mkdir manifest
```

Create `manifest/simple-http-server.yml`:

``` yaml
---
name: simple-http-server

releases:
- name: simple-http-server
  version: latest

stemcells:
- os: ubuntu-trusty
  alias: ubuntu
  version: latest

instance_groups:
- name: simple-http-server
  jobs:
  - name: simple-http-server
    release: simple-http-server
    properties:
      server:
        port: 8080
  instances: 1
  stemcell: ubuntu
  azs: [z1]
  vm_type: default
  persistent_disk_type: default
  networks:
  - name: default

update:
  canaries: 1
  max_in_flight: 3
  canary_watch_time: 30000-600000
  update_watch_time: 5000-600000
```

### Deploy a cluster

Finally,

```
bosh -e vbox -n -d simple-http-server deploy manifest/manifest.yml
```

You can see the deployed VM(s):

```
$ bosh -e vbox vms
Using environment '192.168.50.6' as client 'admin'

Task 19. Done

Deployment 'simple-http-server'

Instance                                                 Process State  AZ  IPs         VM CID                                VM Type  
simple-http-server/7b1b17a4-7dc6-4362-bbce-70fff4098aba  running        z1  10.244.0.3  f7b7df10-a93f-4282-47cf-c2040413c640  default  

1 vms

Succeeded  
```

Hit the http server:

```
$ curl 10.244.0.3:8080
Hello BOSH!
```
