Skip to content

Commit 3b8dbc0

Browse files
Merge branch 'coder:main' into feat/coder-login-secret
2 parents 47c2f16 + 3ff9cef commit 3b8dbc0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+717
-171
lines changed

.github/workflows/ci.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ jobs:
142142
143143
# Check for any typos
144144
- name: Check for typos
145-
uses: crate-ci/typos@v1.20.9
145+
uses: crate-ci/typos@v1.20.10
146146
with:
147147
config: .github/workflows/typos.toml
148148

@@ -909,7 +909,8 @@ jobs:
909909
uses: actions/checkout@v4
910910
- name: "Dependency Review"
911911
id: review
912-
uses: actions/dependency-review-action@v4
912+
# TODO: Replace this with the latest release once https://github.com/actions/dependency-review-action/pull/761 is merged.
913+
uses: actions/dependency-review-action@49fbbe0acb033b7824f26d00b005d7d598d76301
913914
with:
914915
allow-licenses: Apache-2.0, BSD-2-Clause, BSD-3-Clause, CC0-1.0, ISC, MIT, MIT-0, MPL-2.0
915916
allow-dependencies-licenses: "pkg:golang/github.com/pelletier/go-toml/v2"

.github/workflows/mlc_config.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
},
1818
{
1919
"pattern": "tailscale.com"
20+
},
21+
{
22+
"pattern": "wireguard.com"
2023
}
2124
],
2225
"aliveStatusCodes": [200, 0]

.github/workflows/release.yaml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,13 @@ jobs:
128128
- name: Setup Node
129129
uses: ./.github/actions/setup-node
130130

131+
# Necessary for signing Windows binaries.
132+
- name: Setup Java
133+
uses: actions/setup-java@v4
134+
with:
135+
distribution: "zulu"
136+
java-version: "11.0"
137+
131138
- name: Install nsis and zstd
132139
run: sudo apt-get install -y nsis zstd
133140

@@ -161,10 +168,32 @@ jobs:
161168
AC_CERTIFICATE_PASSWORD: ${{ secrets.AC_CERTIFICATE_PASSWORD }}
162169
AC_APIKEY_P8_BASE64: ${{ secrets.AC_APIKEY_P8_BASE64 }}
163170

171+
- name: Setup Windows EV Signing Certificate
172+
run: |
173+
set -euo pipefail
174+
touch /tmp/ev_cert.pem
175+
chmod 600 /tmp/ev_cert.pem
176+
echo "$EV_SIGNING_CERT" > /tmp/ev_cert.pem
177+
wget https://github.com/ebourg/jsign/releases/download/6.0/jsign-6.0.jar -O /tmp/jsign-6.0.jar
178+
env:
179+
EV_SIGNING_CERT: ${{ secrets.EV_SIGNING_CERT }}
180+
164181
- name: Test migrations from current ref to main
165182
run: |
166183
make test-migrations
167184
185+
# Setup GCloud for signing Windows binaries.
186+
- name: Authenticate to Google Cloud
187+
id: gcloud_auth
188+
uses: google-github-actions/auth@v2
189+
with:
190+
workload_identity_provider: ${{ secrets.GCP_CODE_SIGNING_WORKLOAD_ID_PROVIDER }}
191+
service_account: ${{ secrets.GCP_CODE_SIGNING_SERVICE_ACCOUNT }}
192+
token_format: "access_token"
193+
194+
- name: Setup GCloud SDK
195+
uses: "google-github-actions/setup-gcloud@v2"
196+
168197
- name: Build binaries
169198
run: |
170199
set -euo pipefail
@@ -179,16 +208,26 @@ jobs:
179208
build/coder_helm_"$version".tgz \
180209
build/provisioner_helm_"$version".tgz
181210
env:
211+
CODER_SIGN_WINDOWS: "1"
182212
CODER_SIGN_DARWIN: "1"
183213
AC_CERTIFICATE_FILE: /tmp/apple_cert.p12
184214
AC_CERTIFICATE_PASSWORD_FILE: /tmp/apple_cert_password.txt
185215
AC_APIKEY_ISSUER_ID: ${{ secrets.AC_APIKEY_ISSUER_ID }}
186216
AC_APIKEY_ID: ${{ secrets.AC_APIKEY_ID }}
187217
AC_APIKEY_FILE: /tmp/apple_apikey.p8
218+
EV_KEY: ${{ secrets.EV_KEY }}
219+
EV_KEYSTORE: ${{ secrets.EV_KEYSTORE }}
220+
EV_TSA_URL: ${{ secrets.EV_TSA_URL }}
221+
EV_CERTIFICATE_PATH: /tmp/ev_cert.pem
222+
GCLOUD_ACCESS_TOKEN: ${{ steps.gcloud_auth.outputs.access_token }}
223+
JSIGN_PATH: /tmp/jsign-6.0.jar
188224

