graphql-engine/v3/flake.nix
Daniel Harvey 4ea88180d7 create Docker images with Nix (#507)
<!-- Thank you for submitting this PR! :) -->

## Description

In order to test things quicker, we'd like to be able to build custom
connector and friends in Nix, and then use the containers when running
tests. First step here is to be able to build Docker containers in Nix,
and add a CI job to ensure it still works.

Then we'll move onto publishing and using these images.

No-op build times:

<img width="336" alt="Screenshot 2024-04-25 at 15 53 56"
src="https://github.com/hasura/v3-engine/assets/4729125/47cbc0c5-6e54-4583-aa01-0528d4a21080">

Functional no-op.

V3_GIT_ORIGIN_REV_ID: 8f9d609e26cdd3b0801e61fd361c241ad504dcdf
2024-04-26 08:44:04 +00:00

184 lines
6.2 KiB
Nix

{
description = "DDN Engine";
inputs = {
nixpkgs.url = github:NixOS/nixpkgs;
flake-utils.url = github:numtide/flake-utils;
crane = {
url = "github:ipetkov/crane";
inputs.nixpkgs.follows = "nixpkgs";
};
rust-overlay = {
url = "github:oxalica/rust-overlay";
inputs = {
nixpkgs.follows = "nixpkgs";
flake-utils.follows = "flake-utils";
};
};
};
outputs = { self, nixpkgs, flake-utils, crane, rust-overlay }:
flake-utils.lib.eachDefaultSystem
(localSystem:
let
pkgs = import nixpkgs {
system = localSystem;
overlays = [ rust-overlay.overlays.default ];
};
rust = import ./nix/rust.nix {
inherit nixpkgs rust-overlay crane localSystem;
};
rust-x86_64-linux = (import ./nix/rust.nix {
inherit nixpkgs rust-overlay crane localSystem;
crossSystem = "x86_64-linux";
});
rust-aarch64-linux = (import ./nix/rust.nix {
inherit nixpkgs rust-overlay crane localSystem;
crossSystem = "aarch64-linux";
});
in
{
formatter = pkgs.nixpkgs-fmt;
packages = {
###### CUSTOM_CONNECTOR
# custom-connector binary for whichever is the local machine
custom-connector = rust.callPackage ./nix/app.nix {
version = if self ? "dirtyRev" then self.dirtyShortRev else self.shortRev;
pname = "custom-connector";
};
# custom-connector binary for x86_64-linux
custom-connector-x86_64-linux = rust-x86_64-linux.callPackage ./nix/app.nix
{
version = if self ? "dirtyRev" then self.dirtyShortRev else self.shortRev;
pname = "custom-connector";
};
# custom-connector binary for x86_64-linux
custom-connector-aarch64-linux = rust-aarch64-linux.callPackage ./nix/app.nix
{
version = if self ? "dirtyRev" then self.dirtyShortRev else self.shortRev;
pname = "custom-connector";
};
# custom-connector docker files for whichever is the local machine
custom-connector-docker = pkgs.callPackage ./nix/docker.nix {
package = self.packages.${localSystem}.custom-connector;
image-name = "ghcr.io/hasura/v3-custom-connector";
tag = "dev";
port = "8181";
};
# custom-connector docker for x86_64-linux
custom-connector-docker-x86_64-linux = pkgs.callPackage ./nix/docker.nix {
package = self.packages.${localSystem}.custom-connector-x86_64-linux;
architecture = "amd64";
image-name = "ghcr.io/hasura/v3-custom-connector";
port = "8181";
};
# custom-connector docker for aarch64-linux
custom-connector-docker-aarch64-linux = pkgs.callPackage ./nix/docker.nix {
package = self.packages.${localSystem}.custom-connector-aarch64-linux;
architecture = "arm64";
image-name = "ghcr.io/hasura/v3-custom-connector";
port = "8181";
};
###### ENGINE
# engine binary for whichever is the local machine
engine = rust.callPackage ./nix/app.nix {
version = if self ? "dirtyRev" then self.dirtyShortRev else self.shortRev;
pname = "engine";
};
# engine binary for x86_64-linux
engine-x86_64-linux = rust-x86_64-linux.callPackage ./nix/app.nix
{
version = if self ? "dirtyRev" then self.dirtyShortRev else self.shortRev;
pname = "engine";
};
# engine binary for x86_64-linux
engine-aarch64-linux = rust-aarch64-linux.callPackage ./nix/app.nix
{
version = if self ? "dirtyRev" then self.dirtyShortRev else self.shortRev;
pname = "engine";
};
# engine docker files for whichever is the local machine
engine-docker = pkgs.callPackage ./nix/docker.nix {
package = self.packages.${localSystem}.engine;
image-name = "ghcr.io/hasura/v3-engine";
tag = "dev";
port = "3000";
};
# engine docker for x86_64-linux
engine-docker-x86_64-linux = pkgs.callPackage ./nix/docker.nix {
package = self.packages.${localSystem}.engine-x86_64-linux;
architecture = "amd64";
image-name = "ghcr.io/hasura/v3-engine";
port = "3000";
};
# engine docker for aarch64-linux
engine-docker-aarch64-linux = pkgs.callPackage ./nix/docker.nix {
package = self.packages.${localSystem}.engine-aarch64-linux;
architecture = "arm64";
image-name = "ghcr.io/hasura/v3-engine";
port = "3000";
};
default = self.packages.${localSystem}.engine;
};
apps = {
default = self.apps.${localSystem}.engine;
engine = flake-utils.lib.mkApp {
drv = self.packages.${localSystem}.engine;
name = "engine";
};
custom-connector = flake-utils.lib.mkApp {
drv = self.packages.${localSystem}.custom-connector;
name = "custom-connector";
};
};
devShells = {
default = pkgs.mkShell {
# include dependencies of the default package
inputsFrom = [ self.packages.${localSystem}.default ];
# build-time inputs
nativeBuildInputs = [
# Development
pkgs.just
pkgs.nixpkgs-fmt
# Rust
pkgs.cargo-edit
pkgs.cargo-expand
pkgs.cargo-flamegraph
pkgs.cargo-insta
pkgs.cargo-machete
pkgs.cargo-nextest
pkgs.cargo-watch
rust.rustToolchain
];
};
};
});
}