From bdf2a9809c10a75afd16276432bac0dc266efb9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?McKayla=20=E3=81=AF=E3=81=AA?= Date: Fri, 11 Sep 2026 21:57:31 +0000 Subject: [PATCH 1/5] chore: remove stale TODO shims and dead code --- cli/configssh.go | 11 +--------- coderd/httpmw/organizationparam.go | 9 +-------- coderd/httpmw/organizationparam_test.go | 11 ---------- .../timings-aggregation/fake-terraform.sh | 3 --- vpn/tun_windows.go | 20 ------------------- 5 files changed, 2 insertions(+), 52 deletions(-) diff --git a/cli/configssh.go b/cli/configssh.go index f618418e5d3..db344ed6c2a 100644 --- a/cli/configssh.go +++ b/cli/configssh.go @@ -7,7 +7,6 @@ import ( "fmt" "io" "io/fs" - "net/http" "os" "path/filepath" "runtime" @@ -456,15 +455,7 @@ func (r *RootCmd) configSSH() *serpent.Command { coderdConfig, err := client.SSHConfiguration(ctx) if err != nil { - // If the error is 404, this deployment does not support - // this endpoint yet. Do not error, just assume defaults. - // TODO: Remove this in 2 months (May 31, 2023). Just return the error - // and remove this 404 check. - var sdkErr *codersdk.Error - if !xerrors.As(err, &sdkErr) || sdkErr.StatusCode() != http.StatusNotFound { - return xerrors.Errorf("fetch coderd config failed: %w", err) - } - coderdConfig.HostnamePrefix = "coder." + return xerrors.Errorf("fetch coderd config failed: %w", err) } configOptions, err := mergeSSHOptions(sshConfigOpts, coderdConfig, string(root), coderBinary) diff --git a/coderd/httpmw/organizationparam.go b/coderd/httpmw/organizationparam.go index 349ffe25e6c..d62ca67eaef 100644 --- a/coderd/httpmw/organizationparam.go +++ b/coderd/httpmw/organizationparam.go @@ -69,14 +69,7 @@ func ExtractOrganizationParam(db database.Store) func(http.Handler) http.Handler // If the name is exactly "default", then we fetch the default // organization. This is a special case to make it easier // for single org deployments. - // - // arg == uuid.Nil.String() should be a temporary workaround for - // legacy provisioners that don't provide an organization ID. - // This prevents a breaking change. - // TODO: This change was added March 2024. Nil uuid returning the - // default org should be removed some number of months after - // that date. - if arg == codersdk.DefaultOrganization || arg == uuid.Nil.String() { + if arg == codersdk.DefaultOrganization { organization, dbErr = db.GetDefaultOrganization(ctx) } else { // Try by name or uuid. diff --git a/coderd/httpmw/organizationparam_test.go b/coderd/httpmw/organizationparam_test.go index 5ebbc429e15..aef26bc7bcf 100644 --- a/coderd/httpmw/organizationparam_test.go +++ b/coderd/httpmw/organizationparam_test.go @@ -227,16 +227,5 @@ func TestOrganizationParam(t *testing.T) { res = rw.Result() defer res.Body.Close() require.Equal(t, http.StatusOK, res.StatusCode, "by default keyword") - - // Try by legacy - // TODO: This can be removed when legacy nil uuids are no longer supported. - // This is a temporary measure to ensure as legacy provisioners use - // nil uuids as the org id and expect the default org. - chi.RouteContext(r.Context()).URLParams.Add("organization", uuid.Nil.String()) - chi.RouteContext(r.Context()).URLParams.Add("user", user.ID.String()) - rtr.ServeHTTP(rw, r) - res = rw.Result() - defer res.Body.Close() - require.Equal(t, http.StatusOK, res.StatusCode, "by nil uuid (legacy)") }) } diff --git a/provisioner/terraform/testdata/timings-aggregation/fake-terraform.sh b/provisioner/terraform/testdata/timings-aggregation/fake-terraform.sh index 582df28c621..96a310a5938 100755 --- a/provisioner/terraform/testdata/timings-aggregation/fake-terraform.sh +++ b/provisioner/terraform/testdata/timings-aggregation/fake-terraform.sh @@ -123,9 +123,6 @@ function terraform_apply() { EOL } -# TODO: remove -echo "$@" >>/tmp/blah - case "$1" in version) terraform_version diff --git a/vpn/tun_windows.go b/vpn/tun_windows.go index fadf6caf27d..c91308df81a 100644 --- a/vpn/tun_windows.go +++ b/vpn/tun_windows.go @@ -138,23 +138,3 @@ func windowsUptime() time.Duration { r, _, _ := getTickCount64Proc.Call() return time.Duration(int64(r)) * time.Millisecond } - -// TODO(@dean): implement a way to install/uninstall the wintun driver, most -// likely as a CLI command -// -// This is taken from Tailscale: -// https://github.com/tailscale/tailscale/blob/3abfbf50aebbe3ba57dc749165edb56be6715c0a/cmd/tailscaled/tailscaled_windows.go#L543 -func uninstallWinTun(logf logger.Logf) { - dll := windows.NewLazyDLL("wintun.dll") - if err := dll.Load(); err != nil { - logf("Cannot load wintun.dll for uninstall: %v", err) - return - } - - logf("Removing wintun driver...") - err := wintun.Uninstall() - logf("Uninstall: %v", err) -} - -// TODO(@dean): remove -var _ = uninstallWinTun From b25dd386fb965e953b260e413e8aeb6f9514a134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?McKayla=20=E3=81=AF=E3=81=AA?= Date: Fri, 11 Sep 2026 22:14:41 +0000 Subject: [PATCH 2/5] chore: keep nil uuid default org behavior and wintun uninstall --- coderd/httpmw/organizationparam.go | 9 +++++---- coderd/httpmw/organizationparam_test.go | 8 ++++++++ vpn/tun_windows.go | 20 ++++++++++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/coderd/httpmw/organizationparam.go b/coderd/httpmw/organizationparam.go index d62ca67eaef..35744463fd4 100644 --- a/coderd/httpmw/organizationparam.go +++ b/coderd/httpmw/organizationparam.go @@ -66,10 +66,11 @@ func ExtractOrganizationParam(db database.Store) func(http.Handler) http.Handler var organization database.Organization var dbErr error - // If the name is exactly "default", then we fetch the default - // organization. This is a special case to make it easier - // for single org deployments. - if arg == codersdk.DefaultOrganization { + // If the name is exactly "default" or the nil UUID, then we fetch + // the default organization. This is a special case to make it + // easier for single org deployments, and external callers depend + // on the nil UUID resolving to the default org. + if arg == codersdk.DefaultOrganization || arg == uuid.Nil.String() { organization, dbErr = db.GetDefaultOrganization(ctx) } else { // Try by name or uuid. diff --git a/coderd/httpmw/organizationparam_test.go b/coderd/httpmw/organizationparam_test.go index aef26bc7bcf..3d12e805847 100644 --- a/coderd/httpmw/organizationparam_test.go +++ b/coderd/httpmw/organizationparam_test.go @@ -227,5 +227,13 @@ func TestOrganizationParam(t *testing.T) { res = rw.Result() defer res.Body.Close() require.Equal(t, http.StatusOK, res.StatusCode, "by default keyword") + + // Try by nil uuid, which resolves to the default org. + chi.RouteContext(r.Context()).URLParams.Add("organization", uuid.Nil.String()) + chi.RouteContext(r.Context()).URLParams.Add("user", user.ID.String()) + rtr.ServeHTTP(rw, r) + res = rw.Result() + defer res.Body.Close() + require.Equal(t, http.StatusOK, res.StatusCode, "by nil uuid (legacy)") }) } diff --git a/vpn/tun_windows.go b/vpn/tun_windows.go index c91308df81a..fadf6caf27d 100644 --- a/vpn/tun_windows.go +++ b/vpn/tun_windows.go @@ -138,3 +138,23 @@ func windowsUptime() time.Duration { r, _, _ := getTickCount64Proc.Call() return time.Duration(int64(r)) * time.Millisecond } + +// TODO(@dean): implement a way to install/uninstall the wintun driver, most +// likely as a CLI command +// +// This is taken from Tailscale: +// https://github.com/tailscale/tailscale/blob/3abfbf50aebbe3ba57dc749165edb56be6715c0a/cmd/tailscaled/tailscaled_windows.go#L543 +func uninstallWinTun(logf logger.Logf) { + dll := windows.NewLazyDLL("wintun.dll") + if err := dll.Load(); err != nil { + logf("Cannot load wintun.dll for uninstall: %v", err) + return + } + + logf("Removing wintun driver...") + err := wintun.Uninstall() + logf("Uninstall: %v", err) +} + +// TODO(@dean): remove +var _ = uninstallWinTun From d99c163ee9add3b66332861ec88ca74967bc2adc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?McKayla=20=E3=81=AF=E3=81=AA?= Date: Fri, 11 Sep 2026 16:30:40 -0600 Subject: [PATCH 3/5] Update coderd/httpmw/organizationparam.go --- coderd/httpmw/organizationparam.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/coderd/httpmw/organizationparam.go b/coderd/httpmw/organizationparam.go index 35744463fd4..089188b9c91 100644 --- a/coderd/httpmw/organizationparam.go +++ b/coderd/httpmw/organizationparam.go @@ -68,8 +68,7 @@ func ExtractOrganizationParam(db database.Store) func(http.Handler) http.Handler // If the name is exactly "default" or the nil UUID, then we fetch // the default organization. This is a special case to make it - // easier for single org deployments, and external callers depend - // on the nil UUID resolving to the default org. + // easier for single org deployments. if arg == codersdk.DefaultOrganization || arg == uuid.Nil.String() { organization, dbErr = db.GetDefaultOrganization(ctx) } else { From 2cf09aee6a1c041a45d43461bf786534a47823cf Mon Sep 17 00:00:00 2001 From: McKayla Washburn-Love Date: Fri, 11 Sep 2026 22:50:49 +0000 Subject: [PATCH 4/5] more --- coderd/wsbuilder/wsbuilder.go | 6 +---- codersdk/users.go | 48 +---------------------------------- 2 files changed, 2 insertions(+), 52 deletions(-) diff --git a/coderd/wsbuilder/wsbuilder.go b/coderd/wsbuilder/wsbuilder.go index 45071f0ccbe..16cac866d69 100644 --- a/coderd/wsbuilder/wsbuilder.go +++ b/coderd/wsbuilder/wsbuilder.go @@ -1394,9 +1394,5 @@ func (b *Builder) usingDynamicParameters() bool { if err != nil { return false // Let another part of the code get this error } - if tpl.UseClassicParameterFlow { - return false - } - - return true + return !tpl.UseClassicParameterFlow } diff --git a/codersdk/users.go b/codersdk/users.go index c784c13e8c9..98925146c89 100644 --- a/codersdk/users.go +++ b/codersdk/users.go @@ -2,7 +2,6 @@ package codersdk import ( "context" - "encoding/json" "fmt" "net/http" "strconv" @@ -165,26 +164,7 @@ type CreateFirstUserResponse struct { OrganizationID uuid.UUID `json:"organization_id" format:"uuid"` } -// CreateUserRequest -// Deprecated: Use CreateUserRequestWithOrgs instead. This will be removed. -// TODO: When removing, we should rename CreateUserRequestWithOrgs -> CreateUserRequest -// Then alias CreateUserRequestWithOrgs to CreateUserRequest. -// @typescript-ignore CreateUserRequest type CreateUserRequest struct { - Email string `json:"email" validate:"required,email" format:"email"` - Username string `json:"username" validate:"required,username"` - Name string `json:"name" validate:"user_real_name"` - Password string `json:"password"` - // UserLoginType defaults to LoginTypePassword. - UserLoginType LoginType `json:"login_type"` - // DisableLogin sets the user's login type to 'none'. This prevents the user - // from being able to use a password or any other authentication method to login. - // Deprecated: Set UserLoginType=LoginTypeDisabled instead. - DisableLogin bool `json:"disable_login"` - OrganizationID uuid.UUID `json:"organization_id" validate:"" format:"uuid"` -} - -type CreateUserRequestWithOrgs struct { Email string `json:"email" validate:"required_unless=ServiceAccount true,omitempty,email" format:"email"` Username string `json:"username" validate:"required,username"` Name string `json:"name" validate:"user_real_name"` @@ -201,33 +181,7 @@ type CreateUserRequestWithOrgs struct { Roles []string `json:"roles,omitempty"` } -// UnmarshalJSON implements the unmarshal for the legacy param "organization_id". -// To accommodate multiple organizations, the field has been switched to a slice. -// The previous field will just be appended to the slice. -// Note in the previous behavior, omitting the field would result in the -// default org being applied, but that is no longer the case. -// TODO: Remove this method in it's entirety after some period of time. -// This will be released in v1.16.0, and is associated with the multiple orgs -// feature. -func (r *CreateUserRequestWithOrgs) UnmarshalJSON(data []byte) error { - // By using a type alias, we prevent an infinite recursion when unmarshalling. - // This allows us to use the default unmarshal behavior of the original type. - type AliasedReq CreateUserRequestWithOrgs - type DeprecatedCreateUserRequest struct { - AliasedReq - OrganizationID *uuid.UUID `json:"organization_id" format:"uuid"` - } - var dep DeprecatedCreateUserRequest - err := json.Unmarshal(data, &dep) - if err != nil { - return err - } - *r = CreateUserRequestWithOrgs(dep.AliasedReq) - if dep.OrganizationID != nil { - r.OrganizationIDs = append(r.OrganizationIDs, *dep.OrganizationID) - } - return nil -} +type CreateUserRequestWithOrgs = CreateUserRequest type UpdateUserProfileRequest struct { Username string `json:"username" validate:"required,username"` From fb601a17e5650d5d4800a45fba03ee9375865ad9 Mon Sep 17 00:00:00 2001 From: McKayla Washburn-Love Date: Fri, 11 Sep 2026 22:51:12 +0000 Subject: [PATCH 5/5] remove ubuntu 22.04 --- .dockerignore | 5 - .github/workflows/dogfood.yaml | 26 +- dogfood/coder/ubuntu-22.04/Dockerfile.base | 266 ------------------ .../ubuntu-22.04/configure-chrome-flags.sh | 31 -- .../files/etc/apt/apt.conf.d/80-no-recommends | 6 - .../files/etc/apt/apt.conf.d/80-retries | 1 - .../files/etc/apt/apt.conf.d/99-chrome-flags | 3 - .../files/etc/apt/preferences.d/containerd | 6 - .../files/etc/apt/preferences.d/docker | 23 -- .../files/etc/apt/preferences.d/github-cli | 8 - .../files/etc/apt/preferences.d/google-cloud | 19 -- .../files/etc/apt/preferences.d/hashicorp | 14 - .../files/etc/apt/preferences.d/ppa | 34 --- .../files/etc/apt/sources.list.d/docker.list | 1 - .../etc/apt/sources.list.d/google-cloud.list | 1 - .../etc/apt/sources.list.d/hashicorp.list | 1 - .../etc/apt/sources.list.d/postgresql.list | 1 - .../files/etc/apt/sources.list.d/ppa.list | 9 - .../ubuntu-22.04/files/etc/docker/daemon.json | 3 - .../coder/ubuntu-22.04/files/usr/local/bin/gh | 37 --- .../files/usr/share/keyrings/ansible.gpg | Bin 1132 -> 0 bytes .../files/usr/share/keyrings/docker.gpg | Bin 2760 -> 0 bytes .../files/usr/share/keyrings/fish-shell.gpg | Bin 1163 -> 0 bytes .../files/usr/share/keyrings/git-core.gpg | Bin 369 -> 0 bytes .../files/usr/share/keyrings/github-cli.gpg | Bin 2270 -> 0 bytes .../files/usr/share/keyrings/google-cloud.gpg | Bin 1905 -> 0 bytes .../files/usr/share/keyrings/hashicorp.gpg | Bin 2879 -> 0 bytes .../files/usr/share/keyrings/helix.gpg | Bin 1155 -> 0 bytes .../files/usr/share/keyrings/neovim.gpg | Bin 1134 -> 0 bytes .../files/usr/share/keyrings/postgresql.gpg | Bin 3494 -> 0 bytes dogfood/coder/ubuntu-22.04/update-keys.sh | 63 ----- 31 files changed, 3 insertions(+), 555 deletions(-) delete mode 100644 dogfood/coder/ubuntu-22.04/Dockerfile.base delete mode 100644 dogfood/coder/ubuntu-22.04/configure-chrome-flags.sh delete mode 100644 dogfood/coder/ubuntu-22.04/files/etc/apt/apt.conf.d/80-no-recommends delete mode 100644 dogfood/coder/ubuntu-22.04/files/etc/apt/apt.conf.d/80-retries delete mode 100644 dogfood/coder/ubuntu-22.04/files/etc/apt/apt.conf.d/99-chrome-flags delete mode 100644 dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/containerd delete mode 100644 dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/docker delete mode 100644 dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/github-cli delete mode 100644 dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/google-cloud delete mode 100644 dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/hashicorp delete mode 100644 dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/ppa delete mode 100644 dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/docker.list delete mode 100644 dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/google-cloud.list delete mode 100644 dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/hashicorp.list delete mode 100644 dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/postgresql.list delete mode 100644 dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/ppa.list delete mode 100644 dogfood/coder/ubuntu-22.04/files/etc/docker/daemon.json delete mode 100755 dogfood/coder/ubuntu-22.04/files/usr/local/bin/gh delete mode 100644 dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/ansible.gpg delete mode 100644 dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/docker.gpg delete mode 100644 dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/fish-shell.gpg delete mode 100644 dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/git-core.gpg delete mode 100644 dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/github-cli.gpg delete mode 100644 dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/google-cloud.gpg delete mode 100644 dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/hashicorp.gpg delete mode 100644 dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/helix.gpg delete mode 100644 dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/neovim.gpg delete mode 100644 dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/postgresql.gpg delete mode 100755 dogfood/coder/ubuntu-22.04/update-keys.sh diff --git a/.dockerignore b/.dockerignore index 9a9bc82b871..7618fef973e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -17,11 +17,6 @@ # Re-allow paths the dogfood Dockerfile.base files consume. !dogfood !dogfood/coder -!dogfood/coder/ubuntu-22.04 -!dogfood/coder/ubuntu-22.04/Dockerfile.base -!dogfood/coder/ubuntu-22.04/configure-chrome-flags.sh -!dogfood/coder/ubuntu-22.04/files -!dogfood/coder/ubuntu-22.04/files/** !dogfood/coder/ubuntu-26.04 !dogfood/coder/ubuntu-26.04/Dockerfile.base !dogfood/coder/ubuntu-26.04/files diff --git a/.github/workflows/dogfood.yaml b/.github/workflows/dogfood.yaml index d469ff80fa2..e2839bbe8e3 100644 --- a/.github/workflows/dogfood.yaml +++ b/.github/workflows/dogfood.yaml @@ -58,7 +58,7 @@ jobs: strategy: fail-fast: false matrix: - image-version: ["22.04", "26.04"] + image-version: ["26.04"] if: github.actor != 'dependabot[bot]' # Skip Dependabot PRs runs-on: ${{ github.repository_owner == 'coder' && 'depot-ubuntu-22.04-8' || 'ubuntu-latest' }} @@ -206,26 +206,6 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: ./scripts/dogfood_test_image.sh "dogfood-test:${{ matrix.image-version }}" - - name: Push final Ubuntu 22.04 image - if: matrix.image-version == '22.04' && github.ref == 'refs/heads/main' - env: - FINAL_SHA: ${{ steps.shas.outputs.final_sha }} - DOCKER_TAG: ${{ steps.docker-tag-name.outputs.tag }} - # --image-dir points at the OCI layout written by the previous - # `mise oci build` step. Without it, `mise oci push` rebuilds - # from mise.toml and forgets the --from base. --tool crane - # forces the registry client mise oci shells out to, so we - # don't drift between the apt-shipped skopeo on whatever runner - # image we land on. - # TODO: move the `latest` tag to 26.04 soon. we don't want to - # transition it immediately because that would make workspaces - # switch to it automatically without any grace period. - run: | - set -euo pipefail - for tag in "${FINAL_SHA}-22.04" "$DOCKER_TAG" 22.04 latest; do - mise oci push --tool crane --image-dir ./mise-oci "codercom/oss-dogfood:$tag" - done - - name: Push final Ubuntu 26.04 image if: matrix.image-version == '26.04' && github.ref == 'refs/heads/main' env: @@ -233,7 +213,7 @@ jobs: DOCKER_TAG: ${{ steps.docker-tag-name.outputs.tag }} run: | set -euo pipefail - for tag in "${FINAL_SHA}-26.04" "$DOCKER_TAG" 26.04; do + for tag in "${FINAL_SHA}-26.04" "$DOCKER_TAG" 26.04 latest; do mise oci push --tool crane --image-dir ./mise-oci "codercom/oss-dogfood:$tag" done @@ -248,7 +228,7 @@ jobs: save: true push: ${{ github.ref == 'refs/heads/main' }} tags: "codercom/oss-dogfood-vscode-coder:${{ steps.docker-tag-name.outputs.tag }},codercom/oss-dogfood-vscode-coder:latest" - if: matrix.image-version == '22.04' + if: matrix.image-version == '26.04' deploy_template: needs: build_image diff --git a/dogfood/coder/ubuntu-22.04/Dockerfile.base b/dogfood/coder/ubuntu-22.04/Dockerfile.base deleted file mode 100644 index 7485167548d..00000000000 --- a/dogfood/coder/ubuntu-22.04/Dockerfile.base +++ /dev/null @@ -1,266 +0,0 @@ -FROM ubuntu:jammy@sha256:eb29ed27b0821dca09c2e28b39135e185fc1302036427d5f4d70a41ce8fd7659 - -SHELL ["/bin/bash", "-c"] - -# Install packages from apt repositories -ARG DEBIAN_FRONTEND="noninteractive" - -# Updated certificates are necessary to use the teraswitch mirror. -# This must be ran before copying in configuration since the config replaces -# the default mirror with teraswitch. -# Also enable the en_US.UTF-8 locale so that we don't generate multiple locales -# and unminimize to include man pages. -RUN apt-get update && \ - apt-get install --yes ca-certificates locales && \ - echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && \ - locale-gen && \ - yes | unminimize - -COPY dogfood/coder/ubuntu-22.04/files / - -# We used to copy /etc/sudoers.d/* in from files/ but this causes issues with -# permissions and layer caching. Instead, create the file directly. -RUN mkdir -p /etc/sudoers.d && \ - echo 'coder ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/nopasswd && \ - chmod 750 /etc/sudoers.d/ && \ - chmod 640 /etc/sudoers.d/nopasswd - -# Use more reliable mirrors for Ubuntu packages -RUN sed -i 's|http://archive.ubuntu.com/ubuntu/|http://mirrors.edge.kernel.org/ubuntu/|g' /etc/apt/sources.list && \ - sed -i 's|http://security.ubuntu.com/ubuntu/|http://mirrors.edge.kernel.org/ubuntu/|g' /etc/apt/sources.list && \ - apt-get update --quiet && apt-get install --yes \ - ansible \ - apt-transport-https \ - apt-utils \ - asciinema \ - bash \ - bash-completion \ - bat \ - bats \ - bind9-dnsutils \ - bison \ - build-essential \ - ca-certificates \ - containerd.io \ - curl \ - docker-ce \ - docker-ce-cli \ - docker-compose-plugin \ - exa \ - fd-find \ - file \ - fish \ - flex \ - gettext-base \ - git \ - gnupg \ - google-cloud-sdk \ - helix \ - htop \ - httpie \ - inetutils-tools \ - iproute2 \ - iputils-ping \ - iputils-tracepath \ - jq \ - kubectl \ - language-pack-en \ - less \ - libgbm-dev \ - libicu-dev \ - libreadline-dev \ - libssl-dev \ - libx11-xcb1 \ - lsb-release \ - lsof \ - man \ - meld \ - ncdu \ - neovim \ - net-tools \ - openjdk-11-jdk-headless \ - openssh-server \ - openssl \ - pkg-config \ - procps \ - postgresql-16 \ - python3 \ - python3-pip \ - ripgrep \ - rsync \ - screen \ - shellcheck \ - strace \ - sudo \ - tcptraceroute \ - termshark \ - tmux \ - traceroute \ - unzip \ - uuid-dev \ - vim \ - wget \ - xauth \ - zip \ - zlib1g-dev \ - zsh \ - zstd && \ - # Delete package cache to avoid consuming space in layer - apt-get clean - -# Install Google Chrome directly from Google. Ubuntu 22.04 ships -# chromium-browser as a snap-only package, which does not work in -# Docker containers. -# configure-chrome-flags.sh is automatically run after dpkg operations -# by dogfood/coder/files/etc/apt/apt.conf.d/99-chrome-flags. -COPY dogfood/coder/ubuntu-22.04/configure-chrome-flags.sh /usr/local/bin/configure-chrome-flags.sh -RUN chmod a+x /usr/local/bin/configure-chrome-flags.sh && \ - wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \ - apt-get install --yes ./google-chrome-stable_current_amd64.deb && \ - rm google-chrome-stable_current_amd64.deb - -# Install Rust via rustup. Using rustup ensures we get a current stable -# toolchain. -ENV RUSTUP_HOME=/usr/local/rustup \ - CARGO_HOME=/usr/local/cargo -RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \ - sh -s -- -y --default-toolchain stable --profile default -c rust-src -ENV PATH=$CARGO_HOME/bin:$PATH - -# Install the docker buildx component. -RUN DOCKER_BUILDX_VERSION=$(curl -s "https://api.github.com/repos/docker/buildx/releases/latest" | grep '"tag_name":' | sed -E 's/.*"(v[^"]+)".*/\1/') && \ - mkdir -p /usr/local/lib/docker/cli-plugins && \ - curl -Lo /usr/local/lib/docker/cli-plugins/docker-buildx "https://github.com/docker/buildx/releases/download/${DOCKER_BUILDX_VERSION}/buildx-${DOCKER_BUILDX_VERSION}.linux-amd64" && \ - chmod a+x /usr/local/lib/docker/cli-plugins/docker-buildx - -# GitHub CLI to /usr/bin/gh. The wrapper at files/usr/local/bin/gh -# execs this for coder external-auth fallback. Apt repo is unreliable: -# https://github.com/cli/cli/issues/6175#issuecomment-1235984381 -RUN GH_CLI_VERSION=$(curl -s "https://api.github.com/repos/cli/cli/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ - curl -L https://github.com/cli/cli/releases/download/v${GH_CLI_VERSION}/gh_${GH_CLI_VERSION}_linux_amd64.deb -o gh.deb && \ - dpkg -i gh.deb && \ - rm gh.deb - -# Ensure PostgreSQL binaries are in the users $PATH. -RUN update-alternatives --install /usr/local/bin/initdb initdb /usr/lib/postgresql/16/bin/initdb 100 && \ - update-alternatives --install /usr/local/bin/postgres postgres /usr/lib/postgresql/16/bin/postgres 100 - -# Create links for injected dependencies -RUN ln --symbolic /var/tmp/coder/coder-cli/coder /usr/local/bin/coder && \ - ln --symbolic /var/tmp/coder/code-server/bin/code-server /usr/local/bin/code-server - -# Disable the PostgreSQL systemd service. -# Coder uses a custom timescale container to test the database instead. -RUN systemctl disable \ - postgresql - -# Configure systemd services for CVMs -RUN systemctl enable \ - docker \ - ssh && \ - # Workaround for envbuilder cache probing not working unless the filesystem is modified. - touch /tmp/.envbuilder-systemctl-enable-docker-ssh-workaround - -# Add coder user and allow use of docker/sudo -RUN useradd coder \ - --create-home \ - --shell=/bin/bash \ - --groups=docker \ - --uid=1000 \ - --user-group - -# Install mise. Binary at /opt/mise/bin so it survives the home -# volume mount; data dir under ~/.local/share/mise so installs ride -# along on the per-workspace home volume, matching Homebrew's pattern -# (see /home/linuxbrew volume in main.tf). -ARG MISE_VERSION=v2026.5.12 \ - MISE_SHA256=a238972a3162d710b85b28c324372e96ca4e4b486c81fe78695000d9fbc77c48 \ - MISE_INSTALL_DIR=/opt/mise/bin \ - HOMEBREW_INSTALL_COMMIT=540da2ca91271886910572df3a50332540ca84e4 \ - HOMEBREW_INSTALL_SHA256=dfd5145fe2aa5956a600e35848765273f5798ce6def01bd08ecec088a1268d91 -RUN install --directory --owner=coder --group=coder --mode=0755 "${MISE_INSTALL_DIR}" && \ - curl --silent --show-error --location --fail \ - "https://github.com/jdx/mise/releases/download/${MISE_VERSION}/mise-${MISE_VERSION}-linux-x64" \ - --output "${MISE_INSTALL_DIR}/mise" && \ - echo "${MISE_SHA256} ${MISE_INSTALL_DIR}/mise" | sha256sum -c && \ - chown coder:coder "${MISE_INSTALL_DIR}/mise" && \ - chmod 0755 "${MISE_INSTALL_DIR}/mise" && \ - ln --symbolic "${MISE_INSTALL_DIR}/mise" /usr/local/bin/mise && \ - test -x /usr/local/bin/mise && \ - sudo --login --user=coder /bin/bash -lc 'set -euo pipefail && mise_bin="$(readlink --canonicalize /usr/local/bin/mise)" && test -w "$(dirname "$mise_bin")" && /usr/local/bin/mise --version && /usr/local/bin/mise self-update --help >/dev/null && /usr/local/bin/mise upgrade --help >/dev/null' - -ENV MISE_DATA_DIR=/home/coder/.local/share/mise - -# Bake a system fallback for trusted_config_paths so the canonical -# /home/coder/coder repo and the mise-oci-synthesized /etc/mise/config.toml -# are trusted without a per-config prompt. The workspace template -# (dogfood/coder/main.tf install-deps coder_script) seeds a matching -# user-owned ~/.config/mise/conf.d/00-coder-trust.toml on workspace -# start, which the user can edit to add their own paths; that file -# lives on the persistent home volume and overrides this fallback. -RUN install --directory --mode=0755 /etc/mise /etc/mise/conf.d -COPY --chmod=0644 <<'EOF' /etc/mise/conf.d/00-coder-trust.toml -[settings] -trusted_config_paths = [ - "/home/coder/coder", - "/etc/mise", -] -EOF - -# Reserve the mount_point declared in mise.toml [oci]. The path is -# duplicated below in MISE_SHARED_INSTALL_DIRS and PATH; if it ever -# changes, update all three plus mise.toml. Ownership of /opt/mise -# and /opt/mise/data is reasserted at workspace start by the -# install-deps coder_script in dogfood/coder/main.tf: `mise oci -# build` emits deterministic tar layers with hardcoded uid=0/gid=0 -# (see src/oci/layer.rs), so the final image always overwrites -# whatever ownership we set here. -RUN install --directory --owner=coder --group=coder --mode=0755 /opt/mise /opt/mise/data - -# Install Homebrew as the coder user so the supported Linux prefix remains -# writable after the image build. -RUN sudo --login --user=coder env \ - NONINTERACTIVE=1 \ - CI=1 \ - HOMEBREW_INSTALL_COMMIT=${HOMEBREW_INSTALL_COMMIT} \ - HOMEBREW_INSTALL_SHA256=${HOMEBREW_INSTALL_SHA256} \ - /bin/bash -lc 'set -euo pipefail && installer="$(mktemp)" && trap '"'"'rm -f "${installer}"'"'"' EXIT && curl --silent --show-error --location --fail "https://raw.githubusercontent.com/Homebrew/install/${HOMEBREW_INSTALL_COMMIT}/install.sh" --output "${installer}" && echo "${HOMEBREW_INSTALL_SHA256} ${installer}" | sha256sum -c && /bin/bash "${installer}"' && \ - test -x /home/linuxbrew/.linuxbrew/bin/brew && \ - sudo --login --user=coder /bin/bash -lc '/home/linuxbrew/.linuxbrew/bin/brew --version' - -# Adjust OpenSSH config and drop the apt lists / cache that survived -# the package installs above. No later step in this image needs apt. -RUN echo "PermitUserEnvironment yes" >>/etc/ssh/sshd_config && \ - echo "X11Forwarding yes" >>/etc/ssh/sshd_config && \ - echo "X11UseLocalhost no" >>/etc/ssh/sshd_config && \ - apt-get clean && rm -rf /var/lib/apt/lists/* - -USER coder - -# mise shims must lead so `command -v` and `mise doctor` resolve -# mise-managed tools ahead of Homebrew and system binaries. -ENV HOMEBREW_PREFIX="/home/linuxbrew/.linuxbrew" \ - HOMEBREW_CELLAR="/home/linuxbrew/.linuxbrew/Cellar" \ - HOMEBREW_REPOSITORY="/home/linuxbrew/.linuxbrew/Homebrew" -# Pin npm globals to a stable home dir, otherwise they land in -# mise's version-specific node bin dir which isn't on PATH. -ENV NPM_CONFIG_PREFIX="/home/coder/.npm-global" -# Baked shims trail user shims on PATH so user installs win when -# both exist. -ENV MISE_SHARED_INSTALL_DIRS="/opt/mise/data/installs" -ENV PATH="/home/coder/.npm-global/bin:${MISE_DATA_DIR}/shims:/opt/mise/data/shims:${HOMEBREW_PREFIX}/bin:${HOMEBREW_PREFIX}/sbin:/home/coder/go/bin:${PATH}" - -# Override CARGO_HOME so cargo registry/cache writes go to the coder -# user's home directory instead of the root-owned /usr/local/cargo. -# The rustup-installed binaries remain on PATH via /usr/local/cargo/bin. -ENV CARGO_HOME="/home/coder/.cargo" - -# This setting prevents Go from using the public checksum database for -# our module path prefixes. It is required because these are in private -# repositories that require authentication. -# -# For details, see: https://golang.org/ref/mod#private-modules -ENV GOPRIVATE="coder.com,cdr.dev,go.coder.com,github.com/cdr,github.com/coder" - -# Increase memory allocation to NodeJS -ENV NODE_OPTIONS="--max-old-space-size=8192" diff --git a/dogfood/coder/ubuntu-22.04/configure-chrome-flags.sh b/dogfood/coder/ubuntu-22.04/configure-chrome-flags.sh deleted file mode 100644 index ee2e9bbaefe..00000000000 --- a/dogfood/coder/ubuntu-22.04/configure-chrome-flags.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# Adds launch flags to all Google Chrome .desktop files so that Chrome -# works correctly in headless / GPU-less environments (e.g. Coder -# workspaces running inside Docker containers). -# -# This script is idempotent. - -set -euo pipefail - -CHROME_FLAGS=( - --use-gl=angle - --use-angle=swiftshader - --disable-dev-shm-usage - --no-first-run - --no-default-browser-check - --disable-background-networking - --disable-sync - --start-maximized -) - -FLAGS_STR="${CHROME_FLAGS[*]}" - -for desktop_file in /usr/share/applications/google-chrome*.desktop /usr/share/applications/com.google.Chrome*.desktop; do - [ -f "$desktop_file" ] || continue - # Skip if flags are already present. - if grep -q -- '--use-gl=angle' "$desktop_file"; then - continue - fi - # Insert flags after the binary path on every Exec= line. - sed -i "s|Exec=/usr/bin/google-chrome-stable|Exec=/usr/bin/google-chrome-stable ${FLAGS_STR}|" "$desktop_file" -done diff --git a/dogfood/coder/ubuntu-22.04/files/etc/apt/apt.conf.d/80-no-recommends b/dogfood/coder/ubuntu-22.04/files/etc/apt/apt.conf.d/80-no-recommends deleted file mode 100644 index 8cb79c96386..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/etc/apt/apt.conf.d/80-no-recommends +++ /dev/null @@ -1,6 +0,0 @@ -// Do not install recommended packages by default -APT::Install-Recommends "0"; - -// Do not install suggested packages by default (this is already -// the Ubuntu default) -APT::Install-Suggests "0"; diff --git a/dogfood/coder/ubuntu-22.04/files/etc/apt/apt.conf.d/80-retries b/dogfood/coder/ubuntu-22.04/files/etc/apt/apt.conf.d/80-retries deleted file mode 100644 index d7ee5185258..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/etc/apt/apt.conf.d/80-retries +++ /dev/null @@ -1 +0,0 @@ -APT::Acquire::Retries "3"; diff --git a/dogfood/coder/ubuntu-22.04/files/etc/apt/apt.conf.d/99-chrome-flags b/dogfood/coder/ubuntu-22.04/files/etc/apt/apt.conf.d/99-chrome-flags deleted file mode 100644 index fb74c05a040..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/etc/apt/apt.conf.d/99-chrome-flags +++ /dev/null @@ -1,3 +0,0 @@ -// Re-apply Chrome desktop-file flags after any package operation so -// that a google-chrome-stable upgrade does not silently drop them. -DPkg::Post-Invoke { "/usr/local/bin/configure-chrome-flags.sh 2>/dev/null || true"; }; diff --git a/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/containerd b/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/containerd deleted file mode 100644 index ab0b8f9891a..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/containerd +++ /dev/null @@ -1,6 +0,0 @@ -# Ref: https://github.com/nestybox/sysbox/issues/879 -# We need to pin containerd to a specific version to avoid breaking -# Docker-in-Docker. -Package: containerd.io -Pin: version 1.7.23-1 -Pin-Priority: 1001 diff --git a/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/docker b/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/docker deleted file mode 100644 index 91dcb2b37f6..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/docker +++ /dev/null @@ -1,23 +0,0 @@ -# Ignore all packages from this repository by default -Package: * -Pin: origin download.docker.com -Pin-Priority: 1 - -# Docker Community Edition -# We need to pin docker-ce to a specific version because containerd is pinned -# to an older version. Newer major versions of docker-ce require a version of -# containerd.io greater than our pinned version. -Package: docker-ce -Pin: origin download.docker.com -Pin: version 5:27.* -Pin-Priority: 500 - -# Docker command-line tool -Package: docker-ce-cli -Pin: origin download.docker.com -Pin-Priority: 500 - -# containerd runtime -Package: containerd.io -Pin: origin download.docker.com -Pin-Priority: 500 diff --git a/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/github-cli b/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/github-cli deleted file mode 100644 index d2dce9f5f30..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/github-cli +++ /dev/null @@ -1,8 +0,0 @@ -# Ignore all packages from this repository by default -Package: * -Pin: origin cli.github.com -Pin-Priority: 1 - -Package: gh -Pin: origin cli.github.com -Pin-Priority: 500 diff --git a/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/google-cloud b/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/google-cloud deleted file mode 100644 index 637b0e9bb3c..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/google-cloud +++ /dev/null @@ -1,19 +0,0 @@ -# Ignore all packages from this repository by default -Package: * -Pin: origin packages.cloud.google.com -Pin-Priority: 1 - -# Google Cloud SDK for gcloud and gsutil CLI tools -Package: google-cloud-sdk -Pin: origin packages.cloud.google.com -Pin-Priority: 500 - -# Datastore emulator for working with the licensor -Package: google-cloud-sdk-datastore-emulator -Pin: origin packages.cloud.google.com -Pin-Priority: 500 - -# Kubectl for working with Kubernetes (GKE) -Package: kubectl -Pin: origin packages.cloud.google.com -Pin-Priority: 500 diff --git a/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/hashicorp b/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/hashicorp deleted file mode 100644 index 4323f331cc7..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/hashicorp +++ /dev/null @@ -1,14 +0,0 @@ -# Ignore all packages from this repository by default -Package: * -Pin: origin apt.releases.hashicorp.com -Pin-Priority: 1 - -# Packer for creating virtual machine disk images -Package: packer -Pin: origin apt.releases.hashicorp.com -Pin-Priority: 500 - -# Terraform for managing infrastructure -Package: terraform -Pin: origin apt.releases.hashicorp.com -Pin-Priority: 500 diff --git a/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/ppa b/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/ppa deleted file mode 100644 index 9e8e85724fa..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/etc/apt/preferences.d/ppa +++ /dev/null @@ -1,34 +0,0 @@ -# Ignore all packages from this repository by default -Package: * -Pin: origin ppa.launchpad.net -Pin-Priority: 1 - -# Ansible -Package: ansible-base -Pin: origin ppa.launchpad.net -Pin-Priority: 500 - -# Fish -Package: fish -Pin: origin ppa.launchpad.net -Pin-Priority: 500 - -# Git -Package: git -Pin: origin ppa.launchpad.net -Pin-Priority: 500 - -# Helix -Package: helix -Pin: origin ppa.launchpad.net -Pin-Priority: 500 - -# Neovim -Package: neovim -Pin: origin ppa.launchpad.net -Pin-Priority: 500 - -# Neovim Runtime -Package: neovim-runtime -Pin: origin ppa.launchpad.net -Pin-Priority: 500 diff --git a/dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/docker.list b/dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/docker.list deleted file mode 100644 index f00cada1ad1..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/docker.list +++ /dev/null @@ -1 +0,0 @@ -deb [signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu jammy stable diff --git a/dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/google-cloud.list b/dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/google-cloud.list deleted file mode 100644 index 24df98effea..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/google-cloud.list +++ /dev/null @@ -1 +0,0 @@ -deb [signed-by=/usr/share/keyrings/google-cloud.gpg] https://packages.cloud.google.com/apt cloud-sdk main diff --git a/dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/hashicorp.list b/dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/hashicorp.list deleted file mode 100644 index 6e60053905e..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/hashicorp.list +++ /dev/null @@ -1 +0,0 @@ -deb [signed-by=/usr/share/keyrings/hashicorp.gpg] https://apt.releases.hashicorp.com jammy main diff --git a/dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/postgresql.list b/dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/postgresql.list deleted file mode 100644 index 10262f3e64a..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/postgresql.list +++ /dev/null @@ -1 +0,0 @@ -deb [signed-by=/usr/share/keyrings/postgresql.gpg] https://apt.postgresql.org/pub/repos/apt jammy-pgdg main diff --git a/dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/ppa.list b/dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/ppa.list deleted file mode 100644 index fbdbef53ea6..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/etc/apt/sources.list.d/ppa.list +++ /dev/null @@ -1,9 +0,0 @@ -deb [signed-by=/usr/share/keyrings/ansible.gpg] https://ppa.launchpadcontent.net/ansible/ansible/ubuntu jammy main - -deb [signed-by=/usr/share/keyrings/fish-shell.gpg] https://ppa.launchpadcontent.net/fish-shell/release-4/ubuntu/ jammy main - -deb [signed-by=/usr/share/keyrings/git-core.gpg] https://ppa.launchpadcontent.net/git-core/ppa/ubuntu jammy main - -deb [signed-by=/usr/share/keyrings/helix.gpg] https://ppa.launchpadcontent.net/maveonair/helix-editor/ubuntu/ jammy main - -deb [signed-by=/usr/share/keyrings/neovim.gpg] https://ppa.launchpadcontent.net/neovim-ppa/stable/ubuntu jammy main diff --git a/dogfood/coder/ubuntu-22.04/files/etc/docker/daemon.json b/dogfood/coder/ubuntu-22.04/files/etc/docker/daemon.json deleted file mode 100644 index c2cbc52c3cc..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/etc/docker/daemon.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "registry-mirrors": ["https://mirror.gcr.io"] -} diff --git a/dogfood/coder/ubuntu-22.04/files/usr/local/bin/gh b/dogfood/coder/ubuntu-22.04/files/usr/local/bin/gh deleted file mode 100755 index badd7306ced..00000000000 --- a/dogfood/coder/ubuntu-22.04/files/usr/local/bin/gh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/sh -# -# Wrapper for the GitHub CLI (`gh`) that ensures authentication via -# `coder external-auth` when no other credentials are available. -# -# Precedence: -# 1. GH_TOKEN / GITHUB_TOKEN already set in environment -# 2. Existing `gh auth` login (e.g. `gh auth login`) -# 3. Fresh token from `coder external-auth access-token github` - -REAL_GH="/usr/bin/gh" - -# ENG-2842: prevent gh from probing terminal colors before interactive prompts. -if [ -z "${NO_COLOR+x}" ]; then - export NO_COLOR=1 -fi - -# If GH_TOKEN or GITHUB_TOKEN is already set, defer to the real gh. -if [ -n "${GH_TOKEN:-}" ] || [ -n "${GITHUB_TOKEN:-}" ]; then - exec "$REAL_GH" "$@" -fi - -# If the user has manually logged in via `gh auth login`, use that. -if "$REAL_GH" auth status >/dev/null 2>&1; then - exec "$REAL_GH" "$@" -fi - -# Fall back to Coder's external auth for a fresh token (only in a workspace). -if [ "${CODER:-}" = "true" ]; then - TOKEN=$(coder external-auth access-token github 2>/dev/null) - if [ -n "$TOKEN" ]; then - GITHUB_TOKEN="$TOKEN" exec "$REAL_GH" "$@" - fi -fi - -# Nothing worked; run gh anyway and let it show its own auth error. -exec "$REAL_GH" "$@" diff --git a/dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/ansible.gpg b/dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/ansible.gpg deleted file mode 100644 index 1731dd2b2fbd7ce251ad1b2a53f7df432f40ba60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1132 zcmV-y1e5#5!A%5Hmu)Zs5CF<8#y2sBavX?)67L*C?G(=zXq7e@f6Q6auif(;)LZod zJu=nD{xl;si4m1N>|mHxbs=?y#0s%cDFcoXWGuiOPPcBqgGtD(O&)chTnV3O_vTKp zpxjBtjm2l2l)Co$f!&#ZUZx+mr|if+XiX)imRGOaN{wFzF5qf*MMMWR-!r_9)GT8n z9-skmj@@r=PeO_JMTAEoMON^=mLX&{p9PrVXI@k~>Eol0;1Wto(EAo0j!ob9JLZv$ zz{J9ga|)i0iWfLtD7Lfx2pcwfa@C_G1MjY`Lz6(awYWneCUowKp!;(c|LRENDJuV@}J^R10+K>bBPj0 zCcgwPd7G4u#uSnVISiLz>kj2k1P55=&JfyHmd(KqdSL^A$;r(RK;Xi~)S07(S1`Hx zluz`k@CoV<@SfH`dGGH;tTOf>%sFH)iWJCW^83^D=M##Vb)#E2kuO`HOHZMJPPY`) z#rAzJVN>~#YhaCw6qRIee66;(wewmmFwLqfI#xM7Uyj4+Unp~Z9?dnFy^Ep&k9z1@*%FAsQAQg_q^ zZA|2Ax}@E=%BDtciOPD+c(7l!ho;1z9^v?+=mW{bPK7@|z`h3!+#5lH>mC;e zAZw{ca%yxWx*r-8+j=+B_0_#@aD^lrQGYcRci@}xrY_B1bATdXsNhK*{R`_5@Snvl z%@^X(#j_I0E(`LpP@0t-%adrgYf0nv{mkf^m#uEZhfVP0mH+ABM$$9YYGhc7uU_zb zLfwi01ixZuFJvRqgLiooRMNo7-bQbSnxUT8je#Ug{poZ{T)y9ck!Lmb=J$T22%i1(LzY!TWhePHBrdo)WGPY3)h z7C#hPORz)L!-36Ks;a^piJc|8(PTGnSad{%|NB2-0#?2=Ng~I(^p!6?WEWF|1MY|_ yf9W@2In1 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 diff --git a/dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/git-core.gpg b/dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/git-core.gpg deleted file mode 100644 index ff0a75599490a9ea862d807b706c3d1c93520552..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369 zcmV-%0gnF0jRZ+}+8Y4`0KhirUH+PMR`TR(0V6CCu0*nEFH(}j>_VvvzjWN{VlZT{ zXKMuCh&x-U)Ip6A|L_@0XqMrX-@VvSO$)9*QOxNL;!q2IpC#OX+(DMdEbwW&+iSRt z3q`aPxCF!zg%n>|G4LdVjOgk{A;%*bV^;ol!5|1$&q5`i){ue@1%)qq;f zBZik|A4@ zyXS1|3P7UOBGE|Y-6QZ5Bz)TCr0-#0cdarL1{FB4lpZV8R?sV24G=LV$^Q<%iQZEG PbJ@LdK3^7`P9nj0p@*8A diff --git a/dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/github-cli.gpg b/dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/github-cli.gpg deleted file mode 100644 index eddea90bd75df1a43698f0735174f72222e9992f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2270 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 diff --git a/dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/google-cloud.gpg b/dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/google-cloud.gpg deleted file mode 100644 index 3b28500f95359dcefbaba0bb120ba0f4b735b81b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1905 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 F;BR8aVf_FA diff --git a/dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/helix.gpg b/dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/helix.gpg deleted file mode 100644 index c4dd02d15798f43b248bee6f410611ad0bca0a43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1155 zcmV-}1bq9(!A%5Xwc5`C5CE4itXv#3slfO%wf2hb>@W(TpZ;YlmqGui0=fV8D9uz4 zy82A9)DgP%UyS?d=DM+J#6J8IGL|^P)h-#8^Ew|ji6e+XcVA^YT{=BV&0nRh@cFga z&(|7~FSj`2%e?Nk2Z7ohqn7B+_%09|2TF z4N7KhxFc{2Lc>nt)z@srM!VOo{wu_?F5$;*rHdyO63{IfK&$mlD|AQ;t(^`)!t^vz zg4PmvWaaHZWrJWXxk4DlW4%!?7i4y`?yS^uLhe=}dq-Bru!+XnS6ke$u;N%~^7=%& zHb2#vzz34`rh$+vjIY&+2QrMavxck!AqY?21PvE2+X))6$)j9|>WFtP=~>vVJTzqa zj!byoDQ~i3EsV}hH`o$_o0tg6=+a0;H1Osxce*PSZN^O9i*aPkNL^ZeBCz2{n7Dhu zAo-4gO+G?KW`FIV(fr&6(L0^7irDcBFHK*%3#}%cOrN&2k0Z|J3Lo;GcjVQ8;FD=}W?Eg&_C;o}9B%2{ z6Tqcyjo1N_b*5^|ISrs=pzZ<$)ms4Q{3Bc#1swb=bsIBxc0P(D+e+s3A$T!O6l%S> z5%BgB328KkYh?ft0RREbAWUI(ZewV0VPqgsP(dJOZ*m|;VPa`vZXiu%baZTGa>Bum z1QP)Y05}#Q1Se!GpV#rBVf-Z|<271Or4`r6RRscLwc5`D8v_Lk2?z%Q1{Dek2nzxP z76JnS0v-VZ7k~f?2@o|}Po)*t$W_Az5C43HCF5zm?W(DWw>B42OTlaAFEY9_0-&N% zXE0MnN0R-ScDX4G@^gi`VEuS24PnFTl4Yjr9qt-m@BRV8-S&Jta}ITTBr&h}nL9~e z2r4Qp24@fX{8sTvp{aJv;7bN8dMXS800H&SWIn- z9BxT}(Q?XjdI_3_HsT!^-#g^Md2J;jZ=T(6Us8P0 z9|A_at&EAxM`eQX5gjK6>>Hm1cG`QU4ANRAAz465%QW?ac`{B&y203Kfs+vC0U6S0 z@sy@|>S7nx=4%TT;t-5h&-kM2G{xBC%Z24JoTlvKFmR+$wVL(AHjzVI4|UJj0nw4G zs(o@F(wkAhx;@e8M~&qFMKs=#GR}EB2pHsEK*NDu24)nV8JYO1TtWLkYuJ8+x$@%h^E9mK%#4Uyoa?!Eaf`otT+2>PASPH&+S V0`>VKtRbLq5b~iSUfIkILVJ2Z9MAv& diff --git a/dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/neovim.gpg b/dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/neovim.gpg deleted file mode 100644 index b88f69c53b48231149fe9bf79f0731800ab20e59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1134 zcmV-!1d;p3!A%5IiOr({5CE~IBdv7pNYLFxw%zwe%)<&|yLz+x?w0@szMTKJ$A(I% zXzH{Obd;Wbl1&5Xq#IMYRy6YlmDmNR8Nhn$ibhPG>)Fo&NESBL93CCK@(!cM{sFL# zl3lGc*OY}TPJY89Y`5yhtDjdGdR`sF=-obeZ6|&)Q?JB*^tR`Hs`bI;7%7s23ub3m z2fb~VjF|gS`dseajhzmSVAqkLq?Lzd-||b!CPpP=s@8rTvf6|&1HsVQ^$#~j*4_B z^wo#Yk$Y085z>xnXPh*YyXCM?X!Pz34&qQJWF>^y#mQ?Jy36e=iZ;jd+pzLw&Z~qp z9J+_wM!!;)U9TJ>|{QL461&b!QjK$m6TSoI*Z?BZZUGed_%I zq@w4C+YUK7V*G66P1FMCB=1(Q0v{fk--rSn_+rv#2P+VoJ}C|S6~o~oM@taQ>Mq^X z*FGXUmgmLfb&~)Q0RREbAxvR)ZewV0VPqgsP(dJOZ*m|`Wp8$AZ6HukK_FCRVQs>} zcmxvx0stZf0#u33qXHWP1`7!Y2Ll2I6$k|8!UY)ML z?f{O&>KSG%w!M&okwu6`ShMAUxoz)SabFLueiM$KoUDI zx!sM%wVVU={@k`?+zS~>77|toi>_NThL3?qSo_W5_Z>u62g!RHUcPk*2{p^0b>g{i ziDBYyHCIbR6O^dmyn%PY9&_=gKp zB2Dn)pL>}Y{`@YqQu8<*4#ucVWl@T&o5F~wef_KAIEV1sIIj~eCi0EgcN%>#{rn3}1Kqr1_6^$8%9?VPE|Luu{wV46z1K0qY z)(wi}yw|tNeAvYIe{9Y+h3YF|_DbZK{aU{)%!HvAI@XQ2l*@_?a{eX+*?xmo{IGSL zN1<|7K7vgV+wglAXB-kGG=3%>aS;zFV(>)(XAd33BS8gDHd1>i`I4$HM@B6louE|l z9S<|tIVype8a)U%K+6>rhV*aiCCvU^oE*b!t)6Up6TUSlF!29uX6SH&*c! A$N&HU diff --git a/dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/postgresql.gpg b/dogfood/coder/ubuntu-22.04/files/usr/share/keyrings/postgresql.gpg deleted file mode 100644 index afa15cb1087de3aaad67e6d95989eb21b7501377..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3494 zcma*nXEYlO!^ZIlDq_VdY816<&k`zP@2$0}t)NBiL-=9GfZ@+Xn&R_lzyYq^^jnS2d*%!PjR z2g1^bzvXBziWS@{+O>q`Kd-UCH(&ZZTSg1Iwg5j2l~4Mt@~1? z8;^e3LduJLEtOb;EA+*D#PS;|%(9oOhS@agx%J;Rhvq-0>Ur$CTJGAx=0xtN*;dqC zKG?%kfZ{l@tCUQW|C`iIG?@JHXH(@9`A2b)nd4G0(+(<6L#w;*R|OYznjba%kmcvW z!jz}JhKr|mbuB}0C1ha7{>U;uYX2tYtobtK>s>#e47llH?Ax7i*$7|!+D$s?C15rA z{hT`w5}VK*zb1rcPT)YRPpmwN>%`B9GP^l%M}%Hif*9!0tEnOhXI8+M|U`{pJ?y zxYMLiH1WAx_CG}I!Rjm-1@hsVhp|V`deV7k8`RQG}ReZ5x6Z8M@Qml z(B3EfmW~Q4qz&AqpLYK?eh6n;$rnfN0_aHqB#j&4S~|8j&%QfB*_Wc2aUGN)QDpIWw3NL`8lVNJ;_#a*+U8LhkaA;R3>P3XyrEluJc8<7VN_Zjo@}E~Zp+;B(VuE!&~v*Pc#&$uoGffEV5pIOE@~>a|+a2XFB#o;z#@s1f?TD*!%oPdHPz7uE)No_%jj zB+-&N)YMWbkRnZYPoj&@-phG{N(|Y>y<~)YjxLLjAMwjlv?>nU67qU_A$YYIuIfEZ zU|zg+{rdU4eMtFWTMX!UJILI`!lXZ-A$xA4n8tkH>JU~68rLDVX$IwoU~l#H#|w<= zcx;-SR`!~|U2?EyRf;mb+hkJA=qtFTF6ZqMJe8|PGExT2T{6czF;o!zzPx$Wq@lpC zOGDegs==H;R*BWy>pcZED$F>NU={+w74i{y#*Lx!2Y>o}5AW5QcA1gKZ>hb|!L9{k z@AHjN*_xY#MQ$E zZ>kx-eyAb;Lr3%y6mJ0!ZfOc>SeAvWf}E-^#ncMp#mmcEYTWC^aHSMW9Su@AW43YL zi#3RF(nK|%i1)gs|Fl!(L02ICud(RnoZW){nrPgt7hm{?Z++6qnPXDi&2>%>zk3*b zThc&K`A11qVJ)}lYT~p*JI|Ih>-&cFB@}dL6I&~Ris=F{P18KnnGHR>pjL8@u(qUf|a0;?b!X`Zd{OHUxY@sLjb*-m+h>za8_Bs zOPlwi3|BXmnfY@m)cPvk^Ufy$n)RQ?yCR(G`6q*~@X(J@?_sZ%orKN0icb_AB z97*|MCL?XNwXc)ynK2}RK`no72V_Mxlk+zsU-^TTf0W8RxPs49S;iVE?+P}=Wa7=v z*~a(QlIS%CMigkcC8fb4?JUtAqGxHYS*=<--U^@R0zxt}Kl+t!ThFGtub>p3R{IgNK3E?(75tIY8jW5ft=)jY1C zu-aPUTHrw{}5PMPh$Fi57lrphs;xS@YoGHm_-pH2^I*&?WW(|aG_czh=Ur1}zS4@-sDMx%bx_VH^Yi)aQF@Bkr6#A*q?p(l&kmlj;+QE3N7z z_*`jgOw;DutA6A4y+1`&a}UWYu;ee?1+-oEShN>ftY6%(G2V^xNMlL4HbnkHRI2L0m$1#!X0sc3?9Odni>pNN&|H#dL~;_N$oAY5pEL$hE&5T6AeDMWV`}=!W{g&^HO$rXo)5C&xx;FARzxn#gG=%zQm=U?V^xlr_;1V5 z%Q7@ECtemEALdqY3lB831Uv53QH!|HFlVaW53f(}MICpBW-BFBJ1HKVih+rL^{W)0 za_V=QFN^Z6>7zR>