One source, many apps

Larry Garfield
Director of Developer Experience
23 Apr 2020

The flexibility of Platform.sh has always been one of its strong points. We want you to be able to build your application the way you want, focused on the details that do matter to you and not the details that don’t.

Today, we’re happy to announce a new articulation point: unified application definitions.

Unified what now?

Previously, you could put multiple discrete codebases in a single project if they together formed a coherent application. That could be a front-end and separate backend application, a main application and an API gateway, a main application and a dedicated queue worker, or many other configurations that our customers have come up with, all in different languages.

The requirement was that each application be defined by its own .platform.app.yaml file, and be in its own directory, along with the code that went with it. That precluded using the same codebase twice for different web-facing apps within the same project. We’ve long supported “worker” containers, which allow for the exact same build with a different start command, but not multiple web frontends or alternate builds.

So we fixed that.

.platform.app.yaml files can now specify a source.root parameter. It defaults to the directory the .platform.app.yaml file is in, but the parameter can be any directory in the project.

source:
    root: /path/to/code

That has two main benefits.

Submodules are easier

We’ve always supported Git submodules in projects, but the .platform.app.yaml file had to be in the main repository. That sometimes led to awkward file path configurations when using submodules.

Now, the .platform.app.yaml file still has to live in the main repository, but it can simply specify a source.root value of the path to the submodule. All other paths will be evaluated relative to that, making it much easier to configure.

Applications can reuse code

It also means multiple applications can use the same codebase. This becomes easier when paired with the new ability to put multiple application definitions into a single .platform/applications.yaml file. The applications.yaml file’s contents are a YAML array of application definitions, exactly the same as .platform.app.yaml. They can be as similar or different as you like, but can have the same source.root value.

For example, here’s an applications.yaml that creates two different application containers off of the same codebase stored in /mainapp. Each one has a different passthru value and name; the admin container will be forced to a “small” container as it will have less traffic. It also builds a Go application off an entirely separate codebase in /apiapp.

-  name: api
   type: golang:1.14
   source:
       root: apiapp
   hooks:
       build: |
           go build -o bin/app
   web:
       upstream:
           socket_family: tcp
           protocol: http
       commands:
           start: ./bin/app
       locations:
           /:
               allow: false
               passthru: true

-  name: main
   type: "php:7.4"
   source:
       root: mainapp
   web:
       locations:
           "/":
               root: "web"
               passthru: "/index.php"

-  name: admin
   type: "php:7.4"
   size: S
   source:
       root: mainapp
   web:
       locations:
           "/":
               root: "web"
               passthru: "/admin.php"

You’re welcome to vary the configuration even more if you prefer, even the build hook.

The result in this case will be three separate applications with unique names that you can route to from routes.yaml, all coming from the same source files on disk. The applications don’t have to be of the same type or version, as each will be built and deployed separately.

Go forth and be flexible

If any of that sounds exciting, you can start using it right away. applications.yaml is now available on all projects, so experiment and find new ways to build your dream application.