Skip to content

feat: Add templates to create working release #422

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 47 commits into from
Mar 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
94e5069
Add templates
kylecarbs Mar 10, 2022
688ab17
Move API structs to codersdk
kylecarbs Mar 10, 2022
8cee1fb
Back to green tests!
kylecarbs Mar 11, 2022
11e1d99
It all works, but now with tea! 🧋
kylecarbs Mar 11, 2022
b23a58c
It works!
kylecarbs Mar 11, 2022
c01b8f7
Add cancellation to provisionerd
kylecarbs Mar 13, 2022
99c8eb1
Tests pass!
kylecarbs Mar 13, 2022
6b4c8b5
Add deletion of workspaces and projects
kylecarbs Mar 13, 2022
21c3d1c
Fix agent lock
kylecarbs Mar 14, 2022
8d24602
Add clog
kylecarbs Mar 14, 2022
cfffbe5
Fix linting errors
kylecarbs Mar 14, 2022
926e59e
Remove unused CLI tests
kylecarbs Mar 14, 2022
1c9e124
Rename daemon to start
kylecarbs Mar 14, 2022
fdc17ee
Merge branch 'main' into workflow
kylecarbs Mar 14, 2022
2b9a849
Fix leaking command
kylecarbs Mar 14, 2022
f895d1f
Fix promptui test
kylecarbs Mar 14, 2022
72bc74c
Update agent connection frequency
kylecarbs Mar 15, 2022
e79f9b0
Skip login tests on Windows
kylecarbs Mar 15, 2022
8165782
Merge branch 'main' into workflow
kylecarbs Mar 15, 2022
55a0160
Increase tunnel connect timeout
kylecarbs Mar 15, 2022
6e53335
Merge branch 'main' into workflow
kylecarbs Mar 15, 2022
6ac95bf
Fix templater
kylecarbs Mar 15, 2022
b4c2aed
Merge branch 'workflow' of github.com:coder/coder into workflow
kylecarbs Mar 15, 2022
369c4a0
Merge branch 'workflow' of github.com:coder/coder into workflow
kylecarbs Mar 15, 2022
1402a08
Merge branch 'workflow' of github.com:coder/coder into workflow
kylecarbs Mar 15, 2022
c7dfb51
Lower test requirements
kylecarbs Mar 15, 2022
1005371
Fix embed
kylecarbs Mar 15, 2022
5677f22
Disable promptui tests for Windows
kylecarbs Mar 15, 2022
52e4d99
Fix write newline
kylecarbs Mar 15, 2022
82bceec
Fix PTY write newline
kylecarbs Mar 15, 2022
df885f5
Merge branch 'main' into workflow
kylecarbs Mar 15, 2022
749d1ac
Fix CloseReader
kylecarbs Mar 16, 2022
8bc5c1a
Fix compilation on Windows
kylecarbs Mar 16, 2022
53d489e
Fix linting error
kylecarbs Mar 16, 2022
c8ae865
Merge branch 'main' into workflow
kylecarbs Mar 16, 2022
def36fa
Remove bubbletea
kylecarbs Mar 16, 2022
fc8c950
Cleanup readwriter
kylecarbs Mar 16, 2022
2cc902f
Use embedded templates instead of serving over API
kylecarbs Mar 16, 2022
8146d00
Move templates to examples
kylecarbs Mar 17, 2022
5190438
Improve workspace create flow
kylecarbs Mar 18, 2022
fe925a3
Fix Windows build
kylecarbs Mar 18, 2022
4fa89d4
Fix tests
kylecarbs Mar 20, 2022
c2a7119
Fix linting errors
kylecarbs Mar 20, 2022
091fead
Merge branch 'main' into workflow
kylecarbs Mar 20, 2022
f482a85
Fix untar with extracting max size
kylecarbs Mar 21, 2022
9e29a51
Fix newline char
kylecarbs Mar 22, 2022
aa267e6
Merge branch 'main' into workflow
kylecarbs Mar 22, 2022
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
4 changes: 2 additions & 2 deletions .github/workflows/coder.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ jobs:
- name: Test with Mock Database
shell: bash
env:
GOCOUNT: ${{ runner.os == 'Windows' && 3 || 5 }}
GOCOUNT: ${{ runner.os == 'Windows' && 1 || 2 }}
GOMAXPROCS: ${{ runner.os == 'Windows' && 1 || 2 }}
run: gotestsum --junitfile="gotests.xml" --packages="./..." --
-covermode=atomic -coverprofile="gotests.coverage"
Expand All @@ -178,7 +178,7 @@ jobs:
run: DB=true gotestsum --junitfile="gotests.xml" --packages="./..." --
-covermode=atomic -coverprofile="gotests.coverage" -timeout=3m
-coverpkg=./...,github.com/coder/coder/codersdk
-count=1 -race -parallel=2 -failfast
-count=1 -parallel=2 -failfast

