1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
# Make sure that the "with-gce" flag is set when building `google-cloud-sdk`
# for GCE hosts. This flag prevents "google-compute-engine" from being a
# default dependency which is undesirable because this package is
#
# 1) available only on GNU/Linux (requires `systemd` in particular)
# 2) intended only for GCE guests (and is useless elsewhere)
# 3) used by `google-cloud-sdk` only on GCE guests
#
{ stdenv, lib, fetchurl, makeWrapper, python, openssl, jq, callPackage, with-gce ? false }:
let
pythonEnv = python.withPackages (p: with p; [
cffi
cryptography
openssl
crcmod
numpy
] ++ lib.optional (with-gce) google-compute-engine);
data = import ./data.nix { };
sources = system:
data.googleCloudSdkPkgs.${system} or (throw "Unsupported system: ${system}");
components = callPackage ./components.nix {
snapshotPath = ./components.json;
};
withExtraComponents = callPackage ./withExtraComponents.nix { inherit components; };
in stdenv.mkDerivation rec {
pname = "google-cloud-sdk";
inherit (data) version;
src = fetchurl (sources stdenv.hostPlatform.system);
buildInputs = [ python ];
nativeBuildInputs = [ jq makeWrapper ];
patches = [
# For kubectl configs, don't store the absolute path of the `gcloud` binary as it can be garbage-collected
./gcloud-path.patch
# Disable checking for updates for the package
./gsutil-disable-updates.patch
];
installPhase = ''
runHook preInstall
mkdir -p $out/google-cloud-sdk
if [ -d .install/platform/bundledpythonunix ]; then
rm -r .install/platform/bundledpythonunix
fi
cp -R * .install $out/google-cloud-sdk/
mkdir -p $out/google-cloud-sdk/lib/surface/{alpha,beta}
cp ${./alpha__init__.py} $out/google-cloud-sdk/lib/surface/alpha/__init__.py
cp ${./beta__init__.py} $out/google-cloud-sdk/lib/surface/beta/__init__.py
# create wrappers with correct env
for program in gcloud bq gsutil git-credential-gcloud.sh docker-credential-gcloud; do
programPath="$out/google-cloud-sdk/bin/$program"
binaryPath="$out/bin/$program"
wrapProgram "$programPath" \
--set CLOUDSDK_PYTHON "${pythonEnv}/bin/python" \
--prefix PYTHONPATH : "${pythonEnv}/${python.sitePackages}" \
--prefix PATH : "${openssl.bin}/bin"
mkdir -p $out/bin
ln -s $programPath $binaryPath
done
# disable component updater and update check
substituteInPlace $out/google-cloud-sdk/lib/googlecloudsdk/core/config.json \
--replace-fail "\"disable_updater\": false" "\"disable_updater\": true"
echo "
[component_manager]
disable_update_check = true" >> $out/google-cloud-sdk/properties
# setup bash completion
mkdir -p $out/share/bash-completion/completions
mv $out/google-cloud-sdk/completion.bash.inc $out/share/bash-completion/completions/gcloud
ln -s $out/share/bash-completion/completions/gcloud $out/share/bash-completion/completions/gsutil
# setup zsh completion
mkdir -p $out/share/zsh/site-functions
mv $out/google-cloud-sdk/completion.zsh.inc $out/share/zsh/site-functions/_gcloud
ln -s $out/share/zsh/site-functions/_gcloud $out/share/zsh/site-functions/_gsutil
# zsh doesn't load completions from $FPATH without #compdef as the first line
sed -i '1 i #compdef gcloud' $out/share/zsh/site-functions/_gcloud
# This directory contains compiled mac binaries. We used crcmod from
# nixpkgs instead.
rm -r $out/google-cloud-sdk/platform/gsutil/third_party/crcmod \
$out/google-cloud-sdk/platform/gsutil/third_party/crcmod_osx
# remove tests and test data
find $out -name tests -type d -exec rm -rf '{}' +
rm $out/google-cloud-sdk/platform/gsutil/gslib/commands/test.py
# compact all the JSON
find $out -name \*.json | while read path; do
jq -c . $path > $path.min
mv $path.min $path
done
runHook postInstall
'';
doInstallCheck = true;
installCheckPhase = ''
# Avoid trying to write logs to homeless-shelter
export HOME=$(mktemp -d)
$out/bin/gcloud version --format json | jq '."Google Cloud SDK"' | grep "${version}"
'';
passthru = {
inherit components withExtraComponents;
updateScript = ./update.sh;
};
meta = with lib; {
description = "Tools for the google cloud platform";
longDescription = "The Google Cloud SDK. This package has the programs: gcloud, gsutil, and bq";
sourceProvenance = with sourceTypes; [
fromSource
binaryNativeCode # anthoscli and possibly more
];
# This package contains vendored dependencies. All have free licenses.
license = licenses.free;
homepage = "https://cloud.google.com/sdk/";
changelog = "https://cloud.google.com/sdk/docs/release-notes";
maintainers = with maintainers; [ iammrinal0 marcusramberg pradyuman stephenmw zimbatm ];
platforms = builtins.attrNames data.googleCloudSdkPkgs;
mainProgram = "gcloud";
};
}
|