From 349e22bbe8ca9bc7a53712dcebfb4ed168b3f3d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Soko=C5=82owski?= Date: Fri, 3 Jun 2022 18:59:21 +0200 Subject: [PATCH] nix: add Nix flake to build node and library MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This way we can build node or the library locally using: ```sh nix build nix build .#node nix build .#library ``` Or just start a shell with Go `1.19.x` using: ``` nix develop ``` Which simply has the same environment as the build shell for the node. One known snag is that there is currently no simple way to keep `vendorSha256` updated to match the contents of `go.mod` and `go.sum`. For more details see: https://discourse.nixos.org/t/how-should-i-build-a-go-package-from-local-source/19490/8 One way around this would be to have our own `vendor` folder, but that's also a pretty ugly solution that requires manual updating. Resolves: https://github.com/waku-org/go-waku/issues/256 Signed-off-by: Jakub SokoĊ‚owski --- .gitignore | 4 ++- README.md | 13 ++++++++ ci/Jenkinsfile.nix-flake | 70 ++++++++++++++++++++++++++++++++++++++++ flake.lock | 27 ++++++++++++++++ flake.nix | 44 +++++++++++++++++++++++++ 5 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 ci/Jenkinsfile.nix-flake create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/.gitignore b/.gitignore index d2639232..e33c9c03 100644 --- a/.gitignore +++ b/.gitignore @@ -53,6 +53,8 @@ Gowaku.xcframework # Icon must end with two \r Icon +# Nix +result # Thumbnails ._* @@ -168,4 +170,4 @@ iOSInjectionProject/ /*.gcno **/xcshareddata/WorkspaceSettings.xcsettings -# End of https://www.toptal.com/developers/gitignore/api/swift,xcode,Cobjective-c,osx \ No newline at end of file +# End of https://www.toptal.com/developers/gitignore/api/swift,xcode,Cobjective-c,osx diff --git a/README.md b/README.md index 8fcabffe..917b40c5 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,19 @@ make # See the available command line options with ./build/waku --help ``` +#### Nix +You can build Waku v2 node using [Nix](https://nixos.org/) [Flakes](https://nixos.wiki/wiki/Flakes): +```sh +nix build github:waku-org/go-waku +``` +Or build the library using: +``` +nix build github:waku-org/go-waku#library +``` +To start a shell with build dependencies use: +``` +nix develop +``` #### Docker ``` diff --git a/ci/Jenkinsfile.nix-flake b/ci/Jenkinsfile.nix-flake new file mode 100644 index 00000000..c36c09c0 --- /dev/null +++ b/ci/Jenkinsfile.nix-flake @@ -0,0 +1,70 @@ +library 'status-jenkins-lib@v1.6.8' + +pipeline { + agent { + label 'linux' + } + + options { + timestamps() + disableConcurrentBuilds() + /* Prevent Jenkins jobs from running forever */ + timeout(time: 30, unit: 'MINUTES') + /* Limit builds retained */ + buildDiscarder(logRotator( + numToKeepStr: '10', + daysToKeepStr: '20', + artifactNumToKeepStr: '10', + )) + } + + environment { + TARGET = 'nix-flake' + } + + stages { + stage('Node') { + stages { + stage('Build') { + steps { script { + sh("""#!/usr/bin/env bash + ${nix._sourceProfileInline()} + nix build --print-out-paths .#node + """) + } } + } + stage('Check') { + steps { + sh './result/bin/waku --version' + } + } + } + } + + stage('Library') { + stages { + stage('Build') { + steps { script { + sh("""#!/usr/bin/env bash + ${nix._sourceProfileInline()} + nix build --print-out-paths .#library + """) + } } + } + stage('Check') { + steps { + sh 'ldd ./result/bin/library' + } + } + } + } + } + post { + always { script { /* No artifact but a PKG_URL is necessary. */ + env.PKG_URL = "${currentBuild.absoluteUrl}/consoleText" + } } + success { script { github.notifyPR(true) } } + failure { script { github.notifyPR(false) } } + cleanup { cleanWs() } + } +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..8e99d677 --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1677779205, + "narHash": "sha256-6DBjL9wjq86p2GczmwnHtFRnWPBPItc67gapWENBgX8=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "96e18717904dfedcd884541e5a92bf9ff632cf39", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..6d700ba6 --- /dev/null +++ b/flake.nix @@ -0,0 +1,44 @@ +{ + description = "Nix flake for Go implementaion of Waku v2 node."; + + inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-22.11; + + outputs = { self, nixpkgs }: + let + supportedSystems = [ "x86_64-linux" "i686-linux" "aarch64-linux" ]; + forAllSystems = f: nixpkgs.lib.genAttrs supportedSystems (system: f system); + + nixpkgsFor = forAllSystems (system: import nixpkgs { inherit system; }); + + buildPackage = system: subPackages: + let + pkgs = nixpkgsFor.${system}; + commit = builtins.substring 0 7 (self.rev or "dirty"); + version = builtins.readFile ./VERSION; + in pkgs.buildGo119Module { + name = "go-waku"; + src = self; + inherit subPackages; + ldflags = [ + "-X github.com/waku-org/go-waku/waku/v2/node.GitCommit=${commit}" + "-X github.com/waku-org/go-waku/waku/v2/node.Version=${version}" + ]; + doCheck = false; + # FIXME: This needs to be manually changed when updating modules. + vendorSha256 = "sha256-TvQfLQEYDujfXInQ+i/LoSGtedozZvX8WgzpqiryYHY="; + }; + in rec { + packages = forAllSystems (system: { + node = buildPackage system ["cmd/waku"]; + library = buildPackage system ["library"]; + }); + + defaultPackage = forAllSystems (system: + buildPackage system ["cmd/waku"] + ); + + devShells.default = forAllSystems (system: + packages.${system}.node + ); + }; +}