Skip to content

Commit 1f3f912

Browse files
committed
Merge branch 'main' into turn
2 parents ff99b40 + e5a1c30 commit 1f3f912

37 files changed

+810
-554
lines changed

.github/workflows/release.yaml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ on:
55
- "v*"
66
jobs:
77
goreleaser:
8-
runs-on: ubuntu-latest
8+
runs-on: macos-latest
99
steps:
1010
- uses: actions/checkout@v3
1111
with:
@@ -14,6 +14,17 @@ jobs:
1414
with:
1515
go-version: "~1.18"
1616

17+
- name: Install Gon
18+
run: |
19+
brew tap mitchellh/gon
20+
brew install mitchellh/gon/gon
21+
22+
- name: Import Signing Certificates
23+
uses: Apple-Actions/import-codesign-certs@v1
24+
with:
25+
p12-file-base64: ${{ secrets.AC_CERTIFICATE_P12_BASE64 }}
26+
p12-password: ${{ secrets.AC_CERTIFICATE_PASSWORD }}
27+
1728
- name: Echo Go Cache Paths
1829
id: go-cache-paths
1930
run: |
@@ -53,3 +64,5 @@ jobs:
5364
args: release --rm-dist
5465
env:
5566
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
67+
AC_USERNAME: ${{ secrets.AC_USERNAME }}
68+
AC_PASSWORD: ${{ secrets.AC_PASSWORD }}

.goreleaser.yaml

Lines changed: 58 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
11
archives:
2-
- id: coder
3-
builds:
4-
- coder
2+
- id: coder-linux
3+
builds: [coder-linux]
4+
format: tar
5+
files:
6+
- src: docs/README.md
7+
dst: README.md
8+
9+
- id: coder-darwin
10+
builds: [coder-darwin]
11+
format: zip
12+
files:
13+
- src: docs/README.md
14+
dst: README.md
15+
16+
- id: coder-windows
17+
builds: [coder-windows]
18+
format: zip
519
files:
620
- src: docs/README.md
721
dst: README.md
8-
format_overrides:
9-
- goos: windows
10-
format: zip
1122

1223
before:
1324
hooks:
@@ -27,15 +38,44 @@ builds:
2738
post: |
2839
cp {{.Path}} site/out/bin/coder-{{ .Os }}-{{ .Arch }}{{ trimprefix .Name "coder" }}
2940
30-
- id: coder
41+
- id: coder-linux
3142
dir: cmd/coder
32-
flags: ["-tags=embed"]
43+
flags: [-tags=embed]
3344
ldflags:
3445
["-s -w -X github.com/coder/coder/cli/buildinfo.tag={{ .Version }}"]
3546
env: [CGO_ENABLED=0]
36-
goos: [darwin, linux, windows]
47+
goos: [linux]
48+
goarch: [amd64, arm64]
49+
50+
- id: coder-windows
51+
dir: cmd/coder
52+
flags: [-tags=embed]
53+
ldflags:
54+
["-s -w -X github.com/coder/coder/cli/buildinfo.tag={{ .Version }}"]
55+
env: [CGO_ENABLED=0]
56+
goos: [windows]
3757
goarch: [amd64, arm64]
3858

59+
- id: coder-darwin
60+
dir: cmd/coder
61+
flags: [-tags=embed]
62+
ldflags:
63+
["-s -w -X github.com/coder/coder/cli/buildinfo.tag={{ .Version }}"]
64+
env: [CGO_ENABLED=0]
65+
goos: [darwin]
66+
goarch: [amd64, arm64]
67+
hooks:
68+
# This signs the binary that will be located inside the zip.
69+
# MacOS requires the binary to be signed for notarization.
70+
#
71+
# If it doesn't successfully sign, the zip sign step will error.
72+
post: |
73+
sh -c 'codesign -s {{.Env.AC_APPLICATION_IDENTITY}} -f -v --timestamp --options runtime {{.Path}} || true'
74+
75+
env:
76+
# Apple identity for signing!
77+
- AC_APPLICATION_IDENTITY=BDB050EB749EDD6A80C6F119BF1382ECA119CCCC
78+
3979
nfpms:
4080
- id: packages
4181
vendor: Coder
@@ -50,7 +90,7 @@ nfpms:
5090
suggests:
5191
- postgresql
5292
builds:
53-
- coder
93+
- coder-linux
5494
bindir: /usr/bin
5595
contents:
5696
- src: coder.env
@@ -60,7 +100,14 @@ nfpms:
60100
dst: /usr/lib/systemd/system/coder.service
61101