- name: Upload DataDog Trace
if: (success() || failure()) && github.actor != 'dependabot[bot]' && runner.os == 'Linux'
Expand Down
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,8 @@ site/**/*.typegen.ts
# Build
dist/
site/out/

*.tfstate
*.tfplan
*.lock.hcl
.terraform/
Comment on lines +32 to +35
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call 👍

7 changes: 4 additions & 3 deletions .goreleaser.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
archives:
- builds:
- id: coder
builds:
- coder
files:
- README.md
Expand All @@ -12,18 +13,18 @@ before:
builds:
- id: coder-slim
dir: cmd/coder
flags: [-tags=slim]
ldflags: ["-s -w"]
env: [CGO_ENABLED=0]
goos: [darwin, linux, windows]
goarch: [amd64, arm64]
hooks:
# The "trimprefix" appends ".exe" on Windows.
post: |
cp {{.Path}} site/out/bin/coder_{{ .Os }}_{{ .Arch }}{{ trimprefix .Name "coder" }}
cp {{.Path}} site/out/bin/coder-{{ .Os }}-{{ .Arch }}{{ trimprefix .Name "coder" }}
- id: coder
dir: cmd/coder
flags: [-tags=embed]
ldflags: ["-s -w"]
env: [CGO_ENABLED=0]
goos: [darwin, linux, windows]
Expand Down
8 changes: 7 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"cSpell.words": [
"cliui",
"coderd",
"coderdtest",
"codersdk",
Expand All @@ -12,8 +13,10 @@
"goleak",
"gossh",
"hashicorp",
"hclsyntax",
"httpmw",
"idtoken",
"Iflag",
"incpatch",
"isatty",
"Jobf",
Expand All @@ -40,11 +43,14 @@
"retrier",
"sdkproto",
"stretchr",
"TCGETS",
"tcpip",
"TCSETS",
"tfexec",
"tfstate",
"trimprefix",
"unconvert",
"Untar",
"webrtc",
"xerrors",
"yamux"
Expand All @@ -69,7 +75,7 @@
"go.coverOnSave": true,
// The codersdk is used by coderd another other packages extensively.
// To reduce redundancy in tests, it's covered by other packages.
"go.testFlags": ["-coverpkg=./.,github.com/coder/coder/codersdk"],
"go.testFlags": ["-short", "-coverpkg=./.,github.com/coder/coder/codersdk"],
"go.coverageDecorator": {
"type": "gutter",
"coveredHighlightColor": "rgba(64,128,128,0.5)",
Expand Down
8 changes: 4 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ install: bin
@echo "-- CLI available at $(shell ls $(INSTALL_DIR)/coder*)"
.PHONY: install

package:
goreleaser release --snapshot --rm-dist
.PHONY: package

peerbroker/proto: peerbroker/proto/peerbroker.proto
protoc \
--go_out=. \
Expand Down Expand Up @@ -89,7 +93,3 @@ site/out:
# Restores GITKEEP files!
git checkout HEAD site/out
.PHONY: site/out

snapshot:
goreleaser release --snapshot --rm-dist
.PHONY: snapshot
143 changes: 72 additions & 71 deletions agent/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"fmt"
"io"
"net"
"os"
"os/exec"
"os/user"
"sync"
Expand Down Expand Up @@ -85,6 +86,76 @@ type server struct {
sshServer *ssh.Server
}

func (s *server) run(ctx context.Context) {
var peerListener *peerbroker.Listener
var err error
// An exponential back-off occurs when the connection is failing to dial.
// This is to prevent server spam in case of a coderd outage.
for retrier := retry.New(50*time.Millisecond, 10*time.Second); retrier.Wait(ctx); {
peerListener, err = s.clientDialer(ctx, s.options)
if err != nil {
if errors.Is(err, context.Canceled) {
return
}
if s.isClosed() {
return
}
s.options.Logger.Warn(context.Background(), "failed to dial", slog.Error(err))
continue
}
s.options.Logger.Debug(context.Background(), "connected")
break
}
select {
case <-ctx.Done():
return
default:
}

for {
conn, err := peerListener.Accept()
if err != nil {
if s.isClosed() {
return
}
s.options.Logger.Debug(ctx, "peer listener accept exited; restarting connection", slog.Error(err))
s.run(ctx)
return
}
s.closeMutex.Lock()
s.connCloseWait.Add(1)
s.closeMutex.Unlock()
go s.handlePeerConn(ctx, conn)
}
}

func (s *server) handlePeerConn(ctx context.Context, conn *peer.Conn) {
go func() {
<-conn.Closed()
s.connCloseWait.Done()
}()
for {
channel, err := conn.Accept(ctx)
if err != nil {
if errors.Is(err, peer.ErrClosed) || s.isClosed() {
return
}
s.options.Logger.Debug(ctx, "accept channel from peer connection", slog.Error(err))
return
}

switch channel.Protocol() {
case "ssh":
s.sshServer.HandleConn(channel.NetConn())
default:
s.options.Logger.Warn(ctx, "unhandled protocol from channel",
slog.F("protocol", channel.Protocol()),
slog.F("label", channel.Label()),
)
}
}
}

func (s *server) init(ctx context.Context) {
// Clients' should ignore the host key when connecting.
// The agent needs to authenticate with coderd to SSH,
Expand Down Expand Up @@ -197,7 +268,7 @@ func (*server) handleSSHSession(session ssh.Session) error {
}()

cmd := exec.CommandContext(session.Context(), command, args...)
cmd.Env = session.Environ()
cmd.Env = append(os.Environ(), session.Environ()...)

sshPty, windowSize, isPty := session.Pty()
if isPty {
Expand Down Expand Up @@ -244,76 +315,6 @@ func (*server) handleSSHSession(session ssh.Session) error {
return nil
}

func (s *server) run(ctx context.Context) {
var peerListener *peerbroker.Listener
var err error
// An exponential back-off occurs when the connection is failing to dial.
// This is to prevent server spam in case of a coderd outage.
for retrier := retry.New(50*time.Millisecond, 10*time.Second); retrier.Wait(ctx); {
peerListener, err = s.clientDialer(ctx, s.options)
if err != nil {
if errors.Is(err, context.Canceled) {
return
}
if s.isClosed() {
return
}
s.options.Logger.Warn(context.Background(), "failed to dial", slog.Error(err))
continue
}
s.options.Logger.Debug(context.Background(), "connected")
break
}
select {
case <-ctx.Done():
return
default:
}

for {
conn, err := peerListener.Accept()
if err != nil {
if s.isClosed() {
return
}
s.options.Logger.Debug(ctx, "peer listener accept exited; restarting connection", slog.Error(err))
s.run(ctx)
return
}
s.closeMutex.Lock()
s.connCloseWait.Add(1)
s.closeMutex.Unlock()
go s.handlePeerConn(ctx, conn)
}
}

func (s *server) handlePeerConn(ctx context.Context, conn *peer.Conn) {
go func() {
<-conn.Closed()
s.connCloseWait.Done()
}()
for {
channel, err := conn.Accept(ctx)
if err != nil {
if errors.Is(err, peer.ErrClosed) || s.isClosed() {
return
}
s.options.Logger.Debug(ctx, "accept channel from peer connection", slog.Error(err))
return
}

switch channel.Protocol() {
case "ssh":
s.sshServer.HandleConn(channel.NetConn())
default:
s.options.Logger.Warn(ctx, "unhandled protocol from channel",
slog.F("protocol", channel.Protocol()),
slog.F("label", channel.Label()),
)
}
}
}

// isClosed returns whether the API is closed or not.
func (s *server) isClosed() bool {
select {
Expand Down
6 changes: 6 additions & 0 deletions agent/usershell/usershell_windows.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
package usershell

import "os/exec"

// Get returns the command prompt binary name.
func Get(username string) (string, error) {
_, err := exec.LookPath("powershell.exe")
if err == nil {
return "powershell.exe", nil
}
return "cmd.exe", nil
}
50 changes: 50 additions & 0 deletions cli/cliui/cliui.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package cliui

import (
"github.com/charmbracelet/charm/ui/common"
"github.com/charmbracelet/lipgloss"
"golang.org/x/xerrors"
)

var (
Canceled = xerrors.New("canceled")

defaultStyles = common.DefaultStyles()
)

// ValidateNotEmpty is a helper function to disallow empty inputs!
func ValidateNotEmpty(s string) error {
if s == "" {
return xerrors.New("Must be provided!")
}
return nil
}

// Styles compose visual elements of the UI!
var Styles = struct {
Bold,
Code,
Field,
Keyword,
Paragraph,
Placeholder,
Prompt,
FocusedPrompt,
Fuschia,
Logo,
Warn,
Wrap lipgloss.Style
}{
Bold: lipgloss.NewStyle().Bold(true),
Code: defaultStyles.Code,
Field: defaultStyles.Code.Copy().Foreground(lipgloss.AdaptiveColor{Light: "#000000", Dark: "#FFFFFF"}),
Keyword: defaultStyles.Keyword,
Paragraph: defaultStyles.Paragraph,
Placeholder: lipgloss.NewStyle().Foreground(lipgloss.Color("240")),
Prompt: defaultStyles.Prompt.Foreground(lipgloss.AdaptiveColor{Light: "#9B9B9B", Dark: "#5C5C5C"}),
FocusedPrompt: defaultStyles.FocusedPrompt.Foreground(lipgloss.Color("#651fff")),
Fuschia: defaultStyles.SelectedMenuItem.Copy(),
Logo: defaultStyles.Logo.SetString("Coder"),
Warn: lipgloss.NewStyle().Foreground(lipgloss.AdaptiveColor{Light: "#04B575", Dark: "#ECFD65"}),
Wrap: defaultStyles.Wrap,
}
Loading