Skip to content

Commit 81716fb

Browse files
committed
Merge branch 'main' into dean/disable-password-auth
2 parents eb97214 + 968d7e4 commit 81716fb

File tree

27 files changed

+745
-92
lines changed

27 files changed

+745
-92
lines changed

.github/workflows/stale.yaml

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
name: Stale Issue Cron
1+
name: Stale Issue and Branch Cleanup
22
on:
33
schedule:
44
# Every day at midnight
55
- cron: "0 0 * * *"
66
workflow_dispatch:
77
jobs:
8-
stale:
8+
issues:
99
runs-on: ubuntu-latest
1010
permissions:
1111
issues: write
@@ -32,3 +32,17 @@ jobs:
3232
operations-per-run: 60
3333
# Start with the oldest issues, always.
3434
ascending: true
35+
branches:
36+
runs-on: ubuntu-latest
37+
steps:
38+
- name: Checkout repository
39+
uses: actions/checkout@v2
40+
- name: Run delete-old-branches-action
41+
uses: beatlabs/delete-old-branches-action@v0.0.9
42+
with:
43+
repo_token: ${{ github.token }}
44+
date: "6 months ago"
45+
dry_run: false
46+
delete_tags: false
47+
# extra_protected_branch_regex: ^(foo|bar)$
48+
exclude_open_pr_branches: true

cli/templateinit.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cli
22

