---
title: Cloud FoundryのRevision/Rollbackを試す
tags: ["Cloud Foundry", "PAS", "CFAR", "Pivotal Application Service"]
categories: ["Dev", "PaaS", "CloudFoundry"]
date: 2019-06-30T08:14:09Z
updated: 2019-06-30T08:14:09Z
---

Cloud Foundryに追加されたRevision/Rollback機能を試してみます。

https://docs.cloudfoundry.org/devguide/revisions.html

Droplet (コンテナイメージ)のRevision管理が可能になり、
特定のRevisionへのロールバックが可能になります。

Pivotal Application Serviceでは2.6から利用可能です。

次の環境で動作確認しています。

```
$ cf curl /v2/info
{
   "name": "Pivotal Application Service",
   "build": "2.6.0-build.214",
   "support": "https://support.pivotal.io",
   "version": 0,
   "description": "https://docs.pivotal.io/pivotalcf/2-6/pcf-release-notes/runtime-rn.html",
   "authorization_endpoint": "https://login.run.pcfone.io",
   "token_endpoint": "https://uaa.run.pcfone.io",
   "min_cli_version": "6.23.0",
   "min_recommended_cli_version": "6.23.0",
   "app_ssh_endpoint": "ssh.run.pcfone.io:2222",
   "app_ssh_host_key_fingerprint": "62:b2:73:9c:c1:c7:4f:c9:79:0c:62:ec:a1:9a:f9:b0",
   "app_ssh_oauth_client": "ssh-proxy",
   "doppler_logging_endpoint": "wss://doppler.run.pcfone.io:443",
   "api_version": "2.135.0",
   "osbapi_version": "2.14",
   "routing_endpoint": "https://api.run.pcfone.io/routing",
   "user": "fe4bac5f-d5e6-488c-b05e-ad3d220066ad"
}
```

サンプルアプリのレポジトリは[こちら](https://github.com/making/demo-revision)です。

```
cf push --no-start
```

Revision機能を有効にします。

```
APP_NAME=rev
cf curl /v3/apps/$(cf app ${APP_NAME} --guid)/features/revisions -X PATCH -d '{"enabled": true}'
cf start ${APP_NAME}
```

![image](https://user-images.githubusercontent.com/106908/60381572-e38b3f80-9a91-11e9-90b4-15864f3e3388.png)

Revision一覧を確認します。

```
$ cf curl /v3/apps/$(cf app ${APP_NAME} --guid)/revisions | jq -r '.resources[] | {version, description, guid}'
{
  "version": 1,
  "description": "Initial revision.",
  "guid": "7443df40-a8ed-4b6a-b065-6e1bcc8f546d"
}
```

デプロイされているRevisionを確認します。

```
$ cf curl /v3/apps/$(cf app ${APP_NAME} --guid)/revisions/deployed | jq -r '.resources[] | {version, description, guid}'
{
  "version": 1,
  "description": "Initial revision.",
  "guid": "7443df40-a8ed-4b6a-b065-6e1bcc8f546d"
}
```

Revision2をデプロイます。

```
git checkout rev2
cf push
```

![image](https://user-images.githubusercontent.com/106908/60381521-0ec15f00-9a91-11e9-9f49-5c0abc93f7b2.png)

Revision一覧を確認します。

```
$ cf curl /v3/apps/$(cf app ${APP_NAME} --guid)/revisions | jq -r '.resources[] | {version, description, guid}'
{
  "version": 1,
  "description": "Initial revision.",
  "guid": "7443df40-a8ed-4b6a-b065-6e1bcc8f546d"
}
{
  "version": 2,
  "description": "New droplet deployed.",
  "guid": "90a63693-cc28-402c-b9dc-46bdb86cb1ae"
}
```

デプロイされているRevisionを確認します。

```
$ cf curl /v3/apps/$(cf app ${APP_NAME} --guid)/revisions/deployed | jq -r '.resources[] | {version, description, guid}'
{
  "version": 2,
  "description": "New droplet deployed.",
  "guid": "90a63693-cc28-402c-b9dc-46bdb86cb1ae"
}
```

Revision3をデプロイます。

```
git checkout rev3
cf push
```

![image](https://user-images.githubusercontent.com/106908/60381430-cb1a2580-9a8f-11e9-8e33-6211c6c33449.png)

Revision一覧を確認します。

```
$ cf curl /v3/apps/$(cf app ${APP_NAME} --guid)/revisions | jq -r '.resources[] | {version, description, guid}'
{
  "version": 1,
  "description": "Initial revision.",
  "guid": "7443df40-a8ed-4b6a-b065-6e1bcc8f546d"
}
{
  "version": 2,
  "description": "New droplet deployed.",
  "guid": "90a63693-cc28-402c-b9dc-46bdb86cb1ae"
}
{
  "version": 3,
  "description": "New droplet deployed.",
  "guid": "ccc4f0bc-1dd6-4e7f-b0ff-88e596ba9bce"
}
```

デプロイされているRevisionを確認します。

```
$ cf curl /v3/apps/$(cf app ${APP_NAME} --guid)/revisions/deployed | jq -r '.resources[] | {version, description, guid}'
{
  "version": 3,
  "description": "New droplet deployed.",
  "guid": "ccc4f0bc-1dd6-4e7f-b0ff-88e596ba9bce"
}
```

Revision2へロールバックします。

```
REV_VESION=2
REV_GUID=$(cf curl /v3/apps/$(cf app ${APP_NAME} --guid)/revisions | jq -r ".resources[] | select(.version == ${REV_VESION}) | .guid")
cf curl /v3/deployments -X POST -d "{\"relationships\":{\"app\":{\"data\":{\"guid\":\"$(cf app ${APP_NAME} --guid)\"}}},\"revision\":{\"guid\":\"${REV_GUID}\"}}"
```

![image](https://user-images.githubusercontent.com/106908/60381521-0ec15f00-9a91-11e9-9f49-5c0abc93f7b2.png)

Revision一覧を確認します。

```
$ cf curl /v3/apps/$(cf app ${APP_NAME} --guid)/revisions | jq -r '.resources[] | {version, description, guid}'
{
  "version": 1,
  "description": "Initial revision.",
  "guid": "7443df40-a8ed-4b6a-b065-6e1bcc8f546d"
}
{
  "version": 2,
  "description": "New droplet deployed.",
  "guid": "90a63693-cc28-402c-b9dc-46bdb86cb1ae"
}
{
  "version": 3,
  "description": "New droplet deployed.",
  "guid": "ccc4f0bc-1dd6-4e7f-b0ff-88e596ba9bce"
}
{
  "version": 4,
  "description": "Rolled back to revision 2.",
  "guid": "efc86d6c-f6f5-467e-af99-f75045836d83"
}
```

デプロイされているRevisionを確認します。

```
$ cf curl /v3/apps/$(cf app ${APP_NAME} --guid)/revisions/deployed | jq -r '.resources[] | {version, description, guid}'
{
  "version": 4,
  "description": "Rolled back to revision 2.",
  "guid": "efc86d6c-f6f5-467e-af99-f75045836d83"
}
```

---

Rollbackできました。
Revisionがあっても保存可能なDropletの数は限られているので注意。
RollbackはRolling Updateになっているように見えました。
