这是indexloc提供的服务,不要输入任何密码
Skip to content

Adds support for Rolling Releases #357

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 136 commits into from
Jul 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
136 commits
Select commit Hold shift + click to select a range
797b9cd
start terraform provider
dimitropoulos Jun 3, 2025
6e9343b
wip: adding get delete
dimitropoulos Jun 5, 2025
9be0fbe
it compiles
dimitropoulos Jun 5, 2025
757452a
rename
dimitropoulos Jun 5, 2025
11ea650
[tf] feat: support for rolling release
brookemosby Jun 5, 2025
ae54c84
[rolling-release] add in docs
brookemosby Jun 6, 2025
ba41d20
[rolling-release] add in docs
brookemosby Jun 6, 2025
c1370d6
[rolling-release] add in docs
brookemosby Jun 6, 2025
53f04f3
Update resource_project_rolling_release.go
brookemosby Jun 6, 2025
2796b4b
fix error
dimitropoulos Jun 9, 2025
2bd5d9e
Merge remote-tracking branch 'origin/main' into dimitri/rolling-release
dimitropoulos Jun 9, 2025
717d6de
gofmt
dimitropoulos Jun 9, 2025
dab88e5
gofmt
dimitropoulos Jun 9, 2025
d4f277c
rr test
dimitropoulos Jun 10, 2025
e4172a6
fixes resource name
dimitropoulos Jun 10, 2025
2708ab1
resource name
dimitropoulos Jun 10, 2025
71edcef
removes test
dimitropoulos Jun 11, 2025
374a372
[rolling-release]
brookemosby Jun 11, 2025
5792285
removes doRequestWithResponse
dimitropoulos Jun 12, 2025
0b9b0d7
review
dimitropoulos Jun 12, 2025
3647bd7
more review
dimitropoulos Jun 12, 2025
10fcb76
review
dimitropoulos Jun 12, 2025
5031a0d
remove sorting
dimitropoulos Jun 12, 2025
b9dd027
add import.sh
dimitropoulos Jun 12, 2025
7fea6aa
eof
dimitropoulos Jun 12, 2025
935d69d
fix name
dimitropoulos Jun 12, 2025
206a8d1
eof
dimitropoulos Jun 12, 2025
6b272c6
update nil to empty array
dimitropoulos Jun 12, 2025
f29fde5
Update vercel/data_source_project_rolling_release.go
dimitropoulos Jun 12, 2025
0efd0a6
update TF prefix names
dimitropoulos Jun 12, 2025
92f0f0b
removes more validation
dimitropoulos Jun 12, 2025
96303ab
fix docs
dimitropoulos Jun 12, 2025
d263950
fix docs
dimitropoulos Jun 12, 2025
6a5c6b1
fix docs even harder
dimitropoulos Jun 12, 2025
bc4af5e
[rr] fix tests
brookemosby Jun 13, 2025
c298f7d
[rr]
brookemosby Jun 13, 2025
4efcb1c
[rr]
brookemosby Jun 13, 2025
6e1389c
Delete examples/resources/vercel_project_rolling_release/import.sh
brookemosby Jun 13, 2025
472eb7f
[rr]
brookemosby Jun 13, 2025
9f2ae2d
[rr]
brookemosby Jun 13, 2025
607fe39
[rr]
brookemosby Jun 13, 2025
65607d8
[rr]
brookemosby Jun 13, 2025
1d7d81c
[rr]
brookemosby Jun 13, 2025
87c4c99
[rr]
brookemosby Jun 13, 2025
b93fdf8
[rr]
brookemosby Jun 13, 2025
afd0809
Tweak and delete a load of stuff
dglsparsons Jun 13, 2025
9926350
More fixes
dglsparsons Jun 13, 2025
afbba0f
Update data_source_project_rolling_release_test.go
brookemosby Jun 13, 2025
6acb266
[rr]
brookemosby Jun 13, 2025
08370ec
[rr]
brookemosby Jun 13, 2025
5ec8a67
[rr]
brookemosby Jun 13, 2025
1562ef5
[rr]
brookemosby Jun 13, 2025
ed0fef6
[rr]
brookemosby Jun 13, 2025
3e90d29
Update examples/resources/vercel_project_rolling_release/resource.tf
brookemosby Jun 13, 2025
d58f6e3
[rr]
brookemosby Jun 13, 2025
9d249ac
Update project.go
brookemosby Jun 13, 2025
ddaec53
Merge remote-tracking branch 'origin/main' into dimitri/rolling-release
dimitropoulos Jun 17, 2025
65ba997
[rolling-release]
brookemosby Jun 17, 2025
305ca2b
[rolling-release]
brookemosby Jun 17, 2025
edead8f
[rolling-release]
brookemosby Jun 17, 2025
13c8964
[rolling-release]
brookemosby Jun 17, 2025
802c9a3
[rolling-release]
brookemosby Jun 17, 2025
2bd7a50
[rolling-release]
brookemosby Jun 17, 2025
f7313ee
[rolling-release]
brookemosby Jun 17, 2025
f4a07cb
[rolling-release]
brookemosby Jun 17, 2025
8d196ce
[rolling-release]
brookemosby Jun 17, 2025
81d7ca8
[rolling-release]
brookemosby Jun 17, 2025
3c65334
[rolling-release]
brookemosby Jun 17, 2025
2f401da
[rolling-release]
brookemosby Jun 17, 2025
ad6201f
[rolling-release]
brookemosby Jun 17, 2025
0d24b07
[rolling-release]
brookemosby Jun 17, 2025
687becd
[rolling-release]
brookemosby Jun 17, 2025
73d2393
[rr]
brookemosby Jun 24, 2025
fe6666d
[rr]
brookemosby Jun 24, 2025
ac876bd
[rr]
brookemosby Jun 24, 2025
b5987d6
[rr]
brookemosby Jun 24, 2025
5103354
[rr]
brookemosby Jun 24, 2025
a295628
[rr]
brookemosby Jun 24, 2025
904bac8
[rr]
brookemosby Jun 24, 2025
434d6ec
[rr]
brookemosby Jun 24, 2025
b777160
[rr]
brookemosby Jun 24, 2025
d8a1ab9
[rr]
brookemosby Jun 24, 2025
b2498b6
[rr]
brookemosby Jun 24, 2025
0d27bc1
[rr]
brookemosby Jun 24, 2025
44025ef
[rr]
brookemosby Jun 24, 2025
3d0f090
[rr]
brookemosby Jun 24, 2025
3a6b47c
[rr]
brookemosby Jun 24, 2025
c6cca05
[rr]
brookemosby Jun 24, 2025
8c0865e
[rolling-release]
brookemosby Jun 30, 2025
a14c59e
Merge branch 'main' into brooke/rr
brookemosby Jun 30, 2025
b499223
[rolling-release]
brookemosby Jun 30, 2025
7abbbb6
[rolling-release]
brookemosby Jun 30, 2025
9da99ff
[rolling-release]
brookemosby Jun 30, 2025
88cccf0
[rolling-release]
brookemosby Jun 30, 2025
313be6e
[rolling-release]
brookemosby Jun 30, 2025
0b49195
[rolling-release]
brookemosby Jun 30, 2025
368259f
[rolling-release]
brookemosby Jul 1, 2025
1eedbe1
[rolling-release]
brookemosby Jul 1, 2025
01c4a7c
[rolling-release]
brookemosby Jul 1, 2025
b4abf2d
[rolling-release]
brookemosby Jul 1, 2025
dc4e07c
[rolling-release]
brookemosby Jul 1, 2025
671cfa3
[rolling-release]
brookemosby Jul 1, 2025
58c2877
[rolling-release]
brookemosby Jul 1, 2025
e67363b
[rolling-release]
brookemosby Jul 1, 2025
132f2b9
[rolling-release]
brookemosby Jul 1, 2025
2449bbc
[rolling-release]
brookemosby Jul 1, 2025
b8e8428
[rolling-release]
brookemosby Jul 2, 2025
b02ea8b
[rolling-release]
brookemosby Jul 3, 2025
db79e93
removes rolling release item from project response
dimitropoulos Jul 21, 2025
e8d3607
remove enabled check
dimitropoulos Jul 21, 2025
4d6d9b2
use Description rather than MarkdownDescription
dimitropoulos Jul 21, 2025
a0692ca
remove loop sleep
dimitropoulos Jul 21, 2025
e78835b
remove added check
dimitropoulos Jul 21, 2025
a8847ab
removes comment
dimitropoulos Jul 21, 2025
75dbc74
remove diag handling
dimitropoulos Jul 21, 2025
8e1d521
actually use delete
dimitropoulos Jul 21, 2025
54b50ac
removes extra debug info
dimitropoulos Jul 21, 2025
c9ae422
remove duplication of check
dimitropoulos Jul 21, 2025
e12ba08
remove debugging line
dimitropoulos Jul 21, 2025
035aade
remove un-used state
brookemosby Jul 22, 2025
ed11f39
separate create from update
brookemosby Jul 22, 2025
29603cd
separate create from update
brookemosby Jul 22, 2025
696f005
separate create from update
brookemosby Jul 22, 2025
063a3ba
separate create from update
brookemosby Jul 22, 2025
ea5c904
separate create from update
brookemosby Jul 22, 2025
235eb42
separate create from update
brookemosby Jul 22, 2025
bab496f
separate create from update
brookemosby Jul 22, 2025
c4ddfda
separate create from update
brookemosby Jul 22, 2025
db33f2c
separate create from update
brookemosby Jul 22, 2025
0ab2c20
separate create from update
brookemosby Jul 22, 2025
d1cfe40
separate create from update
brookemosby Jul 22, 2025
cae6afd
separate create from update
brookemosby Jul 23, 2025
d882b22
test case fixes
brookemosby Jul 23, 2025
0a08f30
update docs
brookemosby Jul 23, 2025
a595d14
update test
brookemosby Jul 23, 2025
649a8a6
Update vercel/resource_project_rolling_release.go
brookemosby Jul 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
137 changes: 137 additions & 0 deletions client/project_rolling_release.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
package client

