mirror of https://github.com/coder/code-server.git
Remove deprecated --link (#6018)
This commit is contained in:
parent
6d8ed77fb0
commit
ac1fba8bde
|
@ -22,11 +22,15 @@ Code v99.99.999
|
||||||
|
|
||||||
## [4.10.0](https://github.com/coder/code-server/releases/tag/v4.10.0) - TBD
|
## [4.10.0](https://github.com/coder/code-server/releases/tag/v4.10.0) - TBD
|
||||||
|
|
||||||
Code v1.75.0
|
Code v1.75.1
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- Updated to Code 1.75.0
|
- Updated to Code 1.75.1
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Removed `--link` (was deprecated in 4.0.1).
|
||||||
|
|
||||||
## [4.9.1](https://github.com/coder/code-server/releases/tag/v4.9.1) - 2022-12-15
|
## [4.9.1](https://github.com/coder/code-server/releases/tag/v4.9.1) - 2022-12-15
|
||||||
|
|
||||||
|
|
|
@ -14,22 +14,6 @@ main() {
|
||||||
sed -i.bak "1s;^;#!/usr/bin/env node\n;" out/node/entry.js && rm out/node/entry.js.bak
|
sed -i.bak "1s;^;#!/usr/bin/env node\n;" out/node/entry.js && rm out/node/entry.js.bak
|
||||||
chmod +x out/node/entry.js
|
chmod +x out/node/entry.js
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# for arch; we do not use OS from lib.sh and get our own.
|
|
||||||
# lib.sh normalizes macos to darwin - but cloud-agent's binaries do not
|
|
||||||
source ./ci/lib.sh
|
|
||||||
OS="$(uname | tr '[:upper:]' '[:lower:]')"
|
|
||||||
|
|
||||||
mkdir -p ./lib
|
|
||||||
|
|
||||||
if ! [ -f ./lib/coder-cloud-agent ]; then
|
|
||||||
echo "Downloading the cloud agent..."
|
|
||||||
|
|
||||||
set +e
|
|
||||||
curl -fsSL "https://github.com/coder/cloud-agent/releases/latest/download/cloud-agent-$OS-$ARCH" -o ./lib/coder-cloud-agent
|
|
||||||
chmod +x ./lib/coder-cloud-agent
|
|
||||||
set -e
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
main "$@"
|
main "$@"
|
||||||
|
|
|
@ -63,8 +63,6 @@ EOF
|
||||||
|
|
||||||
if [ "$KEEP_MODULES" = 1 ]; then
|
if [ "$KEEP_MODULES" = 1 ]; then
|
||||||
rsync node_modules/ "$RELEASE_PATH/node_modules"
|
rsync node_modules/ "$RELEASE_PATH/node_modules"
|
||||||
mkdir -p "$RELEASE_PATH/lib"
|
|
||||||
rsync ./lib/coder-cloud-agent "$RELEASE_PATH/lib"
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,8 @@
|
||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
# Copied from ../lib.sh.
|
# Copied from ../lib.sh except we do not rename Darwin and we do not need to
|
||||||
arch() {
|
# detect Alpine.
|
||||||
cpu="$(uname -m)"
|
|
||||||
case "$cpu" in
|
|
||||||
aarch64) cpu=arm64 ;;
|
|
||||||
x86_64) cpu=amd64 ;;
|
|
||||||
esac
|
|
||||||
echo "$cpu"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Copied from ../lib.sh except we do not rename Darwin since the cloud agent
|
|
||||||
# uses "darwin" in the release names and we do not need to detect Alpine.
|
|
||||||
os() {
|
os() {
|
||||||
osname=$(uname | tr '[:upper:]' '[:lower:]')
|
osname=$(uname | tr '[:upper:]' '[:lower:]')
|
||||||
case $osname in
|
case $osname in
|
||||||
|
@ -61,7 +51,6 @@ symlink_bin_script() {
|
||||||
cd "$oldpwd"
|
cd "$oldpwd"
|
||||||
}
|
}
|
||||||
|
|
||||||
ARCH="${NPM_CONFIG_ARCH:-$(arch)}"
|
|
||||||
OS="$(os)"
|
OS="$(os)"
|
||||||
|
|
||||||
# This is due to an upstream issue with RHEL7/CentOS 7 comptability with node-argon2
|
# This is due to an upstream issue with RHEL7/CentOS 7 comptability with node-argon2
|
||||||
|
@ -102,14 +91,6 @@ main() {
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
mkdir -p ./lib
|
|
||||||
|
|
||||||
if curl -fsSL "https://github.com/coder/cloud-agent/releases/latest/download/cloud-agent-$OS-$ARCH" -o ./lib/coder-cloud-agent; then
|
|
||||||
chmod +x ./lib/coder-cloud-agent
|
|
||||||
else
|
|
||||||
echo "Failed to download cloud agent; --link will not work"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! vscode_install; then
|
if ! vscode_install; then
|
||||||
echo "You may not have the required dependencies to build the native modules."
|
echo "You may not have the required dependencies to build the native modules."
|
||||||
echo "Please see https://github.com/coder/code-server/blob/main/docs/npm.md"
|
echo "Please see https://github.com/coder/code-server/blob/main/docs/npm.md"
|
||||||
|
|
|
@ -297,9 +297,9 @@ You can install code-server using the [Helm package manager](https://coder.com/d
|
||||||
|
|
||||||
## Windows
|
## Windows
|
||||||
|
|
||||||
We currently [do not publish Windows releases](https://github.com/coder/code-server/issues/1397). We recommend installing code-server onto Windows with [`npm`](#npm).
|
We currently [do not publish Windows
|
||||||
|
releases](https://github.com/coder/code-server/issues/1397). We recommend
|
||||||
> Note: You will also need to [build coder/cloud-agent manually](https://github.com/coder/cloud-agent/issues/17) if you would like to use `code-server --link` on Windows.
|
installing code-server onto Windows with [`npm`](#npm).
|
||||||
|
|
||||||
## Raspberry Pi
|
## Raspberry Pi
|
||||||
|
|
||||||
|
|
11
docs/link.md
11
docs/link.md
|
@ -1,11 +0,0 @@
|
||||||
# code-server --link
|
|
||||||
|
|
||||||
> Note: This feature is no longer recommended due to instability. Stay tuned for a revised version.
|
|
||||||
|
|
||||||
Run code-server with the flag `--link` and you'll get TLS, authentication, and a dedicated URL
|
|
||||||
for accessing your IDE out of the box.
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ code-server --link
|
|
||||||
Proxying code-server, you can access your IDE at https://example.coder.co
|
|
||||||
```
|
|
|
@ -42,11 +42,6 @@
|
||||||
"description": "How to run code-server in Coder",
|
"description": "How to run code-server in Coder",
|
||||||
"path": "./coder.md"
|
"path": "./coder.md"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"title": "--link",
|
|
||||||
"description": "How to run code-server --link",
|
|
||||||
"path": "./link.md"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"title": "iPad",
|
"title": "iPad",
|
||||||
"description": "How to access your code-server installation using an iPad.",
|
"description": "How to access your code-server installation using an iPad.",
|
||||||
|
|
|
@ -84,7 +84,6 @@ export interface UserProvidedArgs extends UserProvidedCodeArgs {
|
||||||
"reuse-window"?: boolean
|
"reuse-window"?: boolean
|
||||||
"new-window"?: boolean
|
"new-window"?: boolean
|
||||||
"ignore-last-opened"?: boolean
|
"ignore-last-opened"?: boolean
|
||||||
link?: OptionalString
|
|
||||||
verbose?: boolean
|
verbose?: boolean
|
||||||
"app-name"?: string
|
"app-name"?: string
|
||||||
"welcome-text"?: string
|
"welcome-text"?: string
|
||||||
|
@ -262,15 +261,6 @@ export const options: Options<Required<UserProvidedArgs>> = {
|
||||||
short: "w",
|
short: "w",
|
||||||
description: "Text to show on login page",
|
description: "Text to show on login page",
|
||||||
},
|
},
|
||||||
link: {
|
|
||||||
type: OptionalString,
|
|
||||||
description: `
|
|
||||||
Securely bind code-server via our cloud service with the passed name. You'll get a URL like
|
|
||||||
https://hostname-username.coder.co at which you can easily access your code-server instance.
|
|
||||||
Authorization is done via GitHub.
|
|
||||||
`,
|
|
||||||
deprecated: true,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const optionDescriptions = (opts: Partial<Options<Required<UserProvidedArgs>>> = options): string[] => {
|
export const optionDescriptions = (opts: Partial<Options<Required<UserProvidedArgs>>> = options): string[] => {
|
||||||
|
@ -547,17 +537,6 @@ export async function setDefaults(cliArgs: UserProvidedArgs, configArgs?: Config
|
||||||
args.host = addr.host
|
args.host = addr.host
|
||||||
args.port = addr.port
|
args.port = addr.port
|
||||||
|
|
||||||
// If we're being exposed to the cloud, we listen on a random address and
|
|
||||||
// disable auth.
|
|
||||||
if (args.link) {
|
|
||||||
args.host = "localhost"
|
|
||||||
args.port = 0
|
|
||||||
args.socket = undefined
|
|
||||||
args["socket-mode"] = undefined
|
|
||||||
args.cert = undefined
|
|
||||||
args.auth = AuthType.None
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.cert && !args.cert.value) {
|
if (args.cert && !args.cert.value) {
|
||||||
const { cert, certKey } = await generateCertificate(args["cert-host"] || "localhost")
|
const { cert, certKey } = await generateCertificate(args["cert-host"] || "localhost")
|
||||||
args.cert = {
|
args.cert = {
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
import { logger } from "@coder/logger"
|
|
||||||
import { spawn } from "child_process"
|
|
||||||
import path from "path"
|
|
||||||
import split2 from "split2"
|
|
||||||
|
|
||||||
// https://github.com/coder/coder-cloud
|
|
||||||
const coderCloudAgent = path.resolve(__dirname, "../../lib/coder-cloud-agent")
|
|
||||||
|
|
||||||
function runAgent(...args: string[]): Promise<void> {
|
|
||||||
logger.debug(`running agent with ${args}`)
|
|
||||||
|
|
||||||
const agent = spawn(coderCloudAgent, args, {
|
|
||||||
stdio: ["inherit", "inherit", "pipe"],
|
|
||||||
})
|
|
||||||
|
|
||||||
agent.stderr.pipe(split2()).on("data", (line) => {
|
|
||||||
line = line.replace(/^[0-9-]+ [0-9:]+ [^ ]+\t/, "")
|
|
||||||
logger.info(line)
|
|
||||||
})
|
|
||||||
|
|
||||||
return new Promise((res, rej) => {
|
|
||||||
agent.on("error", rej)
|
|
||||||
|
|
||||||
agent.on("close", (code) => {
|
|
||||||
if (code !== 0) {
|
|
||||||
rej({
|
|
||||||
message: `--link agent exited with ${code}`,
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
res()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function coderCloudBind(address: URL | string, serverName = ""): Promise<void> {
|
|
||||||
if (typeof address === "string") {
|
|
||||||
throw new Error("Cannot link socket paths")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Address needs to be in hostname:port format without the protocol.
|
|
||||||
return runAgent("bind", `--code-server-addr=${address.host}`, serverName)
|
|
||||||
}
|
|
|
@ -6,7 +6,6 @@ import { Disposable } from "../common/emitter"
|
||||||
import { plural } from "../common/util"
|
import { plural } from "../common/util"
|
||||||
import { createApp, ensureAddress } from "./app"
|
import { createApp, ensureAddress } from "./app"
|
||||||
import { AuthType, DefaultedArgs, Feature, SpawnCodeCli, toCodeArgs, UserProvidedArgs } from "./cli"
|
import { AuthType, DefaultedArgs, Feature, SpawnCodeCli, toCodeArgs, UserProvidedArgs } from "./cli"
|
||||||
import { coderCloudBind } from "./coder_cloud"
|
|
||||||
import { commit, version } from "./constants"
|
import { commit, version } from "./constants"
|
||||||
import { register } from "./routes"
|
import { register } from "./routes"
|
||||||
import { humanPath, isDirectory, loadAMDModule, open } from "./util"
|
import { humanPath, isDirectory, loadAMDModule, open } from "./util"
|
||||||
|
@ -127,11 +126,7 @@ export const runCodeServer = async (
|
||||||
const disposeRoutes = await register(app, args)
|
const disposeRoutes = await register(app, args)
|
||||||
|
|
||||||
logger.info(`Using config file ${humanPath(os.homedir(), args.config)}`)
|
logger.info(`Using config file ${humanPath(os.homedir(), args.config)}`)
|
||||||
logger.info(
|
logger.info(`${protocol.toUpperCase()} server listening on ${serverAddress.toString()}`)
|
||||||
`${protocol.toUpperCase()} server listening on ${serverAddress.toString()} ${
|
|
||||||
args.link ? "(randomized by --link)" : ""
|
|
||||||
}`,
|
|
||||||
)
|
|
||||||
|
|
||||||
if (args.auth === AuthType.Password) {
|
if (args.auth === AuthType.Password) {
|
||||||
logger.info(" - Authentication is enabled")
|
logger.info(" - Authentication is enabled")
|
||||||
|
@ -143,13 +138,13 @@ export const runCodeServer = async (
|
||||||
logger.info(` - Using password from ${humanPath(os.homedir(), args.config)}`)
|
logger.info(` - Using password from ${humanPath(os.homedir(), args.config)}`)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.info(` - Authentication is disabled ${args.link ? "(disabled by --link)" : ""}`)
|
logger.info(" - Authentication is disabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.cert) {
|
if (args.cert) {
|
||||||
logger.info(` - Using certificate for HTTPS: ${humanPath(os.homedir(), args.cert.value)}`)
|
logger.info(` - Using certificate for HTTPS: ${humanPath(os.homedir(), args.cert.value)}`)
|
||||||
} else {
|
} else {
|
||||||
logger.info(` - Not serving HTTPS ${args.link ? "(disabled by --link)" : ""}`)
|
logger.info(" - Not serving HTTPS")
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args["proxy-domain"].length > 0) {
|
if (args["proxy-domain"].length > 0) {
|
||||||
|
@ -157,11 +152,6 @@ export const runCodeServer = async (
|
||||||
args["proxy-domain"].forEach((domain) => logger.info(` - *.${domain}`))
|
args["proxy-domain"].forEach((domain) => logger.info(` - *.${domain}`))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.link) {
|
|
||||||
await coderCloudBind(serverAddress, args.link.value)
|
|
||||||
logger.info(" - Connected to cloud agent")
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.enable && args.enable.length > 0) {
|
if (args.enable && args.enable.length > 0) {
|
||||||
logger.info("Enabling the following experimental features:")
|
logger.info("Enabling the following experimental features:")
|
||||||
args.enable.forEach((feature) => {
|
args.enable.forEach((feature) => {
|
||||||
|
|
|
@ -297,26 +297,6 @@ describe("parser", () => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should override with --link", async () => {
|
|
||||||
const args = parse(
|
|
||||||
"--cert test --cert-key test --socket test --socket-mode 777 --host 0.0.0.0 --port 8888 --link test".split(" "),
|
|
||||||
)
|
|
||||||
const defaultArgs = await setDefaults(args)
|
|
||||||
expect(defaultArgs).toEqual({
|
|
||||||
...defaults,
|
|
||||||
auth: "none",
|
|
||||||
host: "localhost",
|
|
||||||
link: {
|
|
||||||
value: "test",
|
|
||||||
},
|
|
||||||
port: 0,
|
|
||||||
cert: undefined,
|
|
||||||
"cert-key": path.resolve("test"),
|
|
||||||
socket: undefined,
|
|
||||||
"socket-mode": undefined,
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
it("should use env var password", async () => {
|
it("should use env var password", async () => {
|
||||||
process.env.PASSWORD = "test"
|
process.env.PASSWORD = "test"
|
||||||
const args = parse([])
|
const args = parse([])
|
||||||
|
@ -881,21 +861,13 @@ describe("optionDescriptions", () => {
|
||||||
|
|
||||||
it("should show if an option is deprecated", () => {
|
it("should show if an option is deprecated", () => {
|
||||||
const opts: Partial<Options<Required<UserProvidedArgs>>> = {
|
const opts: Partial<Options<Required<UserProvidedArgs>>> = {
|
||||||
link: {
|
cert: {
|
||||||
type: OptionalString,
|
type: OptionalString,
|
||||||
description: `
|
description: "foo",
|
||||||
Securely bind code-server via our cloud service with the passed name. You'll get a URL like
|
|
||||||
https://hostname-username.coder.co at which you can easily access your code-server instance.
|
|
||||||
Authorization is done via GitHub.
|
|
||||||
`,
|
|
||||||
deprecated: true,
|
deprecated: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
expect(optionDescriptions(opts)).toStrictEqual([
|
expect(optionDescriptions(opts)).toStrictEqual([" --cert (deprecated) foo"])
|
||||||
` --link (deprecated) Securely bind code-server via our cloud service with the passed name. You'll get a URL like
|
|
||||||
https://hostname-username.coder.co at which you can easily access your code-server instance.
|
|
||||||
Authorization is done via GitHub.`,
|
|
||||||
])
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should show newlines in description", () => {
|
it("should show newlines in description", () => {
|
||||||
|
|
Loading…
Reference in New Issue