Skip to content

Commit 917dfef

Browse files
committed
Merge branch 'main' into oauth
2 parents f7b8238 + c8246e3 commit 917dfef

Some content is hidden

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

63 files changed

+2204
-683
lines changed

.github/workflows/coder.yaml

+15-4
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,21 @@ jobs:
7676
runs-on: ubuntu-latest
7777
steps:
7878
- uses: actions/checkout@v3
79+
80+
- name: Cache Node
81+
id: cache-node
82+
uses: actions/cache@v3
83+
with:
84+
path: |
85+
**/node_modules
86+
.eslintcache
87+
key: js-${{ runner.os }}-test-${{ hashFiles('**/yarn.lock') }}
88+
restore-keys: |
89+
js-${{ runner.os }}-
90+
91+
- name: Install node_modules
92+
run: ./scripts/yarn_install.sh
93+
7994
- name: Install Protoc
8095
uses: arduino/setup-protoc@v1
8196
with:
@@ -169,10 +184,6 @@ jobs:
169184
terraform_version: 1.1.2
170185
terraform_wrapper: false
171186

172-
- name: Install socat
173-
if: runner.os == 'Linux'
174-
run: sudo apt-get install -y socat
175-
176187
- name: Test with Mock Database
177188
shell: bash
178189
env:

.github/workflows/release.yaml

+14-1
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

+58-11
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 }}"

.vscode/settings.json

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
"trimprefix",
5858
"unconvert",
5959
"Untar",
60+
"VMID",
6061
"webrtc",
6162
"xerrors",
6263
"yamux"

Makefile

