Quick Start

This walkthrough gets you from zero to a running Lagoon project in about five minutes. By the end you will have a Lagoon project, an environment, and a runtime variable managed by Pulumi.

Step 1: Install the SDK

pip install pulumi-lagoon

See Installation for TypeScript, Go, and .NET install commands.

Step 2: Create a New Pulumi Project

mkdir my-lagoon-infra && cd my-lagoon-infra
pulumi new python

For other runtimes, replace python with typescript, go, or csharp.

Step 3: Configure the Provider

pulumi config set lagoon:apiUrl https://api.lagoon.example.com/graphql
pulumi config set lagoon:token <your-jwt-token> --secret

Step 4: Write Your Infrastructure Code

Replace the generated entry point with the following. The example creates a project, a production environment, and a database host variable.

import pulumi
import pulumi_lagoon as lagoon

project = lagoon.Project("my-site",
    lagoon.ProjectArgs(
        name="my-drupal-site",
        git_url="git@github.com:org/repo.git",
        deploytarget_id=1,
        production_environment="main",
        branches="^(main|develop|stage)$",
    )
)

pulumi.export("deploy_key", project.public_key)

prod_env = lagoon.Environment("production",
    lagoon.EnvironmentArgs(
        name="main",
        project_id=project.lagoon_id,
        deploy_type="branch",
        deploy_base_ref="main",
        environment_type="production",
    )
)

db_host = lagoon.Variable("db-host",
    lagoon.VariableArgs(
        name="DATABASE_HOST",
        value="mysql.production.example.com",
        project_id=project.lagoon_id,
        environment_id=prod_env.lagoon_id,
        scope="runtime",
    )
)

pulumi.export("project_id", project.lagoon_id)
pulumi.export("production_url", prod_env.route)
import * as pulumi from "@pulumi/pulumi";
import * as lagoon from "@tag1consulting/pulumi-lagoon";

const project = new lagoon.Project("my-site", {
    name: "my-drupal-site",
    gitUrl: "git@github.com:org/repo.git",
    deploytargetId: 1,
    productionEnvironment: "main",
    branches: "^(main|develop|stage)$",
});

export const deployKey = project.publicKey;

const prodEnv = new lagoon.Environment("production", {
    name: "main",
    projectId: project.lagoonId,
    deployType: "branch",
    deployBaseRef: "main",
    environmentType: "production",
});

const dbHost = new lagoon.Variable("db-host", {
    name: "DATABASE_HOST",
    value: "mysql.production.example.com",
    projectId: project.lagoonId,
    environmentId: prodEnv.lagoonId,
    scope: "runtime",
});

export const projectId = project.lagoonId;
package main

import (
    "github.com/pulumi/pulumi/sdk/v3/go/pulumi"
    lagoon "github.com/tag1consulting/pulumi-lagoon-provider/sdk/go/lagoon/lagoon"
)

func main() {
    pulumi.Run(func(ctx *pulumi.Context) error {
        project, err := lagoon.NewProject(ctx, "my-site", &lagoon.ProjectArgs{
            Name:                  pulumi.String("my-drupal-site"),
            GitUrl:                pulumi.String("git@github.com:org/repo.git"),
            DeploytargetId:        pulumi.Int(1),
            ProductionEnvironment: pulumi.String("main"),
            Branches:              pulumi.StringPtr("^(main|develop|stage)$"),
        })
        if err != nil {
            return err
        }

        ctx.Export("deployKey", project.PublicKey)

        prodEnv, err := lagoon.NewEnvironment(ctx, "production", &lagoon.EnvironmentArgs{
            Name:            pulumi.String("main"),
            ProjectId:       project.LagoonId,
            DeployType:      pulumi.String("branch"),
            DeployBaseRef:   pulumi.StringPtr("main"),
            EnvironmentType: pulumi.String("production"),
        })
        if err != nil {
            return err
        }

        _, err = lagoon.NewVariable(ctx, "db-host", &lagoon.VariableArgs{
            Name:          pulumi.String("DATABASE_HOST"),
            Value:         pulumi.String("mysql.production.example.com"),
            ProjectId:     project.LagoonId,
            EnvironmentId: prodEnv.LagoonId,
            Scope:         pulumi.String("runtime"),
        })
        if err != nil {
            return err
        }

        ctx.Export("projectId", project.LagoonId)
        return nil
    })
}
using System.Collections.Generic;
using Pulumi;
using Tag1Consulting.Lagoon.Lagoon;

return await Deployment.RunAsync(() =>
{
    var project = new Project("my-site", new ProjectArgs
    {
        Name = "my-drupal-site",
        GitUrl = "git@github.com:org/repo.git",
        DeploytargetId = 1,
        ProductionEnvironment = "main",
        Branches = "^(main|develop|stage)$",
    });

    var prodEnv = new Environment("production", new EnvironmentArgs
    {
        Name = "main",
        ProjectId = project.LagoonId,
        DeployType = "branch",
        DeployBaseRef = "main",
        EnvironmentType = "production",
    });

    var dbHost = new Variable("db-host", new VariableArgs
    {
        Name = "DATABASE_HOST",
        Value = "mysql.production.example.com",
        ProjectId = project.LagoonId,
        EnvironmentId = prodEnv.LagoonId,
        Scope = "runtime",
    });

    return new Dictionary<string, object?>
    {
        ["projectId"] = project.LagoonId,
        ["deployKey"] = project.PublicKey,
    };
});

Step 5: Deploy

pulumi up

Pulumi shows a preview of the resources it will create and prompts for confirmation. After you confirm, it creates the project, environment, and variable in Lagoon.

The deploy_key output is the SSH deploy key Lagoon generated for the project. Copy it and add it to your Git repository so that Lagoon can clone the code during deployments.

Next Steps

  • Resources — Full reference for all 18 provider resources
  • Importing Resources — Bring existing Lagoon resources under Pulumi management
  • Guides — Task-oriented walkthroughs for common scenarios