From 35ebdd5b7ea2a9ce6da72aeb5d123463a1d8b1f2 Mon Sep 17 00:00:00 2001 From: Trolli Schmittlauch Date: Wed, 10 Mar 2021 02:27:11 +0100 Subject: [PATCH] Initial commit --- .github/dependabot.yml | 6 +++ .github/workflows/build.yml | 65 ++++++++++++++++++++++++++++++++ .gitignore | 3 ++ .travis.yml | 40 ++++++++++++++++++++ LICENSE | 22 +++++++++++ README.md | 37 ++++++++++++++++++ ci.nix | 53 ++++++++++++++++++++++++++ default.nix | 20 ++++++++++ lib/default.nix | 7 ++++ modules/default.nix | 5 +++ overlay.nix | 15 ++++++++ overlays/default.nix | 5 +++ pkgs/example-package/default.nix | 9 +++++ 13 files changed, 287 insertions(+) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 ci.nix create mode 100644 default.nix create mode 100644 lib/default.nix create mode 100644 modules/default.nix create mode 100644 overlay.nix create mode 100644 overlays/default.nix create mode 100644 pkgs/example-package/default.nix diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..5ace460 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..e9e76c6 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,65 @@ +name: "Build and populate cache" +on: + pull_request: + push: + schedule: + # rebuild everyday at 2:51 + # TIP: Choose a random time here so not all repositories are build at once: + # https://www.random.org/clock-times/?num=1&earliest=01%3A00&latest=08%3A00&interval=5&format=html&rnd=new + - cron: '51 2 * * *' +jobs: + tests: + strategy: + matrix: + # Set this to notify the global nur package registry that changes are + # available. + # + # The repo name as used in + # https://github.com/nix-community/NUR/blob/master/repos.json + nurRepo: + - + # Set this to cache your build results in cachix for faster builds + # in CI and for everyone who uses your cache. + # + # Format: Your cachix cache host name without the ".cachix.org" suffix. + # Example: mycache (for mycache.cachix.org) + # + # For this to work, you also need to set the CACHIX_SIGNING_KEY secret + # in your repository settings in Github found at https://github.com//nur-packages/settings/secrets + cachixName: + - + nixPath: + - nixpkgs=channel:nixos-unstable + - nixpkgs=channel:nixpkgs-unstable + - nixpkgs=channel:nixos-20.09 + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2.3.4 + - name: Install nix + uses: cachix/install-nix-action@v12 + with: + nix_path: "${{ matrix.nixPath }}" + - name: Show nixpkgs version + run: nix-instantiate --eval -E '(import {}).lib.version' + - name: Setup cachix + uses: cachix/cachix-action@v8 + if: ${{ matrix.cachixName != '' }} + with: + name: ${{ matrix.cachixName }} + signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}' + - name: Check evaluation + run: | + nix-env -f . -qa \* --meta --xml \ + --allowed-uris https://static.rust-lang.org \ + --option restrict-eval true \ + --option allow-import-from-derivation true \ + --drv-path --show-trace \ + -I nixpkgs=$(nix-instantiate --find-file nixpkgs) \ + -I $PWD + - name: Build nix packages + # TODO switch to default nixpkgs channel once nix-build-uncached 1.0.0 is in stable + run: nix run -I 'nixpkgs=channel:nixos-unstable' nixpkgs.nix-build-uncached -c nix-build-uncached ci.nix -A cacheOutputs + - name: Trigger NUR update + if: ${{ matrix.nurRepo != '' }} + run: curl -XPOST "https://nur-update.herokuapp.com/update?repo=${{ matrix.nurRepo }}" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7dc3520 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +result +result-* + diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..ef6bb32 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,40 @@ +version: ~> 1.0 +import: nix-community/nix-travis-ci:nix.yml@main + +sudo: false + +env: + global: + # Set this to cache your build results in cachix for faster builds + # in travis and for everyone who uses your cache. + # + # Format: Your cachix cache host name without the ".cachix.org" suffix. + # Example: mycache (for mycache.cachix.org) + # + # For this to work, you also need to set the CACHIX_SIGNING_KEY + # in your repository settings in Travis. + # - CACHIX_CACHE= + # Set this to notify the global nur package registry that changes are + # available. + # + # The repo name as used in + # https://github.com/nix-community/NUR/blob/master/repos.json + - NUR_REPO="" + +matrix: + include: + - env: NIX_PATH=nixpkgs=channel:nixpkgs-unstable + - env: NIX_PATH=nixpkgs=channel:nixos-unstable + - env: NIX_PATH=nixpkgs=channel:nixos-20.03 + +script: + - nix-build ci.nix -A buildOutputs + - nix eval -f default.nix 'lib' + - nix eval -f default.nix 'modules' + - nix eval -f default.nix 'overlays' + +after_success: + - if [ -n "${CACHIX_CACHE}" ]; then nix-build ci.nix -A cacheOutputs | cachix push "${CACHIX_CACHE}"; fi + - if [[ NUR_REPO != "" && "cron" != "${TRAVIS_EVENT_TYPE}" && "false" = "${TRAVIS_PULL_REQUEST}" && "master" = "${TRAVIS_BRANCH}" ]]; then + curl -XPOST "https://nur-update.herokuapp.com/update?repo=${NUR_REPO}"; fi + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..212cbf2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2018 Francesco Gazzetta + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..077cfbc --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +# nur-packages-template + +**A template for [NUR](https://github.com/nix-community/NUR) repositories** + +## Setup + +1. Click on [Use this template](https://github.com/nix-community/nur-packages-template/generate) to start a repo based on this template. (Do _not_ fork it.) +2. Add your packages to the [pkgs](./pkgs) directory and to + [default.nix](./default.nix) + * Remember to mark the broken packages as `broken = true;` in the `meta` + attribute, or travis (and consequently caching) will fail! + * Library functions, modules and overlays go in the respective directories +3. Choose your CI: Depending on your preference you can use github actions (recommended) or [Travis ci](https://travis-ci.com). + - Github actions: Change your NUR repo name and optionally add a cachix name in [.github/workflows/build.yml](./.github/workflows/build.yml) and change the cron timer + to a random value as described in the file + - Travis ci: Change your NUR repo name and optionally your cachix repo name in + [.travis.yml](./.travis.yml). Than enable travis in your repo. You can add a cron job in the repository settings on travis to keep your cachix cache fresh +5. Change your travis and cachix names on the README template section and delete + the rest +6. [Add yourself to NUR](https://github.com/nix-community/NUR#how-to-add-your-own-repository) + +## README template + +# nur-packages + +**My personal [NUR](https://github.com/nix-community/NUR) repository** + + +![Build and populate cache](https://github.com//nur-packages/workflows/Build%20and%20populate%20cache/badge.svg) + + +[![Cachix Cache](https://img.shields.io/badge/cachix--blue.svg)](https://.cachix.org) + diff --git a/ci.nix b/ci.nix new file mode 100644 index 0000000..22b1352 --- /dev/null +++ b/ci.nix @@ -0,0 +1,53 @@ +# This file provides all the buildable and cacheable packages and +# package outputs in your package set. These are what gets built by CI, +# so if you correctly mark packages as +# +# - broken (using `meta.broken`), +# - unfree (using `meta.license.free`), and +# - locally built (using `preferLocalBuild`) +# +# then your CI will be able to build and cache only those packages for +# which this is possible. + +{ pkgs ? import { } }: + +with builtins; +let + isReserved = n: n == "lib" || n == "overlays" || n == "modules"; + isDerivation = p: isAttrs p && p ? type && p.type == "derivation"; + isBuildable = p: !(p.meta.broken or false) && p.meta.license.free or true; + isCacheable = p: !(p.preferLocalBuild or false); + shouldRecurseForDerivations = p: isAttrs p && p.recurseForDerivations or false; + + nameValuePair = n: v: { name = n; value = v; }; + + concatMap = builtins.concatMap or (f: xs: concatLists (map f xs)); + + flattenPkgs = s: + let + f = p: + if shouldRecurseForDerivations p then flattenPkgs p + else if isDerivation p then [ p ] + else [ ]; + in + concatMap f (attrValues s); + + outputsOf = p: map (o: p.${o}) p.outputs; + + nurAttrs = import ./default.nix { inherit pkgs; }; + + nurPkgs = + flattenPkgs + (listToAttrs + (map (n: nameValuePair n nurAttrs.${n}) + (filter (n: !isReserved n) + (attrNames nurAttrs)))); + +in +rec { + buildPkgs = filter isBuildable nurPkgs; + cachePkgs = filter isCacheable buildPkgs; + + buildOutputs = concatMap outputsOf buildPkgs; + cacheOutputs = concatMap outputsOf cachePkgs; +} diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..d6497c9 --- /dev/null +++ b/default.nix @@ -0,0 +1,20 @@ +# This file describes your repository contents. +# It should return a set of nix derivations +# and optionally the special attributes `lib`, `modules` and `overlays`. +# It should NOT import . Instead, you should take pkgs as an argument. +# Having pkgs default to is fine though, and it lets you use short +# commands such as: +# nix-build -A mypackage + +{ pkgs ? import { } }: + +{ + # The `lib`, `modules`, and `overlay` names are special + lib = import ./lib { inherit pkgs; }; # functions + modules = import ./modules; # NixOS modules + overlays = import ./overlays; # nixpkgs overlays + + example-package = pkgs.callPackage ./pkgs/example-package { }; + # some-qt5-package = pkgs.libsForQt5.callPackage ./pkgs/some-qt5-package { }; + # ... +} diff --git a/lib/default.nix b/lib/default.nix new file mode 100644 index 0000000..a7fab1d --- /dev/null +++ b/lib/default.nix @@ -0,0 +1,7 @@ +{ pkgs }: + +with pkgs.lib; { + # Add your library functions here + # + # hexint = x: hexvals.${toLower x}; +} diff --git a/modules/default.nix b/modules/default.nix new file mode 100644 index 0000000..ff6c7c0 --- /dev/null +++ b/modules/default.nix @@ -0,0 +1,5 @@ +{ + # Add your NixOS modules here + # + # my-module = ./my-module; +} diff --git a/overlay.nix b/overlay.nix new file mode 100644 index 0000000..bff7396 --- /dev/null +++ b/overlay.nix @@ -0,0 +1,15 @@ +# You can use this file as a nixpkgs overlay. This is useful in the +# case where you don't want to add the whole NUR namespace to your +# configuration. + +self: super: +let + isReserved = n: n == "lib" || n == "overlays" || n == "modules"; + nameValuePair = n: v: { name = n; value = v; }; + nurAttrs = import ./default.nix { pkgs = super; }; + +in +builtins.listToAttrs + (map (n: nameValuePair n nurAttrs.${n}) + (builtins.filter (n: !isReserved n) + (builtins.attrNames nurAttrs))) diff --git a/overlays/default.nix b/overlays/default.nix new file mode 100644 index 0000000..0c2d870 --- /dev/null +++ b/overlays/default.nix @@ -0,0 +1,5 @@ +{ + # Add your overlays here + # + # my-overlay = import ./my-overlay; +} diff --git a/pkgs/example-package/default.nix b/pkgs/example-package/default.nix new file mode 100644 index 0000000..41e22df --- /dev/null +++ b/pkgs/example-package/default.nix @@ -0,0 +1,9 @@ +{ stdenv }: + +stdenv.mkDerivation rec { + name = "example-package-${version}"; + version = "1.0"; + src = ./.; + buildPhase = "echo echo Hello World > example"; + installPhase = "install -Dm755 example $out"; +}