mirror of
https://github.com/coder/code-server.git
synced 2024-12-05 07:13:06 +08:00
126 lines
3.2 KiB
Bash
Executable File
126 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
pushd() {
|
|
builtin pushd "$@" >/dev/null
|
|
}
|
|
|
|
popd() {
|
|
builtin popd >/dev/null
|
|
}
|
|
|
|
pkg_json_version() {
|
|
jq -r .version package.json
|
|
}
|
|
|
|
vscode_version() {
|
|
jq -r .version lib/vscode/package.json
|
|
}
|
|
|
|
os() {
|
|
local os
|
|
os=$(uname | tr '[:upper:]' '[:lower:]')
|
|
if [[ $os == "linux" ]]; then
|
|
# Alpine's ldd doesn't have a version flag but if you use an invalid flag
|
|
# (like --version) it outputs the version to stderr and exits with 1.
|
|
local ldd_output
|
|
ldd_output=$(ldd --version 2>&1 || true)
|
|
if echo "$ldd_output" | grep -iq musl; then
|
|
os="alpine"
|
|
fi
|
|
elif [[ $os == "darwin" ]]; then
|
|
os="macos"
|
|
fi
|
|
echo "$os"
|
|
}
|
|
|
|
arch() {
|
|
case "$(uname -m)" in
|
|
aarch64)
|
|
echo arm64
|
|
;;
|
|
x86_64 | amd64)
|
|
echo amd64
|
|
;;
|
|
*)
|
|
echo "unknown architecture $(uname -a)"
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
curl() {
|
|
command curl -H "Authorization: token $GITHUB_TOKEN" "$@"
|
|
}
|
|
|
|
# Grabs the most recent ci.yaml github workflow run that was successful and triggered from the same commit being pushd.
|
|
# This will contain the artifacts we want.
|
|
# https://developer.github.com/v3/actions/workflow-runs/#list-workflow-runs
|
|
get_artifacts_url() {
|
|
local head_sha
|
|
local artifacts_url
|
|
head_sha=$(git rev-parse HEAD)
|
|
artifacts_url=$(curl -fsSL 'https://api.github.com/repos/cdr/code-server/actions/workflows/ci.yaml/runs?status=success&event=pull_request' | jq -r ".workflow_runs[] | select(.head_sha == \"$head_sha\") | .artifacts_url" | head -n 1)
|
|
if [[ -z "$artifacts_url" ]]; then
|
|
echo >&2 "ERROR: artifacts_url came back empty"
|
|
echo >&2 "Check the get_artifacts_url function"
|
|
exit 1
|
|
fi
|
|
|
|
echo "$artifacts_url"
|
|
}
|
|
|
|
# Grabs the artifact's download url.
|
|
# https://developer.github.com/v3/actions/artifacts/#list-workflow-run-artifacts
|
|
get_artifact_url() {
|
|
local artifact_name="$1"
|
|
curl -fsSL "$(get_artifacts_url)" | jq -r ".artifacts[] | select(.name == \"$artifact_name\") | .archive_download_url" | head -n 1
|
|
}
|
|
|
|
# Uses the above two functions to download a artifact into a directory.
|
|
download_artifact() {
|
|
local artifact_name="$1"
|
|
local dst="$2"
|
|
|
|
local tmp_file
|
|
tmp_file="$(mktemp)"
|
|
|
|
curl -fsSL "$(get_artifact_url "$artifact_name")" >"$tmp_file"
|
|
unzip -q -o "$tmp_file" -d "$dst"
|
|
rm "$tmp_file"
|
|
}
|
|
|
|
rsync() {
|
|
command rsync -a --del "$@"
|
|
}
|
|
|
|
VERSION="$(pkg_json_version)"
|
|
export VERSION
|
|
ARCH="$(arch)"
|
|
export ARCH
|
|
OS=$(os)
|
|
export OS
|
|
|
|
# RELEASE_PATH is the destination directory for the release from the root.
|
|
# Defaults to release
|
|
RELEASE_PATH="${RELEASE_PATH-release}"
|
|
|
|
# VS Code bundles some modules into an asar which is an archive format that
|
|
# works like tar. It then seems to get unpacked into node_modules.asar.
|
|
#
|
|
# I don't know why they do this but all the dependencies they bundle already
|
|
# exist in node_modules so just symlink it. We have to do this since not only VS
|
|
# Code itself but also extensions will look specifically in this directory for
|
|
# files (like the ripgrep binary or the oniguruma wasm).
|
|
symlink_asar() {
|
|
if [ ! -L node_modules.asar ]; then
|
|
if [ "${WINDIR-}" ]; then
|
|
# mklink takes the link name first.
|
|
mklink /J node_modules.asar node_modules
|
|
else
|
|
# ln takes the link name second.
|
|
ln -s node_modules node_modules.asar
|
|
fi
|
|
fi
|
|
}
|