62102
release:
63-
ids: [coder, packages]
103+
ids: [coder-linux, coder-darwin, coder-windows, packages]
104+
105+
signs:
106+
- ids: [coder-darwin]
107+
artifacts: archive
108+
cmd: ./scripts/sign_macos.sh
109+
args: ["${artifact}"]
110+
output: true
64111

65112
snapshot:
66113
name_template: "{{ .Version }}-devel+{{ .ShortCommit }}"

Makefile

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ provisionersdk/proto: provisionersdk/proto/provisioner.proto
8888
./provisionersdk/proto/provisioner.proto
8989
.PHONY: provisionersdk/proto
9090

91-
release: site/out
92-
goreleaser release --snapshot --rm-dist
91+
release:
92+
goreleaser release --snapshot --rm-dist --skip-sign
9393
.PHONY: release
9494

9595
site/out:
@@ -102,4 +102,3 @@ site/out:
102102

103103
test:
104104
gotestsum -- -v -short ./...
105-

agent/agent.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ func (a *agent) handleSSHSession(session ssh.Session) error {
236236
if err != nil {
237237
return xerrors.Errorf("getting os executable: %w", err)
238238
}
239-
cmd.Env = append(cmd.Env, fmt.Sprintf(`GIT_SSH_COMMAND="%s gitssh --"`, executablePath))
239+
cmd.Env = append(cmd.Env, fmt.Sprintf(`GIT_SSH_COMMAND=%s gitssh --`, executablePath))
240240

241241
sshPty, windowSize, isPty := session.Pty()
242242
if isPty {

agent/agent_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func TestAgent(t *testing.T) {
5757
}
5858
output, err := session.Output(command)
5959
require.NoError(t, err)
60-
require.Contains(t, string(output), "gitssh --")
60+
require.True(t, strings.HasSuffix(strings.TrimSpace(string(output)), "gitssh --"))
6161
})
6262