import (
"context"
"fmt"

"github.com/hashicorp/terraform-plugin-log/tflog"
)

// RollingReleaseStage represents a stage in a rolling release
type RollingReleaseStage struct {
TargetPercentage int `json:"targetPercentage"` // Required: 0-100
Duration *int `json:"duration,omitempty"` // Required for automatic advancement: 1-10000 minutes
RequireApproval bool `json:"requireApproval,omitempty"` // Only in response for manual-approval type
}

// RollingRelease represents the rolling release configuration
type RollingRelease struct {
Enabled bool `json:"enabled"` // Required
AdvancementType string `json:"advancementType"` // Required when enabled=true: 'automatic' or 'manual-approval'
Stages []RollingReleaseStage `json:"stages"` // Required when enabled=true: 2-10 stages
}

type RollingReleaseInfo struct {
RollingRelease RollingRelease `json:"rollingRelease"`
ProjectID string `json:"projectId"`
TeamID string `json:"teamId"`
}

// GetRollingRelease returns the rolling release for a given project.
func (c *Client) GetRollingRelease(ctx context.Context, projectID, teamID string) (RollingReleaseInfo, error) {
teamId := c.TeamID(teamID)
url := fmt.Sprintf("%s/v1/projects/%s/rolling-release/config?teamId=%s", c.baseURL, projectID, teamId)

var d RollingReleaseInfo
err := c.doRequest(clientRequest{
ctx: ctx,
method: "GET",
url: url,
}, &d)

if err != nil {
return RollingReleaseInfo{}, fmt.Errorf("error getting rolling-release: %w", err)
}

d.ProjectID = projectID
d.TeamID = teamId

return d, nil
}

