-
-
Notifications
You must be signed in to change notification settings - Fork 12.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
minikube: switch to build from source & fix on Darwin
Linux behavior should be largely unchanged but we now build minikube ourselves. Unfortunately localkube is still tricky to build so I pull in a binary version from upstream.
- Loading branch information
Showing
1 changed file
with
59 additions
and
29 deletions.
There are no files selected for viewing
88 changes: 59 additions & 29 deletions
88
pkgs/applications/networking/cluster/minikube/default.nix
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,47 +1,77 @@ | ||
{ stdenv, lib, fetchurl, makeWrapper, docker-machine-kvm, kubernetes, libvirt, qemu }: | ||
{ stdenv, buildGoPackage, fetchFromGitHub, fetchurl, go-bindata, kubernetes, libvirt, qemu, docker-machine-kvm, makeWrapper }: | ||
|
||
let | ||
arch = if stdenv.isLinux | ||
then "linux-amd64" | ||
else "darwin-amd64"; | ||
checksum = if stdenv.isLinux | ||
then "0cdcabsx5l4jbpyj3zzyz5bnzks6wl64bmzdsnk41x92ar5y5yal" | ||
else "12f3b7s5lwpvzx4wj6i6h62n4zjshqf206fxxwpwx9kpsdaw6xdi"; | ||
binPath = [ kubernetes ] | ||
++ stdenv.lib.optionals stdenv.isLinux [ libvirt qemu docker-machine-kvm ] | ||
++ stdenv.lib.optionals stdenv.isDarwin []; | ||
|
||
# TODO: compile from source | ||
|
||
in stdenv.mkDerivation rec { | ||
pname = "minikube"; | ||
# Normally, minikube bundles localkube in its own binary via go-bindata. Unfortunately, it needs to make that localkube | ||
# a static linux binary, and our Linux nixpkgs go compiler doesn't seem to work when asking for a cgo binary that's static | ||
# (presumably because we don't have some static system libraries it wants), and cross-compiling cgo on Darwin is a nightmare. | ||
# | ||
# Note that minikube can download (and cache) versions of localkube it needs on demand. Unfortunately, minikube's knowledge | ||
# of where it can download versions of localkube seems to rely on a json file that doesn't get updated as often as we'd like, | ||
# so for example it doesn't know about v1.5.3 even though there's a perfectly good version of localkube hosted there. So | ||
# instead, we download localkube ourselves and shove it into the minikube binary. The versions URL that minikube uses is | ||
# currently https://storage.googleapis.com/minikube/k8s_releases.json. Note that we can't use 1.5.3 with minikube 0.17.1 | ||
# expects to be able to pass it a command-line argument that it doesn't understand. v1.5.4 and higher should be fine. There | ||
# doesn't seem to ae any official release of localkube for 1.5.4 yet so I'm temporarily grabbing a version built from the | ||
# minikube CI server. | ||
localkube-binary = fetchurl { | ||
url = "https://storage.googleapis.com/minikube-builds/1216/localkube"; | ||
# url = "https://storage.googleapis.com/minikube/k8sReleases/v${kubernetes.version}/localkube-linux-amd64"; | ||
sha256 = "1vqrsak7n045ci6af3rpgs2qwjnrqk8k7c3ax6wzli4m8vhsiv57"; | ||
}; | ||
in buildGoPackage rec { | ||
pname = "minikube"; | ||
name = "${pname}-${version}"; | ||
version = "0.17.1"; | ||
name = "${pname}-${version}"; | ||
|
||
src = fetchurl { | ||
url = "https://storage.googleapis.com/minikube/releases/v${version}/minikube-${arch}"; | ||
sha256 = "${checksum}"; | ||
goPackagePath = "k8s.io/minikube"; | ||
|
||
src = fetchFromGitHub { | ||
owner = "kubernetes"; | ||
repo = "minikube"; | ||
rev = "v${version}"; | ||
sha256 = "1m61yipn0p3cfavjddhrg1rcmr0hv6k3zxvqqd9fisl79g0sdfsr"; | ||
}; | ||
|
||
phases = [ "installPhase" "fixupPhase" ]; | ||
# kubernetes is here only to shut up a loud warning when generating the completions below. minikube checks very eagerly | ||
# that kubectl is on the $PATH, even if it doesn't use it at all to generate the completions | ||
buildInputs = [ go-bindata makeWrapper kubernetes ]; | ||
subPackages = [ "cmd/minikube" ]; | ||
|
||
buildInputs = [ makeWrapper ]; | ||
preBuild = '' | ||
pushd go/src/${goPackagePath} >/dev/null | ||
binPath = lib.makeBinPath [ docker-machine-kvm kubernetes libvirt qemu ]; | ||
mkdir -p out | ||
cp ${localkube-binary} out/localkube | ||
installPhase = '' | ||
install -Dm755 ${src} $out/bin/${pname} | ||
''; | ||
go-bindata -nomemcopy -o pkg/minikube/assets/assets.go -pkg assets ./out/localkube deploy/addons/... | ||
fixupPhase = '' | ||
patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$out/bin/minikube" | ||
ISO_VERSION=$(grep "^ISO_VERSION" Makefile | sed "s/^.*\s//") | ||
ISO_BUCKET=$(grep "^ISO_BUCKET" Makefile | sed "s/^.*\s//") | ||
wrapProgram $out/bin/${pname} \ | ||
--prefix PATH : ${binPath} | ||
export buildFlagsArray="-ldflags=\ | ||
-X k8s.io/minikube/pkg/version.version=v${version} \ | ||
-X k8s.io/minikube/pkg/version.isoVersion=$ISO_VERSION \ | ||
-X k8s.io/minikube/pkg/version.isoPath=$ISO_BUCKET" | ||
popd >/dev/null | ||
''; | ||
|
||
postInstall = '' | ||
mkdir -p $bin/share/bash-completion/completions/ | ||
MINIKUBE_WANTUPDATENOTIFICATION=false HOME=$PWD $bin/bin/minikube completion bash > $bin/share/bash-completion/completions/minikube | ||
''; | ||
|
||
postFixup = "wrapProgram $bin/bin/${pname} --prefix PATH : ${stdenv.lib.makeBinPath binPath}"; | ||
|
||
meta = with stdenv.lib; { | ||
homepage = https://github.com/kubernetes/minikube; | ||
homepage = https://github.com/kubernetes/minikube; | ||
description = "A tool that makes it easy to run Kubernetes locally"; | ||
license = licenses.asl20; | ||
maintainers = with maintainers; [ ebzzry ]; | ||
platforms = with platforms; linux ++ darwin; | ||
license = licenses.asl20; | ||
maintainers = with maintainers; [ ebzzry copumpkin ]; | ||
platforms = with platforms; unix; | ||
}; | ||
} |