sourcegraph/shell.nix
Noah S-C 98e0f75d1e
bazel: use transitions to apply cross-compile platform automatically to oci_image (#60569)
Removes the need to pass `--config=docker-darwin` through the following mechanisms:

1. `--enable_platform_specific_config` to enable certain flags on macos only e.g. `--extra_toolchains @zig_sdk//toolchain:linux_amd64_gnu.2.34` and `--sandbox_add_mount_pair=/tmp` (see [.bazelrc change](https://github.com/sourcegraph/sourcegraph/pull/60569/files?file-filters%5B%5D=dotfile&show-viewed-files=true))
2. Apply a transition (using https://github.com/fmeum/with_cfg.bzl, please view [the following great video on it](https://www.youtube.com/watch?v=U5bdQRQY-io)) on `oci_image` targets when on the `@platforms//os:macos` platform to transition to the `@zig_sdk//platform:linux_amd64` platform. 
	- This will start at `oci_image` targets and propagate down to e.g. `go_{binary,library}` etc targets with the "transitioned" platform configuration, resulting in them being built with the transitioned-to platform
3. Remove `darwin_docker_e2e_go` config_setting and `darwin-docker` bool_flag.
	- These aren't necessary anymore, as the places where these were used were not in the transitive closure rooted at an `oci_image` target, meaning they wouldn't be transitioned.

To review, view [the following (filtered) files](https://github.com/sourcegraph/sourcegraph/pull/60569/files?file-filters%5B%5D=.bzl&file-filters%5B%5D=.sh&file-filters%5B%5D=.yaml&file-filters%5B%5D=No+extension&file-filters%5B%5D=dotfile&show-viewed-files=true)  along with [the root BUILD.bazel](https://github.com/sourcegraph/sourcegraph/pull/60569/files#diff-7fc57714ef13c3325ce2a1130202edced92fcccc0c6db34a72f7b57f60d552a3). All the other files are just changing the `load` statements from `@rules_oci` to `//dev:oci_defs.bzl`

## Test plan

CI, checked image locally and `sg test bazel-backend-integration` & `sg test bazel-e2e`
2024-02-20 13:57:56 +00:00

149 lines
5.1 KiB
Nix

# Experimental support for developing in nix. Please reach out to @keegan or @noah if
# you encounter any issues.
#
# Things it does differently:
#
# - Runs postgres under ~/.sourcegraph with a unix socket. No need to manage a
# service. Must remember to run "pg_ctl stop" if you want to stop it.
#
# Status: everything works on linux & darwin.
{ pkgs
, buildFHSEnv
, mkShell
, hostPlatform
, lib
, writeShellScriptBin
}:
let
# On darwin, we let bazelisk manage the bazel version since we actually need to run two
# different versions thanks to aspect. Additionally bazelisk allows us to do
# things like "bazel configure". So we just install a script called bazel
# which calls bazelisk.
#
# Additionally bazel seems to break when CC and CXX is set to a nix managed
# compiler on darwin. So the script unsets those.
bazel-wrapper = writeShellScriptBin "bazel" (if hostPlatform.isMacOS then ''
export CC=/usr/bin/clang
exec ${pkgs.bazelisk}/bin/bazelisk "$@"
'' else ''
unset TMPDIR TMP
exec ${pkgs.bazel_7}/bin/bazel "$@"
'');
bazel-watcher = writeShellScriptBin "ibazel" ''
${lib.optionalString hostPlatform.isMacOS "export CC=/usr/bin/clang"}
exec ${pkgs.bazel-watcher}/bin/ibazel \
${lib.optionalString hostPlatform.isLinux "-bazel_path=${bazel-fhs}/bin/bazel"} "$@"
'';
bazel-fhs = buildFHSEnv {
name = "bazel";
runScript = "bazel";
targetPkgs = pkgs: (with pkgs; [
bazel-wrapper
zlib.dev
]);
# unsharePid required to preserve bazel server between bazel invocations,
# the rest are disabled just in case
unsharePid = false;
unshareUser = false;
unshareIpc = false;
unshareNet = false;
unshareUts = false;
unshareCgroup = false;
};
# pkgs.universal-ctags installs the binary as "ctags", not "universal-ctags"
# like zoekt expects.
universal-ctags = pkgs.writeScriptBin "universal-ctags" ''
#!${pkgs.stdenv.shell}
exec ${pkgs.universal-ctags}/bin/ctags "$@"
'';
# We have scripts which use gsed on darwin since that is what homebrew calls
# the binary for GNU sed.
gsed = pkgs.writeShellScriptBin "gsed" ''exec ${pkgs.gnused}/bin/sed "$@"'';
in
mkShell.override { stdenv = if hostPlatform.isMacOS then pkgs.clang11Stdenv else pkgs.stdenv; } {
name = "sourcegraph-dev";
# The packages in the `buildInputs` list will be added to the PATH in our shell
nativeBuildInputs = with pkgs; [
bashInteractive
zip
# nix language server.
nil
# Our core DB.
postgresql_13
# Cache and some store data.
redis
# Used by symbols and zoekt-git-index to extract symbols from sourcecode.
universal-ctags
# Build our backend. Sometimes newer :^)
go_1_21
# Lots of our tooling and go tests rely on git et al.
comby
git
git-lfs
gsed
nssTools
parallel
# CI lint tools you need locally.
shfmt
shellcheck
# Web tools.
nodejs-20_x
nodejs-20_x.pkgs.pnpm
nodejs-20_x.pkgs.typescript
nodejs-20_x.pkgs.typescript-language-server
# Rust utils for syntax-highlighter service, currently not pinned to the same versions.
cargo
rustc
rustfmt
libiconv
clippy
bazel-buildtools
] ++ lib.optional hostPlatform.isLinux (with pkgs; [
# bazel via nix is broken on MacOS for us. Lets just rely on bazelisk from brew.
# special sauce bazel stuff.
bazelisk # needed to please sg, but not used directly by us
bazel-fhs
bazel-watcher
]) ++ lib.optional hostPlatform.isMacOS [ bazel-wrapper ];
# Startup postgres, redis & set nixos specific stuff
shellHook = ''
set -h # command hashmap is not guaranteed to be enabled, but required by sg
. ./dev/nix/shell-hook.sh
'';
# Fix for using Delve https://github.com/sourcegraph/sourcegraph/pull/35885
hardeningDisable = [ "fortify" ];
# By explicitly setting this environment variable we avoid starting up
# universal-ctags via docker.
CTAGS_COMMAND = "${universal-ctags}/bin/universal-ctags";
RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}";
# Some of the bazel actions require some tools assumed to be in the PATH defined by the "strict action env" that we enable
# through --incompatible_strict_action_env. We can poke a custom PATH through with --action_env=PATH=$BAZEL_ACTION_PATH.
# See https://sourcegraph.com/github.com/bazelbuild/bazel@6.1.2/-/blob/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java?L532-547
BAZEL_ACTION_PATH = with pkgs; lib.makeBinPath [ file hexdump bashInteractive stdenv.cc coreutils unzip zip curl gzip gnutar gnugrep gnused git patch openssh findutils perl python39 which postgresql_13 docker-credential-helpers ];
# bazel complains when the bazel version differs even by a patch version to whats defined in .bazelversion,
# so we tell it to h*ck off here.
# https://sourcegraph.com/github.com/bazelbuild/bazel@1a4da7f331c753c92e2c91efcad434dc29d10d43/-/blob/scripts/packages/bazel.sh?L23-28
USE_BAZEL_VERSION = if hostPlatform.isMacOS then "" else pkgs.bazel_7.version;
LIBTOOL = if hostPlatform.isMacOS then "/usr/bin/libtool" else "";
}