+8-4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ coderd/database/generate: fmt/sql coderd/database/dump.sql $(wildcard coderd/dat
1919
coderd/database/generate.sh
2020
.PHONY: coderd/database/generate
2121

22+
apitypings/generate: site/src/api/types.ts
23+
go run scripts/apitypings/main.go > site/src/api/types-generated.ts
24+
cd site && yarn run format:types
25+
.PHONY: apitypings/generate
26+
2227
fmt/prettier:
2328
@echo "--- prettier"
2429
# Avoid writing files in CI to reduce file write activity
@@ -48,7 +53,7 @@ fmt/terraform: $(wildcard *.tf)
4853
fmt: fmt/prettier fmt/sql fmt/terraform
4954
.PHONY: fmt
5055

51-
gen: coderd/database/generate peerbroker/proto provisionersdk/proto provisionerd/proto
56+
gen: coderd/database/generate peerbroker/proto provisionersdk/proto provisionerd/proto apitypings/generate
5257
.PHONY: gen
5358

5459
install: bin
@@ -88,8 +93,8 @@ provisionersdk/proto: provisionersdk/proto/provisioner.proto
8893
./provisionersdk/proto/provisioner.proto
8994
.PHONY: provisionersdk/proto
9095

91-
release: site/out
92-
goreleaser release --snapshot --rm-dist
96+
release:
97+
goreleaser release --snapshot --rm-dist --skip-sign
9398
.PHONY: release
9499

95100
site/out:
@@ -102,4 +107,3 @@ site/out:
102107

103108
test:
104109
gotestsum -- -v -short ./...
105-

agent/agent.go

+21-22
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,23 @@ type Options struct {
3232
Logger slog.Logger
3333
}
3434

35-
type Dialer func(ctx context.Context, options *peer.ConnOptions) (*peerbroker.Listener, error)
35+
type Dialer func(ctx context.Context, logger slog.Logger) (*peerbroker.Listener, error)
3636

37-
func New(dialer Dialer, options *peer.ConnOptions) io.Closer {
37+
func New(dialer Dialer, logger slog.Logger) io.Closer {
3838
ctx, cancelFunc := context.WithCancel(context.Background())
3939
server := &agent{
40-
clientDialer: dialer,
41-
options: options,
42-
closeCancel: cancelFunc,
43-
closed: make(chan struct{}),
40+
dialer: dialer,
41+
logger: logger,
42+
closeCancel: cancelFunc,
43+
closed: make(chan struct{}),
4444
}
4545
server.init(ctx)
4646
return server
4747
}
4848

4949
type agent struct {
50-
clientDialer Dialer
51-
options *peer.ConnOptions
50+
dialer Dialer
51+
logger slog.Logger
5252

5353
connCloseWait sync.WaitGroup
5454
closeCancel context.CancelFunc
@@ -64,18 +64,18 @@ func (a *agent) run(ctx context.Context) {
6464
// An exponential back-off occurs when the connection is failing to dial.
6565
// This is to prevent server spam in case of a coderd outage.
6666
for retrier := retry.New(50*time.Millisecond, 10*time.Second); retrier.Wait(ctx); {
67-
peerListener, err = a.clientDialer(ctx, a.options)
67+
peerListener, err = a.dialer(ctx, a.logger)
6868
if err != nil {
6969
if errors.Is(err, context.Canceled) {
7070
return
7171
}
7272
if a.isClosed() {
7373
return
7474
}
75-
a.options.Logger.Warn(context.Background(), "failed to dial", slog.Error(err))
75+
a.logger.Warn(context.Background(), "failed to dial", slog.Error(err))
7676
continue
7777
}
78-
a.options.Logger.Info(context.Background(), "connected")
78+
a.logger.Info(context.Background(), "connected")
7979
break
8080
}
8181
select {
@@ -90,7 +90,7 @@ func (a *agent) run(ctx context.Context) {
9090
if a.isClosed() {
9191
return
9292
}
93-
a.options.Logger.Debug(ctx, "peer listener accept exited; restarting connection", slog.Error(err))
93+
a.logger.Debug(ctx, "peer listener accept exited; restarting connection", slog.Error(err))
9494
a.run(ctx)
9595
return
9696
}
@@ -105,10 +105,9 @@ func (a *agent) handlePeerConn(ctx context.Context, conn *peer.Conn) {
105105
go func() {
106106
select {
107107
case <-a.closed:
108-
_ = conn.Close()
109108
case <-conn.Closed():
110109
}
111-
<-conn.Closed()
110+
_ = conn.Close()
112111
a.connCloseWait.Done()
113112
}()
114113
for {
@@ -117,15 +116,15 @@ func (a *agent) handlePeerConn(ctx context.Context, conn *peer.Conn) {
117116
if errors.Is(err, peer.ErrClosed) || a.isClosed() {
118117
return
119118
}
120-
a.options.Logger.Debug(ctx, "accept channel from peer connection", slog.Error(err))
119+
a.logger.Debug(ctx, "accept channel from peer connection", slog.Error(err))
121120
return
122121
}
123122

124123
switch channel.Protocol() {
125124
case "ssh":
126125
go a.sshServer.HandleConn(channel.NetConn())
127126
default:
128-
a.options.Logger.Warn(ctx, "unhandled protocol from channel",
127+
a.logger.Warn(ctx, "unhandled protocol from channel",
129128
slog.F("protocol", channel.Protocol()),
130129
slog.F("label", channel.Label()),
131130
)
@@ -145,7 +144,7 @@ func (a *agent) init(ctx context.Context) {
145144
if err != nil {
146145
panic(err)
147146
}
148-
sshLogger := a.options.Logger.Named("ssh-server")
147+
sshLogger := a.logger.Named("ssh-server")
149148
forwardHandler := &ssh.ForwardedTCPHandler{}
150149
a.sshServer = &ssh.Server{
151150
ChannelHandlers: map[string]ssh.ChannelHandler{
@@ -158,7 +157,7 @@ func (a *agent) init(ctx context.Context) {
158157
Handler: func(session ssh.Session) {
159158
err := a.handleSSHSession(session)
160159
if err != nil {
161-
a.options.Logger.Warn(ctx, "ssh session failed", slog.Error(err))
160+
a.logger.Warn(ctx, "ssh session failed", slog.Error(err))
162161
_ = session.Exit(1)
163162
return
164163
}
@@ -194,15 +193,15 @@ func (a *agent) init(ctx context.Context) {
194193
"sftp": func(session ssh.Session) {
195194
server, err := sftp.NewServer(session)
196195
if err != nil {
197-
a.options.Logger.Debug(session.Context(), "initialize sftp server", slog.Error(err))
196+
a.logger.Debug(session.Context(), "initialize sftp server", slog.Error(err))
198197
return
199198
}
200199
defer server.Close()
201200
err = server.Serve()
202201
if errors.Is(err, io.EOF) {
203202
return
204203
}
205-
a.options.Logger.Debug(session.Context(), "sftp server exited with error", slog.Error(err))
204+
a.logger.Debug(session.Context(), "sftp server exited with error", slog.Error(err))
206205
},
207206
},
208207
}
@@ -237,7 +236,7 @@ func (a *agent) handleSSHSession(session ssh.Session) error {
237236
if err != nil {
238237
return xerrors.Errorf("getting os executable: %w", err)
239238
}
240-
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))
241240

242241
sshPty, windowSize, isPty := session.Pty()
243242
if isPty {
@@ -250,7 +249,7 @@ func (a *agent) handleSSHSession(session ssh.Session) error {
250249
for win := range windowSize {
251250
err = ptty.Resize(uint16(win.Width), uint16(win.Height))
252251
if err != nil {
253-
a.options.Logger.Warn(context.Background(), "failed to resize tty", slog.Error(err))
252+
a.logger.Warn(context.Background(), "failed to resize tty", slog.Error(err))
254253
}
255254
}
256255
}()

agent/agent_test.go

+4-6
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) {
@@ -170,11 +170,9 @@ func setupSSHSession(t *testing.T) *ssh.Session {
170170

171171
func setupAgent(t *testing.T) *agent.Conn {
172172
client, server := provisionersdk.TransportPipe()
173-
closer := agent.New(func(ctx context.Context, opts *peer.ConnOptions) (*peerbroker.Listener, error) {
174-
return peerbroker.Listen(server, nil, opts)
175-
}, &peer.ConnOptions{
176-
Logger: slogtest.Make(t, nil).Leveled(slog.LevelDebug),
177-
})
173+
closer := agent.New(func(ctx context.Context, logger slog.Logger) (*peerbroker.Listener, error) {
174+
return peerbroker.Listen(server, nil)
175+
}, slogtest.Make(t, nil).Leveled(slog.LevelDebug))
178176
t.Cleanup(func() {
179177
_ = client.Close()
180178
_ = server.Close()

0 commit comments

Comments
 (0)