Skip to content

Commit

Permalink
refactor: use overlay (#157)
Browse files Browse the repository at this point in the history
* refactor: update integration of fossar/nix-phps, uses overlays everywhere

Also do not fail when an extensions fails to instantiate, just print a warning.

* ci: disable strict checks when building PHP with all extensions enabled until broken ones (eg: couchbase) are fixed upstream
  • Loading branch information
drupol committed Aug 3, 2023
1 parent 17bca03 commit d2940b4
Show file tree
Hide file tree
Showing 7 changed files with 229 additions and 299 deletions.
48 changes: 16 additions & 32 deletions .github/workflows/build.yaml
Expand Up @@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest

outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
phps: ${{ steps.set-phps.outputs.phps }}

steps:
- name: Set up Git repository
Expand All @@ -24,21 +24,21 @@ jobs:
- name: Install Nix
uses: DeterminateSystems/nix-installer-action@main

- name: Build PHP versions matrix
id: set-matrix
- name: Build PHP matrix
id: set-phps
run: |
echo "matrix=$(
echo phps=$(
nix eval --json --impure --expr 'builtins.filter (x: builtins.substring 0 3 x == "php") (builtins.attrNames (import ./.).packages.x86_64-linux)'
)" >> $GITHUB_OUTPUT
) >> $GITHUB_OUTPUT
build:
name: "${{ matrix.packages }} on ${{ matrix.archs.arch }}"
name: "${{ matrix.phps }} on ${{ matrix.archs.arch }}"
needs: [determine-matrix]
runs-on: ${{ matrix.archs.os }}
strategy:
fail-fast: false
matrix:
packages: ${{fromJson(needs.determine-matrix.outputs.matrix)}}
phps: ${{fromJson(needs.determine-matrix.outputs.phps)}}
archs:
[
{ os: ubuntu-latest, arch: x86_64-linux },
Expand All @@ -58,37 +58,21 @@ jobs:
- uses: cachix/cachix-action@v12
with:
name: nix-shell
# If you chose API tokens for write access OR if you have a private cache
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
extraPullNames: fossar

- name: Build ${{ matrix.packages }} binary
- name: Build ${{ matrix.phps }} binary
run: |
nix build .#${{ matrix.packages }}
nix build .#${{ matrix.phps }}
- name: Build ${{ matrix.packages }} environment
- name: Build ${{ matrix.phps }} environment
run: |
nix build .#env-${{ matrix.packages }}
nix build .#env-${{ matrix.phps }}
- name: Build imap extension
run: |
nix build .#${{ matrix.packages }}.extensions.imap
- name: Build ftp extension
run: |
nix build .#${{ matrix.packages }}.extensions.ftp
- name: Build XDebug extension
continue-on-error: true
run: |
nix build .#${{ matrix.packages }}.extensions.xdebug
- name: Build pcov extension
continue-on-error: true
run: |
nix build .#${{ matrix.packages }}.extensions.pcov
- name: Build oci8 extension
- name: Build ${{ matrix.phps }} with all extensions enabled
continue-on-error: true
run: |
nix build .#${{ matrix.packages }}.extensions.oci8
NIXPKGS_ALLOW_BROKEN=1 \
NIXPKGS_ALLOW_UNFREE=1 \
NIXPKGS_ALLOW_INSECURE=1 \
nix build --impure --expr 'let pkgs = (import ./.).outputs.packages.${builtins.currentSystem}; php = pkgs.${{ matrix.phps }}; allExtensions = (builtins.attrNames php.extensions); in (import ./.).api.makePhp pkgs {php = "${{ matrix.phps }}"; withExtensions = allExtensions;}'
11 changes: 5 additions & 6 deletions default.nix
Expand Up @@ -3,12 +3,11 @@
let
lock = builtins.fromJSON (builtins.readFile ./flake.lock);
in
fetchTarball {
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
sha256 = lock.nodes.flake-compat.locked.narHash;
}
fetchTarball {
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
sha256 = lock.nodes.flake-compat.locked.narHash;
}
)
{
src = ./.;
})
.defaultNix
}).defaultNix
35 changes: 34 additions & 1 deletion flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

152 changes: 68 additions & 84 deletions flake.nix
Expand Up @@ -4,103 +4,87 @@
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
nix-phps.url = "github:fossar/nix-phps";
mkshell-minimal.url = "github:viperML/mkshell-minimal";

# Shim to make flake.nix work with stable Nix.
flake-compat = {
url = "github:edolstra/flake-compat";
flake = false;
};
systems.url = "github:nix-systems/default";
};

outputs = inputs @ {
self,
systems,
flake-parts,
...
}:
flake-parts.lib.mkFlake {inherit inputs;} {
outputs = inputs @ { self, flake-parts, mkshell-minimal, systems, ... }:
flake-parts.lib.mkFlake { inherit inputs; } {
systems = import systems;

imports = [
inputs.flake-parts.flakeModules.easyOverlay
./src/composer.nix
./src/phps.nix
];

perSystem = {
config,
pkgs,
system,
...
}: let
defaultPhpVersion = "php81";
makePhp = self.api.makePhp system;
envPackages = [
pkgs.symfony-cli
pkgs.gh
pkgs.sqlite
pkgs.gnumake
];
perSystem = { config, pkgs, system, ... }:
let
phps = map
(php: self.api.makePhp pkgs { inherit php; })
(builtins.attrNames inputs.nix-phps.packages."${system}");

packages =
builtins.foldl' (
carry: phpConfig: let
pname = phpConfig.php;
env-pname = "env-${pname}";
php = makePhp phpConfig;
in
carry
// {
"${pname}" = php;
"${env-pname}" = pkgs.buildEnv {
name = pname;
paths =
[
php
php.packages.composer
]
++ envPackages;
};
}
) {
default = packages."${defaultPhpVersion}";
env-default = packages."env-${defaultPhpVersion}";
}
self.api.matrix;
envPackages = [
pkgs.symfony-cli
pkgs.gh
pkgs.sqlite
pkgs.gnumake
];