33
import (
4+
"bytes"
45
"fmt"
56
"os"
67
"path/filepath"
@@ -70,7 +71,7 @@ func templateInit() *cobra.Command {
7071
if err != nil {
7172
return err
7273
}
73-
err = provisionersdk.Untar(directory, archive)
74+
err = provisionersdk.Untar(directory, bytes.NewReader(archive))
7475
if err != nil {
7576
return err
7677
}

cli/templatepush.go

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cli
22

33
import (
4+
"bufio"
45
"fmt"
56
"io"
67
"os"
@@ -34,14 +35,17 @@ func (pf *templateUploadFlags) stdin() bool {
3435

3536
func (pf *templateUploadFlags) upload(cmd *cobra.Command, client *codersdk.Client) (*codersdk.UploadResponse, error) {
3637
var (
37-
content []byte
38-
err error
38+
content io.Reader
39+
pipeErrCh = make(chan error, 1)
3940
)
4041
if pf.stdin() {
41-
content, err = io.ReadAll(cmd.InOrStdin())
42+
content = cmd.InOrStdin()
43+
// No piping if reading from stdin.
44+
pipeErrCh <- nil
45+
close(pipeErrCh)
4246
} else {
4347
prettyDir := prettyDirectoryPath(pf.directory)
44-
_, err = cliui.Prompt(cmd, cliui.PromptOptions{
48+
_, err := cliui.Prompt(cmd, cliui.PromptOptions{
4549
Text: fmt.Sprintf("Upload %q?", prettyDir),
4650
IsConfirm: true,
4751
Default: cliui.ConfirmYes,
@@ -50,10 +54,16 @@ func (pf *templateUploadFlags) upload(cmd *cobra.Command, client *codersdk.Clien
5054
return nil, err
5155
}
5256

53-
content, err = provisionersdk.Tar(pf.directory, provisionersdk.TemplateArchiveLimit)
54-
}
55-
if err != nil {
56-
return nil, xerrors.Errorf("read tar: %w", err)
57+
pipeReader, pipeWriter := io.Pipe()
58+
go func() {
59+
defer pipeWriter.Close()
60+
defer close(pipeErrCh)
61+
bufWr := bufio.NewWriter(pipeWriter)
62+
defer bufWr.Flush()
63+
pipeErrCh <- provisionersdk.Tar(bufWr, pf.directory, provisionersdk.TemplateArchiveLimit)
64+
}()
65+
defer pipeReader.Close()
66+
content = pipeReader
5767
}
5868

5969
spin := spinner.New(spinner.CharSets[5], 100*time.Millisecond)
@@ -66,6 +76,9 @@ func (pf *templateUploadFlags) upload(cmd *cobra.Command, client *codersdk.Clien
6676
if err != nil {
6777
return nil, xerrors.Errorf("upload: %w", err)
6878
}
79+
if err = <-pipeErrCh; err != nil {
80+
return nil, xerrors.Errorf("pipe: %w", err)
81+
}
6982
return &resp, nil
7083
}
7184

coderd/coderdtest/authorize.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package coderdtest
22

33
import (
4+
"bytes"
45
"context"
56
"fmt"
67
"io"
@@ -384,7 +385,7 @@ func NewAuthTester(ctx context.Context, t *testing.T, client *codersdk.Client, a
384385
template := CreateTemplate(t, client, admin.OrganizationID, version.ID)
385386
workspace := CreateWorkspace(t, client, admin.OrganizationID, template.ID)
386387
AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
387-
file, err := client.Upload(ctx, codersdk.ContentTypeTar, make([]byte, 1024))
388+
file, err := client.Upload(ctx, codersdk.ContentTypeTar, bytes.NewReader(make([]byte, 1024)))
388389
require.NoError(t, err, "upload file")
389390
workspace, err = client.Workspace(ctx, workspace.ID)
390391
require.NoError(t, err, "workspace resources")

coderd/coderdtest/coderdtest.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ func CreateTemplateVersion(t *testing.T, client *codersdk.Client, organizationID
525525
t.Helper()
526526
data, err := echo.Tar(res)
527527
require.NoError(t, err)
528-
file, err := client.Upload(context.Background(), codersdk.ContentTypeTar, data)
528+
file, err := client.Upload(context.Background(), codersdk.ContentTypeTar, bytes.NewReader(data))
529529
require.NoError(t, err)
530530
templateVersion, err := client.CreateTemplateVersion(context.Background(), organizationID, codersdk.CreateTemplateVersionRequest{
531531
FileID: file.ID,
@@ -572,7 +572,7 @@ func CreateTemplate(t *testing.T, client *codersdk.Client, organization uuid.UUI
572572
func UpdateTemplateVersion(t *testing.T, client *codersdk.Client, organizationID uuid.UUID, res *echo.Responses, templateID uuid.UUID) codersdk.TemplateVersion {
573573
data, err := echo.Tar(res)
574574
require.NoError(t, err)
575-
file, err := client.Upload(context.Background(), codersdk.ContentTypeTar, data)
575+
file, err := client.Upload(context.Background(), codersdk.ContentTypeTar, bytes.NewReader(data))
576576
require.NoError(t, err)
577577
templateVersion, err := client.CreateTemplateVersion(context.Background(), organizationID, codersdk.CreateTemplateVersionRequest{
578578
TemplateID: templateID,

coderd/files_test.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package coderd_test
22

33
import (
4+
"bytes"
45
"context"
56
"net/http"
67
"testing"
@@ -23,7 +24,7 @@ func TestPostFiles(t *testing.T) {
2324
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
2425
defer cancel()
2526

26-
_, err := client.Upload(ctx, "bad", []byte{'a'})
27+
_, err := client.Upload(ctx, "bad", bytes.NewReader([]byte{'a'}))
2728
require.Error(t, err)
2829
})
2930

@@ -35,7 +36,7 @@ func TestPostFiles(t *testing.T) {
3536
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
3637
defer cancel()
3738

38-
_, err := client.Upload(ctx, codersdk.ContentTypeTar, make([]byte, 1024))
39+
_, err := client.Upload(ctx, codersdk.ContentTypeTar, bytes.NewReader(make([]byte, 1024)))
3940
require.NoError(t, err)
4041
})
4142

@@ -48,9 +49,9 @@ func TestPostFiles(t *testing.T) {
4849
defer cancel()
4950

5051
data := make([]byte, 1024)
51-
_, err := client.Upload(ctx, codersdk.ContentTypeTar, data)
52+
_, err := client.Upload(ctx, codersdk.ContentTypeTar, bytes.NewReader(data))
5253
require.NoError(t, err)
53-
_, err = client.Upload(ctx, codersdk.ContentTypeTar, data)
54+
_, err = client.Upload(ctx, codersdk.ContentTypeTar, bytes.NewReader(data))
5455
require.NoError(t, err)
5556
})
5657
}
@@ -79,7 +80,7 @@ func TestDownload(t *testing.T) {
7980
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
8081
defer cancel()
8182

82-
resp, err := client.Upload(ctx, codersdk.ContentTypeTar, make([]byte, 1024))
83+
resp, err := client.Upload(ctx, codersdk.ContentTypeTar, bytes.NewReader(make([]byte, 1024)))
8384
require.NoError(t, err)
8485
data, contentType, err := client.Download(ctx, resp.ID)
8586
require.NoError(t, err)

coderd/templateversions_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package coderd_test
22

33
import (
4+
"bytes"
45
"context"
56
"net/http"
67
"testing"
@@ -108,7 +109,7 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) {
108109
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
109110
defer cancel()
110111

111-
file, err := client.Upload(ctx, codersdk.ContentTypeTar, data)
112+
file, err := client.Upload(ctx, codersdk.ContentTypeTar, bytes.NewReader(data))
112113
require.NoError(t, err)
113114
version, err := client.CreateTemplateVersion(ctx, user.OrganizationID, codersdk.CreateTemplateVersionRequest{
114115
Name: "bananas",
@@ -895,7 +896,7 @@ func TestPaginatedTemplateVersions(t *testing.T) {
895896
templateVersionIDs := make([]uuid.UUID, total)
896897
data, err := echo.Tar(nil)
897898
require.NoError(t, err)
898-
file, err := client.Upload(egCtx, codersdk.ContentTypeTar, data)
899+
file, err := client.Upload(egCtx, codersdk.ContentTypeTar, bytes.NewReader(data))
899900
require.NoError(t, err)
900901
for i := 0; i < total; i++ {
901902
i := i

codersdk/client.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,18 +109,20 @@ func (c *Client) Request(ctx context.Context, method, path string, body interfac
109109

110110
var r io.Reader
111111
if body != nil {
112-
if data, ok := body.([]byte); ok {
112+
switch data := body.(type) {
113+
case io.Reader:
114+
r = data
115+
case []byte:
113116
r = bytes.NewReader(data)
114-
} else {
115-
// Assume JSON if not bytes.
117+
default:
118+
// Assume JSON in all other cases.
116119
buf := bytes.NewBuffer(nil)
117120
enc := json.NewEncoder(buf)
118121
enc.SetEscapeHTML(false)
119122
err = enc.Encode(body)
120123
if err != nil {
121124
return nil, xerrors.Errorf("encode body: %w", err)
122125
}
123-
124126
r = buf
125127
}
126128
}

codersdk/files.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ type UploadResponse struct {
2121

2222
// Upload uploads an arbitrary file with the content type provided.
2323
// This is used to upload a source-code archive.
24-
func (c *Client) Upload(ctx context.Context, contentType string, content []byte) (UploadResponse, error) {
25-
res, err := c.Request(ctx, http.MethodPost, "/api/v2/files", content, func(r *http.Request) {
24+
func (c *Client) Upload(ctx context.Context, contentType string, rd io.Reader) (UploadResponse, error) {
25+
res, err := c.Request(ctx, http.MethodPost, "/api/v2/files", rd, func(r *http.Request) {
2626
r.Header.Set("Content-Type", contentType)
2727
})
2828
if err != nil {

docs/ides/web-ides.md

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -97,44 +97,9 @@ resource "coder_app" "code-server" {
9797

9898
## JetBrains Projector
9999

100-
[JetBrains Projector](https://jetbrains.github.io/projector-client/mkdocs/latest/) is a JetBrains Incubator project which renders JetBrains IDEs in the web browser.
100+
[JetBrains Projector](https://jetbrains.github.io/projector-client/mkdocs/latest/) is a JetBrains Incubator project which renders JetBrains IDEs in the web browser. JetBrains has [suspended the project](https://lp.jetbrains.com/projector/) so Coder no longer provides example templates or support.
101101

102-
![PyCharm in Coder](../images/projector-pycharm.png)
103-
104-
> It is common to see latency and performance issues with Projector. We recommend using [JetBrains Gateway](https://youtrack.jetbrains.com/issues/GTW) whenever possible (also no Template edits required!)
105-
106-
Workspace requirements:
107-
108-
- JetBrains projector CLI
109-
- At least 4 CPU cores and 4 GB RAM
110-
111-
- CLion
112-
- PyCharm
113-
- DataGrip
114-
- GoLand
115-
- IntelliJ IDEA Community
116-
- IntelliJ IDEA Ultimate
117-
- PhpStorm
118-
- PyCharm Community
119-
- PyCharm Professional
120-
- Rider
121-
- RubyMine
122-
- WebStorm
123-
124-
**Pre-built templates:**
125-
126-
You can reference/use these pre-built templates with JetBrains projector:
127-
128-
- IntelliJ
129-
([Kubernetes](https://github.com/sharkymark/v2-templates/tree/main/multi-projector-intellij))
130-
131-
- PyCharm
132-
([Kubernetes](https://github.com/sharkymark/v2-templates/tree/main/multi-projector-pycharm))
133-
134-
> You need to have a valid `~/.kube/config` on your Coder host and a namespace
135-
> on a Kubernetes cluster to use the Kubernetes pod template examples.
136-
137-
======= ![PyCharm in Coder](../images/projector-pycharm.png)
102+
Use [JetBrains Gateway](./gateway.md) to remotely connect to a Coder workspace.
138103

139104
## JupyterLab
140105

docs/images/ide-row.png

-35 KB
Loading

docs/images/jetbrains-projector.png

-771 KB
Binary file not shown.

docs/images/projector-pycharm.png

-826 KB
Binary file not shown.

docs/install/offline.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ ADD filesystem-mirror-example.tfrc /opt/terraform/config.tfrc
5555
# volume or network mirror:
5656
RUN mkdir -p /opt/terraform/plugins/registry.terraform.io
5757
WORKDIR /opt/terraform/plugins/registry.terraform.io
58-
ARG CODER_PROVIDER_VERSION=0.5.3
58+
ARG CODER_PROVIDER_VERSION=0.6.10
5959
RUN echo "Adding coder/coder v${CODER_PROVIDER_VERSION}" \
6060
&& mkdir -p coder/coder && cd coder/coder \
6161
&& curl -LOs https://github.com/coder/terraform-provider-coder/releases/download/v${CODER_PROVIDER_VERSION}/terraform-provider-coder_${CODER_PROVIDER_VERSION}_linux_amd64.zip
62-
ARG DOCKER_PROVIDER_VERSION=2.22.0
62+
ARG DOCKER_PROVIDER_VERSION=3.0.1
6363
RUN echo "Adding kreuzwerker/docker v${DOCKER_PROVIDER_VERSION}" \
6464
&& mkdir -p kreuzwerker/docker && cd kreuzwerker/docker \
6565
&& curl -LOs https://github.com/kreuzwerker/terraform-provider-docker/releases/download/v${DOCKER_PROVIDER_VERSION}/terraform-provider-docker_${DOCKER_PROVIDER_VERSION}_linux_amd64.zip
@@ -81,6 +81,9 @@ USER coder
8181
ENV TF_CLI_CONFIG_FILE=/opt/terraform/config.tfrc
8282
```
8383

84+
> If you are bundling Terraform providers into your Coder image, be sure the
85+
> provider version matches any templates or [example templates](https://github.com/coder/coder/tree/main/examples/templates) you intend to use.
86+
8487
```hcl
8588
# filesystem-mirror-example.tfrc
8689
provider_installation {

0 commit comments

Comments
 (0)