6363
t.Run("SessionTTY", func(t *testing.T) {

cli/start.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,11 @@ func start() *cobra.Command {
6868
root := &cobra.Command{
6969
Use: "start",
7070
RunE: func(cmd *cobra.Command, args []string) error {
71+
logger := slog.Make(sloghuman.Sink(os.Stderr))
7172
if traceDatadog {
72-
tracer.Start()
73+
tracer.Start(tracer.WithLogStartup(false), tracer.WithLogger(&datadogLogger{
74+
logger: logger.Named("datadog"),
75+
}))
7376
defer tracer.Stop()
7477
}
7578

@@ -165,7 +168,6 @@ func start() *cobra.Command {
165168
return xerrors.Errorf("create turn server: %w", err)
166169
}
167170

168-
logger := slog.Make(sloghuman.Sink(os.Stderr))
169171
options := &coderd.Options{
170172
AccessURL: accessURLParsed,
171173
Logger: logger.Named("coderd"),
@@ -213,9 +215,10 @@ func start() *cobra.Command {
213215
}
214216
}
215217

218+
errCh := make(chan error, 1)
216219
provisionerDaemons := make([]*provisionerd.Server, 0)
217220
for i := 0; uint8(i) < provisionerDaemonCount; i++ {
218-
daemonClose, err := newProvisionerDaemon(cmd.Context(), client, logger, cacheDir)
221+
daemonClose, err := newProvisionerDaemon(cmd.Context(), client, logger, cacheDir, errCh)
219222
if err != nil {
220223
return xerrors.Errorf("create provisioner daemon: %w", err)
221224
}
@@ -227,7 +230,6 @@ func start() *cobra.Command {
227230
}
228231
}()
229232

230-
errCh := make(chan error, 1)
231233
shutdownConnsCtx, shutdownConns := context.WithCancel(cmd.Context())
232234
defer shutdownConns()
233235
go func() {
@@ -426,7 +428,7 @@ func createFirstUser(cmd *cobra.Command, client *codersdk.Client, cfg config.Roo
426428
return nil
427429
}
428430

429-
func newProvisionerDaemon(ctx context.Context, client *codersdk.Client, logger slog.Logger, cacheDir string) (*provisionerd.Server, error) {
431+
func newProvisionerDaemon(ctx context.Context, client *codersdk.Client, logger slog.Logger, cacheDir string, errChan chan error) (*provisionerd.Server, error) {
430432
err := os.MkdirAll(cacheDir, 0700)
431433
if err != nil {
432434
return nil, xerrors.Errorf("mkdir %q: %w", cacheDir, err)
@@ -442,7 +444,7 @@ func newProvisionerDaemon(ctx context.Context, client *codersdk.Client, logger s
442444
Logger: logger,
443445
})
444446
if err != nil {
445-
panic(err)
447+
errChan <- err
446448
}
447449
}()
448450

@@ -549,3 +551,11 @@ func configureTLS(listener net.Listener, tlsMinVersion, tlsClientAuth, tlsCertFi
549551

550552
return tls.NewListener(listener, tlsConfig), nil
551553
}
554+
555+
type datadogLogger struct {
556+
logger slog.Logger
557+
}
558+
559+
func (d *datadogLogger) Log(msg string) {
560+
d.logger.Debug(context.Background(), msg)
561+
}

cli/workspaceautostart.go

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cli
22

33
import (
44
"fmt"
5+
"os"
56
"time"
67

78
"github.com/spf13/cobra"
@@ -11,20 +12,16 @@ import (
1112
)
1213

1314
const autostartDescriptionLong = `To have your workspace build automatically at a regular time you can enable autostart.
14-
When enabling autostart, provide a schedule. This schedule is in cron format except only
15-
the following fields are allowed:
16-
- minute
17-
- hour
18-
- day of week
19-
20-
For example, to start your workspace every weekday at 9.30 am, provide the schedule '30 9 1-5'.`
15+
When enabling autostart, provide the minute, hour, and day(s) of week.
16+
The default schedule is at 09:00 in your local timezone (TZ env, UTC by default).
17+
`
2118

2219
func workspaceAutostart() *cobra.Command {
2320
autostartCmd := &cobra.Command{
24-
Use: "autostart enable <workspace> <schedule>",
21+
Use: "autostart enable <workspace>",
2522
Short: "schedule a workspace to automatically start at a regular time",
2623
Long: autostartDescriptionLong,
27-
Example: "coder workspaces autostart enable my-workspace '30 9 1-5'",
24+
Example: "coder workspaces autostart enable my-workspace --minute 30 --hour 9 --days 1-5 --tz Europe/Dublin",
2825
Hidden: true, // TODO(cian): un-hide when autostart scheduling implemented
2926
}
3027

@@ -35,22 +32,28 @@ func workspaceAutostart() *cobra.Command {
3532
}
3633

3734
func workspaceAutostartEnable() *cobra.Command {
38-
return &cobra.Command{
35+
// yes some of these are technically numbers but the cron library will do that work
36+
var autostartMinute string
37+
var autostartHour string
38+
var autostartDayOfWeek string
39+
var autostartTimezone string
40+
cmd := &cobra.Command{
3941
Use: "enable <workspace_name> <schedule>",
4042
ValidArgsFunction: validArgsWorkspaceName,
41-
Args: cobra.ExactArgs(2),
43+
Args: cobra.ExactArgs(1),
4244
RunE: func(cmd *cobra.Command, args []string) error {
4345
client, err := createClient(cmd)
4446
if err != nil {
4547
return err
4648
}
4749

48-
workspace, err := client.WorkspaceByName(cmd.Context(), codersdk.Me, args[0])
50+
spec := fmt.Sprintf("CRON_TZ=%s %s %s * * %s", autostartTimezone, autostartMinute, autostartHour, autostartDayOfWeek)
51+
validSchedule, err := schedule.Weekly(spec)
4952
if err != nil {
5053
return err
5154
}
5255

53-
validSchedule, err := schedule.Weekly(args[1])
56+
workspace, err := client.WorkspaceByName(cmd.Context(), codersdk.Me, args[0])
5457
if err != nil {
5558
return err
5659
}
@@ -67,6 +70,16 @@ func workspaceAutostartEnable() *cobra.Command {
6770
return nil
6871
},
6972
}
73+
74+
cmd.Flags().StringVar(&autostartMinute, "minute", "0", "autostart minute")
75+
cmd.Flags().StringVar(&autostartHour, "hour", "9", "autostart hour")
76+
cmd.Flags().StringVar(&autostartDayOfWeek, "days", "1-5", "autostart day(s) of week")
77+
tzEnv := os.Getenv("TZ")
78+
if tzEnv == "" {
79+
tzEnv = "UTC"
80+
}
81+
cmd.Flags().StringVar(&autostartTimezone, "tz", tzEnv, "autostart timezone")
82+
return cmd
7083
}
7184

7285
func workspaceAutostartDisable() *cobra.Command {

0 commit comments

Comments
 (0)