Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Commit 961f7dd

Browse files
authored
Warn if coder-cli is not in PATH on Windows (#357)
* Warn if coder-cli not in PATH on Windows * Use safeexec to get windows path * Delete GOARCH=386 from windows build
1 parent 6eb1887 commit 961f7dd

File tree

6 files changed

+75
-18
lines changed

6 files changed

+75
-18
lines changed

.github/workflows/release.yaml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ jobs:
2222
- name: Upload windows
2323
uses: actions/upload-artifact@v2
2424
with:
25-
name: coder-cli-windows-386
26-
path: ./ci/bin/coder-cli-windows-386.zip
25+
name: coder-cli-windows
26+
path: ./ci/bin/coder-cli-windows.zip
2727
build_darwin:
2828
name: Build darwin binary
2929
runs-on: macos-latest
@@ -74,7 +74,7 @@ jobs:
7474
draft: true
7575
prerelease: false
7676
- name: Upload Linux Release
77-
id: upload-linux-release-asset
77+
id: upload-linux-release-asset
7878
uses: actions/upload-release-asset@v1
7979
env:
8080
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -84,7 +84,7 @@ jobs:
8484
asset_name: coder-cli-linux-amd64.tar.gz
8585
asset_content_type: application/tar+gzip
8686
- name: Upload MacOS Release
87-
id: upload-macos-release-asset
87+
id: upload-macos-release-asset
8888
uses: actions/upload-release-asset@v1
8989
env:
9090
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -94,12 +94,12 @@ jobs:
9494
asset_name: coder-cli-darwin-amd64.zip
9595
asset_content_type: application/zip
9696
- name: Upload Windows Release
97-
id: upload-windows-release-asset
97+
id: upload-windows-release-asset
9898
uses: actions/upload-release-asset@v1
9999
env:
100100
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
101101
with:
102102
upload_url: ${{ steps.create_release.outputs.upload_url }}
103-
asset_path: coder-cli-windows-386/coder-cli-windows-386.zip
104-
asset_name: coder-cli-windows-386.zip
103+
asset_path: coder-cli-windows/coder-cli-windows.zip
104+
asset_name: coder-cli-windows.zip
105105
asset_content_type: application/zip

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ build/macos:
1414
# requires darwin
1515
CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 ./ci/scripts/build.sh
1616
build/windows:
17-
CGO_ENABLED=0 GOOS=windows GOARCH=386 ./ci/scripts/build.sh
17+
CGO_ENABLED=0 GOOS=windows ./ci/scripts/build.sh
1818
build/linux:
1919
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./ci/scripts/build.sh
2020

ci/scripts/build.sh

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,26 @@ set -euo pipefail
88

99
cd "$(git rev-parse --show-toplevel)/ci/scripts"
1010

11-
tag=$(git describe --tags)
12-
13-
echo "--- building coder-cli for $GOOS-$GOARCH"
14-
15-
tmpdir=$(mktemp -d)
11+
tag="$(git describe --tags)"
12+
13+
flavor="$GOOS"
14+
if [[ "$GOOS" == "windows" ]]; then
15+
# GOARCH causes bugs with the safeexec package on Windows.
16+
unset GOARCH
17+
else
18+
flavor+="-$GOARCH"
19+
fi
20+
echo "--- building coder-cli for $flavor"
21+
22+
tmpdir="$(mktemp -d)"
1623
go build -ldflags "-X cdr.dev/coder-cli/internal/version.Version=${tag}" -o "$tmpdir/coder" ../../cmd/coder
1724

1825
cp ../gon.json $tmpdir/gon.json
1926

2027
pushd "$tmpdir"
2128
case "$GOOS" in
2229
"windows")
23-
artifact="coder-cli-$GOOS-$GOARCH.zip"
30+
artifact="coder-cli-$GOOS.zip"
2431
mv coder coder.exe
2532
zip "$artifact" coder.exe
2633
;;

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
cdr.dev/slog v1.4.1
77
cdr.dev/wsep v0.0.0-20200728013649-82316a09813f
88
github.com/briandowns/spinner v1.16.0
9+
github.com/cli/safeexec v1.0.0
910
github.com/fatih/color v1.12.0
1011
github.com/google/go-cmp v0.5.6
1112
github.com/gorilla/websocket v1.4.2

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5O
7878
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
7979
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8=
8080
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
81+
github.com/cli/safeexec v1.0.0 h1:0VngyaIyqACHdcMNWfo6+KdUYnqEr2Sg+bSP1pdF+dI=
82+
github.com/cli/safeexec v1.0.0/go.mod h1:Z/D4tTN8Vs5gXYHDCbaM1S/anmEDnJb1iW0+EJ5zx3Q=
8183
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
8284
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
8385
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=