// CreateRollingReleaseRequest defines the information that needs to be passed to Vercel in order to
// create a new rolling release.
type CreateRollingReleaseRequest struct {
RollingRelease RollingRelease `json:"rollingRelease"`
ProjectID string `json:"projectId"`
TeamID string `json:"teamId"`
}

// CreateRollingRelease will create a new rolling release for a given project.
func (c *Client) CreateRollingRelease(ctx context.Context, request CreateRollingReleaseRequest) (RollingReleaseInfo, error) {
request.TeamID = c.TeamID(request.TeamID)
enableRequest := map[string]any{
"enabled": true,
"advancementType": request.RollingRelease.AdvancementType,
"stages": request.RollingRelease.Stages,
}

var result RollingReleaseInfo
err := c.doRequest(clientRequest{
ctx: ctx,
method: "PATCH",
url: fmt.Sprintf("%s/v1/projects/%s/rolling-release/config?teamId=%s", c.baseURL, request.ProjectID, request.TeamID),
body: string(mustMarshal(enableRequest)),
}, &result)
if err != nil {
return RollingReleaseInfo{}, fmt.Errorf("error enabling rolling release: %w", err)
}

result.ProjectID = request.ProjectID
result.TeamID = request.TeamID
tflog.Info(ctx, "created rolling release", map[string]any{
"response": result,
"request": request,
})
return result, nil
}

// UpdateRollingReleaseRequest defines the information that needs to be passed to Vercel in order to
// update a rolling release.
type UpdateRollingReleaseRequest struct {
RollingRelease RollingRelease `json:"rollingRelease"`
ProjectID string `json:"projectId"`
TeamID string `json:"teamId"`
}

// UpdateRollingRelease will update an existing rolling release to the latest information.
func (c *Client) UpdateRollingRelease(ctx context.Context, request UpdateRollingReleaseRequest) (RollingReleaseInfo, error) {
request.TeamID = c.TeamID(request.TeamID)
enableRequest := map[string]any{
"enabled": true,
"advancementType": request.RollingRelease.AdvancementType,
"stages": request.RollingRelease.Stages,
}

var result RollingReleaseInfo
err := c.doRequest(clientRequest{
ctx: ctx,
method: "PATCH",
url: fmt.Sprintf("%s/v1/projects/%s/rolling-release/config?teamId=%s", c.baseURL, request.ProjectID, request.TeamID),
body: string(mustMarshal(enableRequest)),
}, &result)
if err != nil {
return RollingReleaseInfo{}, fmt.Errorf("error enabling rolling release: %w", err)
}

result.ProjectID = request.ProjectID
result.TeamID = request.TeamID
tflog.Info(ctx, "updated rolling release", map[string]any{
"response": result,
"request": request,
})
return result, nil
}

// DeleteRollingRelease will delete the rolling release for a given project.
func (c *Client) DeleteRollingRelease(ctx context.Context, projectID, teamID string) error {
teamId := c.TeamID(teamID)
url := fmt.Sprintf("%s/v1/projects/%s/rolling-release/config?teamId=%s", c.baseURL, projectID, teamId)

err := c.doRequest(clientRequest{
ctx: ctx,
method: "DELETE",
url: url,
}, nil)
return err
}
47 changes: 47 additions & 0 deletions docs/data-sources/project_rolling_release.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "vercel_project_rolling_release Data Source - terraform-provider-vercel"
subcategory: ""
description: |-
Data source for a Vercel project rolling release configuration.
---

# vercel_project_rolling_release (Data Source)

Data source for a Vercel project rolling release configuration.

## Example Usage

```terraform
data "vercel_project" "example" {
name = "example-project"
}

data "vercel_project_rolling_release" "example" {
project_id = data.vercel_project.example.id
}
```

<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `project_id` (String) The ID of the project.

### Optional

- `team_id` (String) The ID of the Vercel team.

### Read-Only

- `advancement_type` (String) The type of advancement for the rolling release. Either 'automatic' or 'manual-approval'.
- `stages` (Attributes List) The stages for the rolling release configuration. (see [below for nested schema](#nestedatt--stages))

<a id="nestedatt--stages"></a>
### Nested Schema for `stages`

Read-Only:

- `duration` (Number) The duration in minutes to wait before advancing to the next stage. Present for automatic advancement type.
- `target_percentage` (Number) The percentage of traffic to route to this stage.
57 changes: 57 additions & 0 deletions docs/resources/project_rolling_release.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "vercel_project_rolling_release Resource - terraform-provider-vercel"
subcategory: ""
description: |-
Resource for a Vercel project rolling release configuration.
---

# vercel_project_rolling_release (Resource)

Resource for a Vercel project rolling release configuration.

## Example Usage

```terraform
resource "vercel_project" "example" {
name = "example-project"
skew_protection = "12 hours"
}

resource "vercel_project_rolling_release" "example" {
project_id = vercel_project.example.id
advancement_type = "manual-approval"
stages = [
{
target_percentage = 20
},
{
target_percentage = 50
}
]
}
```

<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `advancement_type` (String) The type of advancement for the rolling release. Must be either 'automatic' or 'manual-approval'.
- `project_id` (String) The ID of the project.
- `stages` (Attributes List) The stages for the rolling release configuration. The last stage must have target_percentage = 100. (see [below for nested schema](#nestedatt--stages))

### Optional

- `team_id` (String) The ID of the Vercel team.

<a id="nestedatt--stages"></a>
### Nested Schema for `stages`

Required:

- `target_percentage` (Number) The percentage of traffic to route to this stage.

Optional:

- `duration` (Number) The duration in minutes to wait before advancing to the next stage. Required for automatic advancement type.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
data "vercel_project" "example" {
name = "example-project"
}

data "vercel_project_rolling_release" "example" {
project_id = data.vercel_project.example.id
}
17 changes: 17 additions & 0 deletions examples/resources/vercel_project_rolling_release/resource.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
resource "vercel_project" "example" {
name = "example-project"
skew_protection = "12 hours"
}

resource "vercel_project_rolling_release" "example" {
project_id = vercel_project.example.id
advancement_type = "manual-approval"
stages = [
{
target_percentage = 20
},
{
target_percentage = 50
}
]
}
Loading