Merge branch 'main' into atif/validate-readme-source
This commit is contained in:
commit
5419676276
@ -2,7 +2,7 @@
|
|||||||
display_name: Amp CLI
|
display_name: Amp CLI
|
||||||
icon: ../../../../.icons/sourcegraph-amp.svg
|
icon: ../../../../.icons/sourcegraph-amp.svg
|
||||||
description: Sourcegraph's AI coding agent with deep codebase understanding and intelligent code search capabilities
|
description: Sourcegraph's AI coding agent with deep codebase understanding and intelligent code search capabilities
|
||||||
verified: false
|
verified: true
|
||||||
tags: [agent, sourcegraph, amp, ai, tasks]
|
tags: [agent, sourcegraph, amp, ai, tasks]
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -13,7 +13,7 @@ Run [Amp CLI](https://ampcode.com/) in your workspace to access Sourcegraph's AI
|
|||||||
```tf
|
```tf
|
||||||
module "amp-cli" {
|
module "amp-cli" {
|
||||||
source = "registry.coder.com/coder-labs/sourcegraph-amp/coder"
|
source = "registry.coder.com/coder-labs/sourcegraph-amp/coder"
|
||||||
version = "1.0.2"
|
version = "1.0.3"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
sourcegraph_amp_api_key = var.sourcegraph_amp_api_key
|
sourcegraph_amp_api_key = var.sourcegraph_amp_api_key
|
||||||
install_sourcegraph_amp = true
|
install_sourcegraph_amp = true
|
||||||
@ -60,7 +60,7 @@ variable "sourcegraph_amp_api_key" {
|
|||||||
module "amp-cli" {
|
module "amp-cli" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder-labs/sourcegraph-amp/coder"
|
source = "registry.coder.com/coder-labs/sourcegraph-amp/coder"
|
||||||
version = "1.0.2"
|
version = "1.0.3"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
sourcegraph_amp_api_key = var.sourcegraph_amp_api_key # recommended for authenticated usage
|
sourcegraph_amp_api_key = var.sourcegraph_amp_api_key # recommended for authenticated usage
|
||||||
install_sourcegraph_amp = true
|
install_sourcegraph_amp = true
|
||||||
|
|||||||
@ -16,7 +16,7 @@ Install the JF CLI and authenticate package managers with Artifactory using OAut
|
|||||||
module "jfrog" {
|
module "jfrog" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/jfrog-oauth/coder"
|
source = "registry.coder.com/coder/jfrog-oauth/coder"
|
||||||
version = "1.0.31"
|
version = "1.1.0"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
jfrog_url = "https://example.jfrog.io"
|
jfrog_url = "https://example.jfrog.io"
|
||||||
username_field = "username" # If you are using GitHub to login to both Coder and Artifactory, use username_field = "username"
|
username_field = "username" # If you are using GitHub to login to both Coder and Artifactory, use username_field = "username"
|
||||||
@ -26,6 +26,7 @@ module "jfrog" {
|
|||||||
go = ["go", "another-go-repo"]
|
go = ["go", "another-go-repo"]
|
||||||
pypi = ["pypi", "extra-index-pypi"]
|
pypi = ["pypi", "extra-index-pypi"]
|
||||||
docker = ["example-docker-staging.jfrog.io", "example-docker-production.jfrog.io"]
|
docker = ["example-docker-staging.jfrog.io", "example-docker-production.jfrog.io"]
|
||||||
|
conda = ["conda", "conda-local"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@ -45,7 +46,7 @@ Configure the Python pip package manager to fetch packages from Artifactory whil
|
|||||||
module "jfrog" {
|
module "jfrog" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/jfrog-oauth/coder"
|
source = "registry.coder.com/coder/jfrog-oauth/coder"
|
||||||
version = "1.0.31"
|
version = "1.1.0"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
jfrog_url = "https://example.jfrog.io"
|
jfrog_url = "https://example.jfrog.io"
|
||||||
username_field = "email"
|
username_field = "email"
|
||||||
@ -74,7 +75,7 @@ The [JFrog extension](https://open-vsx.org/extension/JFrog/jfrog-vscode-extensio
|
|||||||
module "jfrog" {
|
module "jfrog" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/jfrog-oauth/coder"
|
source = "registry.coder.com/coder/jfrog-oauth/coder"
|
||||||
version = "1.0.31"
|
version = "1.1.0"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
jfrog_url = "https://example.jfrog.io"
|
jfrog_url = "https://example.jfrog.io"
|
||||||
username_field = "username" # If you are using GitHub to login to both Coder and Artifactory, use username_field = "username"
|
username_field = "username" # If you are using GitHub to login to both Coder and Artifactory, use username_field = "username"
|
||||||
|
|||||||
6
registry/coder/modules/jfrog-oauth/conda.conf.tftpl
Normal file
6
registry/coder/modules/jfrog-oauth/conda.conf.tftpl
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
channels:
|
||||||
|
%{ for REPO in REPOS ~}
|
||||||
|
- https://${ARTIFACTORY_USERNAME}:${ARTIFACTORY_ACCESS_TOKEN}@${JFROG_HOST}/artifactory/api/conda/${REPO}
|
||||||
|
%{ endfor ~}
|
||||||
|
- defaults
|
||||||
|
ssl_verify: true
|
||||||
@ -126,4 +126,28 @@ EOF`;
|
|||||||
'if [ -z "YES" ]; then\n not_configured go',
|
'if [ -z "YES" ]; then\n not_configured go',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("generates a conda config with multiple repos", async () => {
|
||||||
|
const state = await runTerraformApply<TestVariables>(import.meta.dir, {
|
||||||
|
agent_id: "some-agent-id",
|
||||||
|
jfrog_url: fakeFrogUrl,
|
||||||
|
package_managers: JSON.stringify({
|
||||||
|
conda: ["conda-main", "conda-secondary", "conda-local"],
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
const coderScript = findResourceInstance(state, "coder_script");
|
||||||
|
const condaStanza = `cat << EOF > ~/.condarc
|
||||||
|
channels:
|
||||||
|
- https://${user}:@${fakeFrogApi}/conda/conda-main
|
||||||
|
- https://${user}:@${fakeFrogApi}/conda/conda-secondary
|
||||||
|
- https://${user}:@${fakeFrogApi}/conda/conda-local
|
||||||
|
- defaults
|
||||||
|
ssl_verify: true
|
||||||
|
|
||||||
|
EOF`;
|
||||||
|
expect(coderScript.script).toContain(condaStanza);
|
||||||
|
expect(coderScript.script).toContain(
|
||||||
|
'if [ -z "YES" ]; then\n not_configured conda',
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -58,6 +58,7 @@ variable "package_managers" {
|
|||||||
go = optional(list(string), [])
|
go = optional(list(string), [])
|
||||||
pypi = optional(list(string), [])
|
pypi = optional(list(string), [])
|
||||||
docker = optional(list(string), [])
|
docker = optional(list(string), [])
|
||||||
|
conda = optional(list(string), [])
|
||||||
})
|
})
|
||||||
description = <<-EOF
|
description = <<-EOF
|
||||||
A map of package manager names to their respective artifactory repositories. Unused package managers can be omitted.
|
A map of package manager names to their respective artifactory repositories. Unused package managers can be omitted.
|
||||||
@ -67,6 +68,7 @@ variable "package_managers" {
|
|||||||
go = ["YOUR_GO_REPO_KEY", "ANOTHER_GO_REPO_KEY"]
|
go = ["YOUR_GO_REPO_KEY", "ANOTHER_GO_REPO_KEY"]
|
||||||
pypi = ["YOUR_PYPI_REPO_KEY", "ANOTHER_PYPI_REPO_KEY"]
|
pypi = ["YOUR_PYPI_REPO_KEY", "ANOTHER_PYPI_REPO_KEY"]
|
||||||
docker = ["YOUR_DOCKER_REPO_KEY", "ANOTHER_DOCKER_REPO_KEY"]
|
docker = ["YOUR_DOCKER_REPO_KEY", "ANOTHER_DOCKER_REPO_KEY"]
|
||||||
|
conda = ["YOUR_CONDA_REPO_KEY", "ANOTHER_CONDA_REPO_KEY"]
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
@ -98,6 +100,9 @@ locals {
|
|||||||
pip_conf = templatefile(
|
pip_conf = templatefile(
|
||||||
"${path.module}/pip.conf.tftpl", merge(local.common_values, { REPOS = var.package_managers.pypi })
|
"${path.module}/pip.conf.tftpl", merge(local.common_values, { REPOS = var.package_managers.pypi })
|
||||||
)
|
)
|
||||||
|
conda_conf = templatefile(
|
||||||
|
"${path.module}/conda.conf.tftpl", merge(local.common_values, { REPOS = var.package_managers.conda })
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
data "coder_workspace" "me" {}
|
data "coder_workspace" "me" {}
|
||||||
@ -125,6 +130,9 @@ resource "coder_script" "jfrog" {
|
|||||||
REPOSITORY_PYPI = try(element(var.package_managers.pypi, 0), "")
|
REPOSITORY_PYPI = try(element(var.package_managers.pypi, 0), "")
|
||||||
HAS_DOCKER = length(var.package_managers.docker) == 0 ? "" : "YES"
|
HAS_DOCKER = length(var.package_managers.docker) == 0 ? "" : "YES"
|
||||||
REGISTER_DOCKER = join("\n", formatlist("register_docker \"%s\"", var.package_managers.docker))
|
REGISTER_DOCKER = join("\n", formatlist("register_docker \"%s\"", var.package_managers.docker))
|
||||||
|
HAS_CONDA = length(var.package_managers.conda) == 0 ? "" : "YES"
|
||||||
|
CONDA_CONF = local.conda_conf
|
||||||
|
REPOSITORY_CONDA = try(element(var.package_managers.conda, 0), "")
|
||||||
}
|
}
|
||||||
))
|
))
|
||||||
run_on_start = true
|
run_on_start = true
|
||||||
|
|||||||
@ -81,6 +81,19 @@ else
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Configure conda to use the Artifactory "conda" repository.
|
||||||
|
if [ -z "${HAS_CONDA}" ]; then
|
||||||
|
not_configured conda
|
||||||
|
else
|
||||||
|
echo "🐍 Configuring conda..."
|
||||||
|
# Create conda config directory if it doesn't exist
|
||||||
|
mkdir -p ~/.conda
|
||||||
|
cat << EOF > ~/.condarc
|
||||||
|
${CONDA_CONF}
|
||||||
|
EOF
|
||||||
|
config_complete
|
||||||
|
fi
|
||||||
|
|
||||||
# Install the JFrog vscode extension for code-server.
|
# Install the JFrog vscode extension for code-server.
|
||||||
if [ "${CONFIGURE_CODE_SERVER}" == "true" ]; then
|
if [ "${CONFIGURE_CODE_SERVER}" == "true" ]; then
|
||||||
while ! [ -x /tmp/code-server/bin/code-server ]; do
|
while ! [ -x /tmp/code-server/bin/code-server ]; do
|
||||||
|
|||||||
@ -13,7 +13,7 @@ Install the JF CLI and authenticate package managers with Artifactory using Arti
|
|||||||
```tf
|
```tf
|
||||||
module "jfrog" {
|
module "jfrog" {
|
||||||
source = "registry.coder.com/coder/jfrog-token/coder"
|
source = "registry.coder.com/coder/jfrog-token/coder"
|
||||||
version = "1.0.31"
|
version = "1.1.0"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
jfrog_url = "https://XXXX.jfrog.io"
|
jfrog_url = "https://XXXX.jfrog.io"
|
||||||
artifactory_access_token = var.artifactory_access_token
|
artifactory_access_token = var.artifactory_access_token
|
||||||
@ -22,6 +22,7 @@ module "jfrog" {
|
|||||||
go = ["go", "another-go-repo"]
|
go = ["go", "another-go-repo"]
|
||||||
pypi = ["pypi", "extra-index-pypi"]
|
pypi = ["pypi", "extra-index-pypi"]
|
||||||
docker = ["example-docker-staging.jfrog.io", "example-docker-production.jfrog.io"]
|
docker = ["example-docker-staging.jfrog.io", "example-docker-production.jfrog.io"]
|
||||||
|
conda = ["conda", "conda-local"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@ -40,7 +41,7 @@ For detailed instructions, please see this [guide](https://coder.com/docs/v2/lat
|
|||||||
```tf
|
```tf
|
||||||
module "jfrog" {
|
module "jfrog" {
|
||||||
source = "registry.coder.com/coder/jfrog-token/coder"
|
source = "registry.coder.com/coder/jfrog-token/coder"
|
||||||
version = "1.0.31"
|
version = "1.1.0"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
jfrog_url = "https://YYYY.jfrog.io"
|
jfrog_url = "https://YYYY.jfrog.io"
|
||||||
artifactory_access_token = var.artifactory_access_token # An admin access token
|
artifactory_access_token = var.artifactory_access_token # An admin access token
|
||||||
@ -48,22 +49,25 @@ module "jfrog" {
|
|||||||
npm = ["npm-local"]
|
npm = ["npm-local"]
|
||||||
go = ["go-local"]
|
go = ["go-local"]
|
||||||
pypi = ["pypi-local"]
|
pypi = ["pypi-local"]
|
||||||
|
conda = ["conda-local"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
You should now be able to install packages from Artifactory using both the `jf npm`, `jf go`, `jf pip` and `npm`, `go`, `pip` commands.
|
You should now be able to install packages from Artifactory using both the `jf npm`, `jf go`, `jf pip` and `npm`, `go`, `pip`, `conda` commands.
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
jf npm install prettier
|
jf npm install prettier
|
||||||
jf go get github.com/golang/example/hello
|
jf go get github.com/golang/example/hello
|
||||||
jf pip install requests
|
jf pip install requests
|
||||||
|
conda install numpy
|
||||||
```
|
```
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
npm install prettier
|
npm install prettier
|
||||||
go get github.com/golang/example/hello
|
go get github.com/golang/example/hello
|
||||||
pip install requests
|
pip install requests
|
||||||
|
conda install numpy
|
||||||
```
|
```
|
||||||
|
|
||||||
### Configure code-server with JFrog extension
|
### Configure code-server with JFrog extension
|
||||||
@ -73,7 +77,7 @@ The [JFrog extension](https://open-vsx.org/extension/JFrog/jfrog-vscode-extensio
|
|||||||
```tf
|
```tf
|
||||||
module "jfrog" {
|
module "jfrog" {
|
||||||
source = "registry.coder.com/coder/jfrog-token/coder"
|
source = "registry.coder.com/coder/jfrog-token/coder"
|
||||||
version = "1.0.31"
|
version = "1.1.0"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
jfrog_url = "https://XXXX.jfrog.io"
|
jfrog_url = "https://XXXX.jfrog.io"
|
||||||
artifactory_access_token = var.artifactory_access_token
|
artifactory_access_token = var.artifactory_access_token
|
||||||
@ -93,7 +97,7 @@ data "coder_workspace" "me" {}
|
|||||||
|
|
||||||
module "jfrog" {
|
module "jfrog" {
|
||||||
source = "registry.coder.com/coder/jfrog-token/coder"
|
source = "registry.coder.com/coder/jfrog-token/coder"
|
||||||
version = "1.0.31"
|
version = "1.1.0"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
jfrog_url = "https://XXXX.jfrog.io"
|
jfrog_url = "https://XXXX.jfrog.io"
|
||||||
artifactory_access_token = var.artifactory_access_token
|
artifactory_access_token = var.artifactory_access_token
|
||||||
|
|||||||
6
registry/coder/modules/jfrog-token/conda.conf.tftpl
Normal file
6
registry/coder/modules/jfrog-token/conda.conf.tftpl
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
channels:
|
||||||
|
%{ for REPO in REPOS ~}
|
||||||
|
- https://${ARTIFACTORY_USERNAME}:${ARTIFACTORY_ACCESS_TOKEN}@${JFROG_HOST}/artifactory/api/conda/${REPO}
|
||||||
|
%{ endfor ~}
|
||||||
|
- defaults
|
||||||
|
ssl_verify: true
|
||||||
@ -162,4 +162,29 @@ EOF`;
|
|||||||
'if [ -z "YES" ]; then\n not_configured go',
|
'if [ -z "YES" ]; then\n not_configured go',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("generates a conda config with multiple repos", async () => {
|
||||||
|
const state = await runTerraformApply<TestVariables>(import.meta.dir, {
|
||||||
|
agent_id: "some-agent-id",
|
||||||
|
jfrog_url: fakeFrogUrl,
|
||||||
|
artifactory_access_token: "XXXX",
|
||||||
|
package_managers: JSON.stringify({
|
||||||
|
conda: ["conda-main", "conda-secondary", "conda-local"],
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
const coderScript = findResourceInstance(state, "coder_script");
|
||||||
|
const condaStanza = `cat << EOF > ~/.condarc
|
||||||
|
channels:
|
||||||
|
- https://${user}:${token}@${fakeFrogApi}/conda/conda-main
|
||||||
|
- https://${user}:${token}@${fakeFrogApi}/conda/conda-secondary
|
||||||
|
- https://${user}:${token}@${fakeFrogApi}/conda/conda-local
|
||||||
|
- defaults
|
||||||
|
ssl_verify: true
|
||||||
|
|
||||||
|
EOF`;
|
||||||
|
expect(coderScript.script).toContain(condaStanza);
|
||||||
|
expect(coderScript.script).toContain(
|
||||||
|
'if [ -z "YES" ]; then\n not_configured conda',
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -91,6 +91,7 @@ variable "package_managers" {
|
|||||||
go = optional(list(string), [])
|
go = optional(list(string), [])
|
||||||
pypi = optional(list(string), [])
|
pypi = optional(list(string), [])
|
||||||
docker = optional(list(string), [])
|
docker = optional(list(string), [])
|
||||||
|
conda = optional(list(string), [])
|
||||||
})
|
})
|
||||||
description = <<-EOF
|
description = <<-EOF
|
||||||
A map of package manager names to their respective artifactory repositories. Unused package managers can be omitted.
|
A map of package manager names to their respective artifactory repositories. Unused package managers can be omitted.
|
||||||
@ -100,6 +101,7 @@ variable "package_managers" {
|
|||||||
go = ["YOUR_GO_REPO_KEY", "ANOTHER_GO_REPO_KEY"]
|
go = ["YOUR_GO_REPO_KEY", "ANOTHER_GO_REPO_KEY"]
|
||||||
pypi = ["YOUR_PYPI_REPO_KEY", "ANOTHER_PYPI_REPO_KEY"]
|
pypi = ["YOUR_PYPI_REPO_KEY", "ANOTHER_PYPI_REPO_KEY"]
|
||||||
docker = ["YOUR_DOCKER_REPO_KEY", "ANOTHER_DOCKER_REPO_KEY"]
|
docker = ["YOUR_DOCKER_REPO_KEY", "ANOTHER_DOCKER_REPO_KEY"]
|
||||||
|
conda = ["YOUR_CONDA_REPO_KEY", "ANOTHER_CONDA_REPO_KEY"]
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
@ -131,6 +133,9 @@ locals {
|
|||||||
pip_conf = templatefile(
|
pip_conf = templatefile(
|
||||||
"${path.module}/pip.conf.tftpl", merge(local.common_values, { REPOS = var.package_managers.pypi })
|
"${path.module}/pip.conf.tftpl", merge(local.common_values, { REPOS = var.package_managers.pypi })
|
||||||
)
|
)
|
||||||
|
conda_conf = templatefile(
|
||||||
|
"${path.module}/conda.conf.tftpl", merge(local.common_values, { REPOS = var.package_managers.conda })
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
# Configure the Artifactory provider
|
# Configure the Artifactory provider
|
||||||
@ -171,6 +176,9 @@ resource "coder_script" "jfrog" {
|
|||||||
REPOSITORY_PYPI = try(element(var.package_managers.pypi, 0), "")
|
REPOSITORY_PYPI = try(element(var.package_managers.pypi, 0), "")
|
||||||
HAS_DOCKER = length(var.package_managers.docker) == 0 ? "" : "YES"
|
HAS_DOCKER = length(var.package_managers.docker) == 0 ? "" : "YES"
|
||||||
REGISTER_DOCKER = join("\n", formatlist("register_docker \"%s\"", var.package_managers.docker))
|
REGISTER_DOCKER = join("\n", formatlist("register_docker \"%s\"", var.package_managers.docker))
|
||||||
|
HAS_CONDA = length(var.package_managers.conda) == 0 ? "" : "YES"
|
||||||
|
CONDA_CONF = local.conda_conf
|
||||||
|
REPOSITORY_CONDA = try(element(var.package_managers.conda, 0), "")
|
||||||
}
|
}
|
||||||
))
|
))
|
||||||
run_on_start = true
|
run_on_start = true
|
||||||
|
|||||||
@ -80,6 +80,19 @@ else
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Configure conda to use the Artifactory "conda" repository.
|
||||||
|
if [ -z "${HAS_CONDA}" ]; then
|
||||||
|
not_configured conda
|
||||||
|
else
|
||||||
|
echo "🐍 Configuring conda..."
|
||||||
|
# Create conda config directory if it doesn't exist
|
||||||
|
mkdir -p ~/.conda
|
||||||
|
cat << EOF > ~/.condarc
|
||||||
|
${CONDA_CONF}
|
||||||
|
EOF
|
||||||
|
config_complete
|
||||||
|
fi
|
||||||
|
|
||||||
# Install the JFrog vscode extension for code-server.
|
# Install the JFrog vscode extension for code-server.
|
||||||
if [ "${CONFIGURE_CODE_SERVER}" == "true" ]; then
|
if [ "${CONFIGURE_CODE_SERVER}" == "true" ]; then
|
||||||
while ! [ -x /tmp/code-server/bin/code-server ]; do
|
while ! [ -x /tmp/code-server/bin/code-server ]; do
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user