devShells =
builtins.foldl' (
carry: phpConfig: let
pname = phpConfig.php;
env-pname = "env-${pname}";
php = makePhp phpConfig;
in
carry
// {
"${pname}" = pkgs.mkShellNoCC {
name = pname;
buildInputs = [php];
};
"${env-pname}" = pkgs.mkShellNoCC {
name = env-pname;
buildInputs =
[
php
php.packages.composer
]
++ envPackages;
};
}
) {
default = devShells."${defaultPhpVersion}";
env-default = devShells."env-${defaultPhpVersion}";
}
self.api.matrix;
in {
inherit devShells packages;
packages = builtins.foldl'
(
carry: php:
let
name = "php${pkgs.lib.versions.major php.version}${pkgs.lib.versions.minor php.version}";
in
{
"${name}" = php;
"env-${name}" = pkgs.buildEnv { name = "env-${name}"; paths = [ php php.packages.composer ] ++ envPackages; };
} // carry
)
{
"default" = self.packages."${system}".env-php81;
"env-default" = self.packages."${system}".env-php81;
}
phps;

# TODO: Find a better way to do this.
_module.args.pkgs = import inputs.nixpkgs {
inherit system;
overlays = [inputs.nix-phps.overlays.default];
config.allowUnfree = true;
};
devShells = builtins.foldl'
(
carry: php:
let
name = "php${pkgs.lib.versions.major php.version}${pkgs.lib.versions.minor php.version}";
in
{
"${name}" = mkshell-minimal pkgs { name = "${name}"; packages = [ php php.packages.composer ]; };
"env-${name}" = mkshell-minimal pkgs { name = "env-${name}"; packages = [ php php.packages.composer ] ++ envPackages; };
} // carry
)
{
"default" = self.devShells."${system}".env-php81;
"env-default" = self.devShells."${system}".env-php81;
}
phps;
in
{
_module.args.pkgs = import self.inputs.nixpkgs {
inherit system;
overlays = [
inputs.nix-phps.overlays.default
];
config.allowUnfree = true;
};

formatter = pkgs.alejandra;
};
formatter = pkgs.nixpkgs-fmt;

overlayAttrs = packages;

inherit packages devShells;
};
};
}
11 changes: 5 additions & 6 deletions shell.nix
Expand Up @@ -3,12 +3,11 @@
let
lock = builtins.fromJSON (builtins.readFile ./flake.lock);
in
fetchTarball {
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
sha256 = lock.nodes.flake-compat.locked.narHash;
}
fetchTarball {
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
sha256 = lock.nodes.flake-compat.locked.narHash;
}
)
{
src = ./.;
})
.shellNix
}).shellNix
40 changes: 22 additions & 18 deletions src/composer.nix
@@ -1,23 +1,27 @@
{lib, ...}: let
getExtensionFromSection = section: let
readJsonSectionFromFile = file: section: default: let
filepath = "${builtins.getEnv "PWD"}/${file}";
filecontent =
if builtins.pathExists filepath
then builtins.fromJSON (builtins.readFile filepath)
else {};
in
filecontent.${section} or default;
{ lib, ... }:
let
getExtensionFromSection = section:
let
readJsonSectionFromFile = file: section: default:
let
filepath = "${builtins.getEnv "PWD"}/${file}";
filecontent =
if builtins.pathExists filepath
then builtins.fromJSON (builtins.readFile filepath)
else { };
in
filecontent.${section} or default;

# Get "require" section to extract extensions later
require = readJsonSectionFromFile "composer.json" section {};
# Copy keys into values
composerRequiresKeys = map (p: lib.attrsets.mapAttrs' (k: v: lib.nameValuePair k k) p) [require];
# Convert sets into lists
composerRequiresMap = map (package: (map (key: builtins.getAttr key package) (builtins.attrNames package))) composerRequiresKeys;
in
# Get "require" section to extract extensions later
require = readJsonSectionFromFile "composer.json" section { };
# Copy keys into values
composerRequiresKeys = map (p: lib.attrsets.mapAttrs' (k: v: lib.nameValuePair k k) p) [ require ];
# Convert sets into lists
composerRequiresMap = map (package: (map (key: builtins.getAttr key package) (builtins.attrNames package))) composerRequiresKeys;
in
# Convert the set into a list, filter out values not starting with "ext-", get rid of the first 4 characters from the name
map (x: builtins.substring 4 (builtins.stringLength x) x) (builtins.filter (x: (builtins.substring 0 4 x) == "ext-") (lib.flatten composerRequiresMap));
in {
in
{
flake.composer.getExtensionFromSection = getExtensionFromSection;
}

0 comments on commit d2940b4

Please sign in to comment.