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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
{ lib, stdenv, buildGoModule, fetchFromGitHub, removeReferencesTo
, tzdata, wire
, yarn, nodejs, python3, cacert
, jq, moreutils
, nix-update-script, nixosTests, xcbuild
}:
let
# We need dev dependencies to run webpack, but patch away
# `cypress` (and @grafana/e2e which has a direct dependency on cypress).
# This attempts to download random blobs from the Internet in
# postInstall. Also, it's just a testing framework, so not worth the hassle.
patchAwayGrafanaE2E = ''
find . -name package.json | while IFS=$'\n' read -r pkg_json; do
<"$pkg_json" jq '. + {
"devDependencies": .devDependencies | del(."@grafana/e2e") | del(.cypress)
}' | sponge "$pkg_json"
done
rm -r packages/grafana-e2e
'';
in
buildGoModule rec {
pname = "grafana";
version = "10.4.2";
subPackages = [ "pkg/cmd/grafana" "pkg/cmd/grafana-server" "pkg/cmd/grafana-cli" ];
src = fetchFromGitHub {
owner = "grafana";
repo = "grafana";
rev = "v${version}";
hash = "sha256-ahG9ABJJUUgrFqqNjkJRA1Gia8T4J90jIsCMFOhZ55w=";
};
# borrowed from: https://github.com/NixOS/nixpkgs/blob/d70d9425f49f9aba3c49e2c389fe6d42bac8c5b0/pkgs/development/tools/analysis/snyk/default.nix#L20-L22
env = lib.optionalAttrs (stdenv.isDarwin && stdenv.isx86_64) {
# Fix error: no member named 'aligned_alloc' in the global namespace.
# Occurs while building @esfx/equatable@npm:1.0.2 on x86_64-darwin
NIX_CFLAGS_COMPILE = "-D_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION=1";
};
offlineCache = stdenv.mkDerivation {
name = "${pname}-${version}-yarn-offline-cache";
inherit src env;
nativeBuildInputs = [
yarn nodejs cacert
jq moreutils python3
# @esfx/equatable@npm:1.0.2 fails to build on darwin as it requires `xcbuild`
] ++ lib.optionals stdenv.isDarwin [ xcbuild.xcbuild ];
postPatch = ''
${patchAwayGrafanaE2E}
'';
buildPhase = ''
runHook preBuild
export HOME="$(mktemp -d)"
yarn config set enableTelemetry 0
yarn config set cacheFolder $out
yarn config set --json supportedArchitectures.os '[ "linux", "darwin" ]'
yarn config set --json supportedArchitectures.cpu '["arm", "arm64", "ia32", "x64"]'
yarn
runHook postBuild
'';
dontConfigure = true;
dontInstall = true;
dontFixup = true;
outputHashMode = "recursive";
outputHash = rec {
x86_64-linux = "sha256-3CZgs732c6Z64t2sfWjPAmMFKVTzoolv2TwrbjeRCBA=";
aarch64-linux = x86_64-linux;
aarch64-darwin = "sha256-NKEajOe9uDZw0MF5leiKBIRH1CHUELRho7gyCa96BO8=";
x86_64-darwin = aarch64-darwin;
}.${stdenv.hostPlatform.system} or (throw "Unsupported system: ${stdenv.hostPlatform.system}");
};
disallowedRequisites = [ offlineCache ];
vendorHash = "sha256-XmIF/ZWVO1qjSmRPTFnHgxvnliXXicGgsV8gQcKJl9U=";
proxyVendor = true;
nativeBuildInputs = [ wire yarn jq moreutils removeReferencesTo python3 ] ++ lib.optionals stdenv.isDarwin [ xcbuild.xcbuild ];
postPatch = ''
${patchAwayGrafanaE2E}
'';
postConfigure = ''
# Generate DI code that's required to compile the package.
# From https://github.com/grafana/grafana/blob/v8.2.3/Makefile#L33-L35
wire gen -tags oss ./pkg/server
wire gen -tags oss ./pkg/cmd/grafana-cli/runner
GOARCH= CGO_ENABLED=0 go generate ./pkg/plugins/plugindef
GOARCH= CGO_ENABLED=0 go generate ./kinds/gen.go
GOARCH= CGO_ENABLED=0 go generate ./public/app/plugins/gen.go
# Setup node_modules
export HOME="$(mktemp -d)"
# Help node-gyp find Node.js headers
# (see https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks/javascript.section.md#pitfalls-javascript-yarn2nix-pitfalls)
mkdir -p $HOME/.node-gyp/${nodejs.version}
echo 9 > $HOME/.node-gyp/${nodejs.version}/installVersion
ln -sfv ${nodejs}/include $HOME/.node-gyp/${nodejs.version}
export npm_config_nodedir=${nodejs}
yarn config set enableTelemetry 0
yarn config set cacheFolder $offlineCache
yarn --immutable-cache
# The build OOMs on memory constrained aarch64 without this
export NODE_OPTIONS=--max_old_space_size=4096
'';
postBuild = ''
# After having built all the Go code, run the JS builders now.
yarn run build
yarn run plugins:build-bundled
'';
ldflags = [
"-s" "-w" "-X main.version=${version}"
];
# Tests start http servers which need to bind to local addresses:
# panic: httptest: failed to listen on a port: listen tcp6 [::1]:0: bind: operation not permitted
__darwinAllowLocalNetworking = true;
# On Darwin, files under /usr/share/zoneinfo exist, but fail to open in sandbox:
# TestValueAsTimezone: date_formats_test.go:33: Invalid has err for input "Europe/Amsterdam": operation not permitted
preCheck = ''
export ZONEINFO=${tzdata}/share/zoneinfo
'';
postInstall = ''
mkdir -p $out/share/grafana
cp -r public conf $out/share/grafana/
'';
postFixup = ''
while read line; do
remove-references-to -t $offlineCache "$line"
done < <(find $out -type f -name '*.js.map' -or -name '*.js')
'';
passthru = {
tests = { inherit (nixosTests) grafana; };
updateScript = nix-update-script { };
};
meta = with lib; {
description = "Gorgeous metric viz, dashboards & editors for Graphite, InfluxDB & OpenTSDB";
license = licenses.agpl3Only;
homepage = "https://grafana.com";
maintainers = with maintainers; [ offline fpletz willibutz globin ma27 Frostman ];
platforms = [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ];
mainProgram = "grafana-server";
};
}
|