189225
- name: Delete Apple Developer certificate and API key
190226
run: rm -f /tmp/{apple_cert.p12,apple_cert_password.txt,apple_apikey.p8}
191227

228+
- name: Delete Windows EV Signing Cert
229+
run: rm /tmp/ev_cert.pem
230+
192231
- name: Determine base image tag
193232
id: image-base-tag
194233
run: |

cli/cliui/parameter.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"github.com/coder/serpent"
1111
)
1212

13-
func RichParameter(inv *serpent.Invocation, templateVersionParameter codersdk.TemplateVersionParameter) (string, error) {
13+
func RichParameter(inv *serpent.Invocation, templateVersionParameter codersdk.TemplateVersionParameter, defaultOverrides map[string]string) (string, error) {
1414
label := templateVersionParameter.Name
1515
if templateVersionParameter.DisplayName != "" {
1616
label = templateVersionParameter.DisplayName
@@ -26,6 +26,11 @@ func RichParameter(inv *serpent.Invocation, templateVersionParameter codersdk.Te
2626
_, _ = fmt.Fprintln(inv.Stdout, " "+strings.TrimSpace(strings.Join(strings.Split(templateVersionParameter.DescriptionPlaintext, "\n"), "\n "))+"\n")
2727
}
2828

29+
defaultValue := templateVersionParameter.DefaultValue
30+
if v, ok := defaultOverrides[templateVersionParameter.Name]; ok {
31+
defaultValue = v
32+
}
33+
2934
var err error
3035
var value string
3136
if templateVersionParameter.Type == "list(string)" {
@@ -58,7 +63,7 @@ func RichParameter(inv *serpent.Invocation, templateVersionParameter codersdk.Te
5863
var richParameterOption *codersdk.TemplateVersionParameterOption
5964
richParameterOption, err = RichSelect(inv, RichSelectOptions{
6065
Options: templateVersionParameter.Options,
61-
Default: templateVersionParameter.DefaultValue,
66+
Default: defaultValue,
6267
HideSearch: true,
6368
})
6469
if err == nil {
@@ -69,7 +74,7 @@ func RichParameter(inv *serpent.Invocation, templateVersionParameter codersdk.Te
6974
} else {
7075
text := "Enter a value"
7176
if !templateVersionParameter.Required {
72-
text += fmt.Sprintf(" (default: %q)", templateVersionParameter.DefaultValue)
77+
text += fmt.Sprintf(" (default: %q)", defaultValue)
7378
}
7479
text += ":"
7580

@@ -87,7 +92,7 @@ func RichParameter(inv *serpent.Invocation, templateVersionParameter codersdk.Te
8792

8893
// If they didn't specify anything, use the default value if set.
8994
if len(templateVersionParameter.Options) == 0 && value == "" {
90-
value = templateVersionParameter.DefaultValue
95+
value = defaultValue
9196
}
9297

9398
return value, nil

cli/create.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,11 @@ func (r *RootCmd) create() *serpent.Command {
165165
return xerrors.Errorf("can't parse given parameter values: %w", err)
166166
}
167167

168+
cliBuildParameterDefaults, err := asWorkspaceBuildParameters(parameterFlags.richParameterDefaults)
169+
if err != nil {
170+
return xerrors.Errorf("can't parse given parameter defaults: %w", err)
171+
}
172+
168173
var sourceWorkspaceParameters []codersdk.WorkspaceBuildParameter
169174
if copyParametersFrom != "" {
170175
sourceWorkspaceParameters, err = client.WorkspaceBuildParameters(inv.Context(), sourceWorkspace.LatestBuild.ID)
@@ -178,8 +183,9 @@ func (r *RootCmd) create() *serpent.Command {
178183
TemplateVersionID: templateVersionID,
179184
NewWorkspaceName: workspaceName,
180185

181-
RichParameterFile: parameterFlags.richParameterFile,
182-
RichParameters: cliBuildParameters,
186+
RichParameterFile: parameterFlags.richParameterFile,
187+
RichParameters: cliBuildParameters,
188+
RichParameterDefaults: cliBuildParameterDefaults,
183189

184190
SourceWorkspaceParameters: sourceWorkspaceParameters,
185191
})
@@ -262,6 +268,7 @@ func (r *RootCmd) create() *serpent.Command {
262268
cliui.SkipPromptOption(),
263269
)
264270
cmd.Options = append(cmd.Options, parameterFlags.cliParameters()...)
271+
cmd.Options = append(cmd.Options, parameterFlags.cliParameterDefaults()...)
265272
return cmd
266273
}
267274

@@ -276,9 +283,10 @@ type prepWorkspaceBuildArgs struct {
276283
PromptBuildOptions bool
277284
BuildOptions []codersdk.WorkspaceBuildParameter
278285

279-
PromptRichParameters bool
280-
RichParameters []codersdk.WorkspaceBuildParameter
281-
RichParameterFile string
286+
PromptRichParameters bool
287+
RichParameters []codersdk.WorkspaceBuildParameter
288+
RichParameterFile string
289+
RichParameterDefaults []codersdk.WorkspaceBuildParameter
282290
}
283291

284292
// prepWorkspaceBuild will ensure a workspace build will succeed on the latest template version.
@@ -311,7 +319,8 @@ func prepWorkspaceBuild(inv *serpent.Invocation, client *codersdk.Client, args p
311319
WithBuildOptions(args.BuildOptions).
312320
WithPromptRichParameters(args.PromptRichParameters).
313321
WithRichParameters(args.RichParameters).
314-
WithRichParametersFile(parameterFile)
322+
WithRichParametersFile(parameterFile).
323+
WithRichParametersDefaults(args.RichParameterDefaults)
315324
buildParameters, err := resolver.Resolve(inv, args.Action, templateVersionParameters)
316325
if err != nil {
317326
return nil, err

cli/create_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,68 @@ func TestCreateWithRichParameters(t *testing.T) {
315315
<-doneChan
316316
})
317317

318+
t.Run("ParametersDefaults", func(t *testing.T) {
319+
t.Parallel()
320+
321+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
322+
owner := coderdtest.CreateFirstUser(t, client)
323+
member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
324+
version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses)
325+
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
326+
327+
template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID)
328+
329+
inv, root := clitest.New(t, "create", "my-workspace", "--template", template.Name,
330+
"--parameter-default", fmt.Sprintf("%s=%s", firstParameterName, firstParameterValue),
331+
"--parameter-default", fmt.Sprintf("%s=%s", secondParameterName, secondParameterValue),
332+
"--parameter-default", fmt.Sprintf("%s=%s", immutableParameterName, immutableParameterValue))
333+
clitest.SetupConfig(t, member, root)
334+
doneChan := make(chan struct{})
335+
pty := ptytest.New(t).Attach(inv)
336+
go func() {
337+
defer close(doneChan)
338+
err := inv.Run()
339+
assert.NoError(t, err)
340+
}()
341+
342+
matches := []string{
343+
firstParameterDescription, firstParameterValue,
344+
secondParameterDescription, secondParameterValue,
345+
immutableParameterDescription, immutableParameterValue,
346+
}
347+
for i := 0; i < len(matches); i += 2 {
348+
match := matches[i]
349+
defaultValue := matches[i+1]
350+
351+
pty.ExpectMatch(match)
352+
pty.ExpectMatch(`Enter a value (default: "` + defaultValue + `")`)
353+
pty.WriteLine("")
354+
}
355+
pty.ExpectMatch("Confirm create?")
356+
pty.WriteLine("yes")
357+
<-doneChan
358+
359+
// Verify that the expected default values were used.
360+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
361+
defer cancel()
362+
363+
workspaces, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{
364+
Name: "my-workspace",
365+
})
366+
require.NoError(t, err, "can't list available workspaces")
367+
require.Len(t, workspaces.Workspaces, 1)
368+
369+
workspaceLatestBuild := workspaces.Workspaces[0].LatestBuild
370+
require.Equal(t, version.ID, workspaceLatestBuild.TemplateVersionID)
371+
372+
buildParameters, err := client.WorkspaceBuildParameters(ctx, workspaceLatestBuild.ID)
373+
require.NoError(t, err)
374+
require.Len(t, buildParameters, 3)
375+
require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: firstParameterName, Value: firstParameterValue})
376+
require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: secondParameterName, Value: secondParameterValue})
377+
require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: immutableParameterName, Value: immutableParameterValue})
378+
})
379+
318380
t.Run("RichParametersFile", func(t *testing.T) {
319381
t.Parallel()
320382

cli/parameter.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,16 @@ type workspaceParameterFlags struct {
1818
promptBuildOptions bool
1919
buildOptions []string
2020

21-
richParameterFile string
22-
richParameters []string
21+
richParameterFile string
22+
richParameters []string
23+
richParameterDefaults []string
2324

2425
promptRichParameters bool
2526
}
2627

2728
func (wpf *workspaceParameterFlags) allOptions() []serpent.Option {
2829
options := append(wpf.cliBuildOptions(), wpf.cliParameters()...)
30+
options = append(options, wpf.cliParameterDefaults()...)
2931
return append(options, wpf.alwaysPrompt())
3032
}
3133

@@ -62,6 +64,17 @@ func (wpf *workspaceParameterFlags) cliParameters() []serpent.Option {
6264
}
6365
}
6466

67+
func (wpf *workspaceParameterFlags) cliParameterDefaults() []serpent.Option {
68+
return serpent.OptionSet{
69+
serpent.Option{
70+
Flag: "parameter-default",
71+
Env: "CODER_RICH_PARAMETER_DEFAULT",
72+
Description: `Rich parameter default values in the format "name=value".`,
73+
Value: serpent.StringArrayOf(&wpf.richParameterDefaults),
74+
},
75+
}
76+
}
77+
6578
func (wpf *workspaceParameterFlags) alwaysPrompt() serpent.Option {
6679
return serpent.Option{
6780
Flag: "always-prompt",

cli/parameterresolver.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ type ParameterResolver struct {
2626
lastBuildParameters []codersdk.WorkspaceBuildParameter
2727
sourceWorkspaceParameters []codersdk.WorkspaceBuildParameter
2828

29-
richParameters []codersdk.WorkspaceBuildParameter
30-
richParametersFile map[string]string
31-
buildOptions []codersdk.WorkspaceBuildParameter
29+
richParameters []codersdk.WorkspaceBuildParameter
30+
richParametersDefaults map[string]string
31+
richParametersFile map[string]string
32+
buildOptions []codersdk.WorkspaceBuildParameter
3233

3334
promptRichParameters bool
3435
promptBuildOptions bool
@@ -59,6 +60,16 @@ func (pr *ParameterResolver) WithRichParametersFile(fileMap map[string]string) *
5960
return pr
6061
}
6162

63+
func (pr *ParameterResolver) WithRichParametersDefaults(params []codersdk.WorkspaceBuildParameter) *ParameterResolver {
64+
if pr.richParametersDefaults == nil {
65+
pr.richParametersDefaults = make(map[string]string)
66+
}
67+
for _, p := range params {
68+
pr.richParametersDefaults[p.Name] = p.Value
69+
}
70+
return pr
71+
}
72+
6273
func (pr *ParameterResolver) WithPromptRichParameters(promptRichParameters bool) *ParameterResolver {
6374
pr.promptRichParameters = promptRichParameters
6475
return pr
@@ -227,7 +238,7 @@ func (pr *ParameterResolver) resolveWithInput(resolved []codersdk.WorkspaceBuild
227238
(action == WorkspaceUpdate && tvp.Mutable && tvp.Required) ||
228239
(action == WorkspaceUpdate && !tvp.Mutable && firstTimeUse) ||
229240
(tvp.Mutable && !tvp.Ephemeral && pr.promptRichParameters) {
230-
parameterValue, err := cliui.RichParameter(inv, tvp)
241+
parameterValue, err := cliui.RichParameter(inv, tvp, pr.richParametersDefaults)
231242
if err != nil {
232243
return nil, err
233244
}

cli/start.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,12 @@ func buildWorkspaceStartRequest(inv *serpent.Invocation, client *codersdk.Client
9999

100100
cliRichParameters, err := asWorkspaceBuildParameters(parameterFlags.richParameters)
101101
if err != nil {
102-
return codersdk.CreateWorkspaceBuildRequest{}, xerrors.Errorf("unable to parse build options: %w", err)
102+
return codersdk.CreateWorkspaceBuildRequest{}, xerrors.Errorf("unable to parse rich parameters: %w", err)
103+
}
104+
105+
cliRichParameterDefaults, err := asWorkspaceBuildParameters(parameterFlags.richParameterDefaults)
106+
if err != nil {
107+
return codersdk.CreateWorkspaceBuildRequest{}, xerrors.Errorf("unable to parse rich parameter defaults: %w", err)
103108
}
104109

105110
buildParameters, err := prepWorkspaceBuild(inv, client, prepWorkspaceBuildArgs{
@@ -108,11 +113,12 @@ func buildWorkspaceStartRequest(inv *serpent.Invocation, client *codersdk.Client
108113
NewWorkspaceName: workspace.Name,
109114
LastBuildParameters: lastBuildParameters,
110115

111-
PromptBuildOptions: parameterFlags.promptBuildOptions,
112-
BuildOptions: buildOptions,
113-
PromptRichParameters: parameterFlags.promptRichParameters,
114-
RichParameters: cliRichParameters,
115-
RichParameterFile: parameterFlags.richParameterFile,
116+
PromptBuildOptions: parameterFlags.promptBuildOptions,
117+
BuildOptions: buildOptions,
118+
PromptRichParameters: parameterFlags.promptRichParameters,
119+
RichParameters: cliRichParameters,
120+
RichParameterFile: parameterFlags.richParameterFile,
121+
RichParameterDefaults: cliRichParameterDefaults,
116122
})
117123
if err != nil {
118124
return codersdk.CreateWorkspaceBuildRequest{}, err

cli/testdata/coder_create_--help.golden

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ OPTIONS:
2020
--parameter string-array, $CODER_RICH_PARAMETER
2121
Rich parameter value in the format "name=value".
2222

23+
--parameter-default string-array, $CODER_RICH_PARAMETER_DEFAULT
24+
Rich parameter default values in the format "name=value".
25+
2326
--rich-parameter-file string, $CODER_RICH_PARAMETER_FILE
2427
Specify a file path with values for rich parameters defined in the
2528
template.

0 commit comments

Comments
 (0)