internal/cmd/configssh.go

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ import (
1212
"sort"
1313
"strings"
1414

15-
"cdr.dev/coder-cli/pkg/clog"
16-
15+
"github.com/cli/safeexec"
1716
"github.com/spf13/cobra"
1817
"golang.org/x/xerrors"
1918

2019
"cdr.dev/coder-cli/coder-sdk"
2120
"cdr.dev/coder-cli/internal/coderutil"
21+
"cdr.dev/coder-cli/pkg/clog"
2222
)
2323

2424
const sshStartToken = "# ------------START-CODER-ENTERPRISE-----------"
@@ -114,7 +114,7 @@ func configSSH(configpath *string, remove *bool) func(cmd *cobra.Command, _ []st
114114
return xerrors.New("SSH is disabled or not available for any workspaces in your Coder deployment.")
115115
}
116116

117-
binPath, err := os.Executable()
117+
binPath, err := binPath()
118118
if err != nil {
119119
return xerrors.Errorf("Failed to get executable path: %w", err)
120120
}
@@ -147,6 +147,53 @@ func configSSH(configpath *string, remove *bool) func(cmd *cobra.Command, _ []st
147147
}
148148
}
149149

150+
// binPath returns the path to the coder binary suitable for use in ssh
151+
// ProxyCommand.
152+
func binPath() (string, error) {
153+
exePath, err := os.Executable()
154+
if err != nil {
155+
return "", xerrors.Errorf("get executable path: %w", err)
156+
}
157+
158+
// On Windows, the coder-cli executable must be in $PATH for both Msys2/Git
159+
// Bash and OpenSSH for Windows (used by Powershell and VS Code) to function
160+
// correctly. Check if the current executable is in $PATH, and warn the user
161+
// if it isn't.
162+
if runtime.GOOS == "windows" {
163+
binName := filepath.Base(exePath)
164+
165+
// We use safeexec instead of os/exec because os/exec returns paths in
166+
// the current working directory, which we will run into very often when
167+
// looking for our own path.
168+
pathPath, err := safeexec.LookPath(binName)
169+
if err != nil {
170+
clog.LogWarn(
171+
"The current executable is not in $PATH.",
172+
"This may lead to problems connecting to your workspace via SSH.",
173+
fmt.Sprintf("Please move %q to a location in your $PATH (such as System32) and run `%s config-ssh` again.", binName, binName),
174+
)
175+
// Return the exePath so SSH at least works outside of Msys2.
176+
return exePath, nil
177+
}
178+
179+
// Warn the user if the current executable is not the same as the one in
180+
// $PATH.
181+
if filepath.Clean(pathPath) != filepath.Clean(exePath) {
182+
clog.LogWarn(
183+
"The current executable path does not match the executable path found in $PATH.",
184+
"This may lead to problems connecting to your workspace via SSH.",
185+
fmt.Sprintf("\t Current executable path: %q", exePath),
186+
fmt.Sprintf("\tExecutable path in $PATH: %q", pathPath),
187+
)
188+
}
189+
190+
return binName, nil
191+
}
192+
193+
// On platforms other than Windows we can use the full path to the binary.
194+
return exePath, nil
195+
}
196+
150197
// removeOldConfig removes the old ssh configuration from the user's sshconfig.
151198
// Returns true if the config was modified.
152199
func removeOldConfig(config string) (string, bool) {
@@ -212,7 +259,7 @@ func makeSSHConfig(binPath, host, userName, workspaceName, privateKeyFilepath st
212259
host := fmt.Sprintf(
213260
`Host coder.%s
214261
HostName coder.%s
215-
ProxyCommand %s tunnel %s 12213 stdio
262+
ProxyCommand "%s" tunnel %s 12213 stdio
216263
StrictHostKeyChecking no
217264
ConnectTimeout=0
218265
IdentitiesOnly yes

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy