Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add nix and ci #13

Merged
merged 3 commits into from
Jul 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
name: ci

on:
push:
branches:
- main
pull_request:

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
nix:
permissions:
id-token: "write" # added for magic-nix-cache-action
contents: "read" # added for magic-nix-cache-action
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
command: [
"flake check --print-build-logs --no-update-lock-file",
"build --print-build-logs --no-update-lock-file .#essential-node-api",
]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- uses: DeterminateSystems/nix-installer-action@v10
- uses: DeterminateSystems/magic-nix-cache-action@v4
- run: nix ${{ matrix.command }}

nix-fmt-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: DeterminateSystems/nix-installer-action@v10
- uses: DeterminateSystems/magic-nix-cache-action@v4
- run: nix fmt -- --check ./

cargo:
runs-on: ubuntu-latest
permissions:
id-token: "write" # added for magic-nix-cache-action
contents: "read" # added for magic-nix-cache-action
strategy:
fail-fast: false
matrix:
include:
- command: check --locked --all
- command: clippy --locked --all -- -D warnings
- command: fmt --all -- --check
- command: test --locked --all
- command: test --no-default-features --locked --all
- command: test --all-features --locked --all -- --nocapture
steps:
- uses: actions/checkout@v3
- uses: DeterminateSystems/nix-installer-action@v10
- uses: DeterminateSystems/magic-nix-cache-action@v4
- env:
TMPDIR: ${{ runner.temp }}
run: nix develop --command cargo ${{ matrix.command }}

cargo-toml-lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: DeterminateSystems/nix-installer-action@v10
- uses: DeterminateSystems/magic-nix-cache-action@v4
- run: nix shell nixpkgs#cargo-toml-lint nixpkgs#findutils --command git ls-files | grep Cargo.toml$ | xargs --verbose -n 1 $(which cargo-toml-lint)

publish:
runs-on: ubuntu-latest
needs:
[
nix,
nix-fmt-check,
cargo,
cargo-toml-lint,
]
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- uses: katyo/publish-crates@v2
id: publish-crates
with:
registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }}
# dry-run: ${{ github.event_name != 'push' }}
dry-run: true
ignore-unpublished-changes: true
- name: List published crates
if: ${{ steps.publish-crates.outputs.published != '' }}
run: |
LIST="${{ join(fromJSON(steps.publish-crates.outputs.published).*.name, ', ') }}"
echo "Published crates: $LIST"
59 changes: 59 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: release

on:
push:
tags:
- "v*.*.*"
- "v*.*.*-*"

jobs:
build:
permissions:
id-token: "write" # added for magic-nix-cache-action
contents: "read" # added for magic-nix-cache-action
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Nix
uses: DeterminateSystems/nix-installer-action@v10
- name: Cache Nix
uses: DeterminateSystems/magic-nix-cache-action@v4
- run: nix build --print-build-logs --no-update-lock-file .#essential-node-api
- uses: actions/upload-artifact@v4
with:
name: essential-node-api-${{ matrix.os }}
path: ./result/bin/essential-node-api

release:
permissions:
contents: write
needs: build
runs-on: ubuntu-latest
steps:
- name: Download Artifact Ubuntu
uses: actions/download-artifact@v4
with:
name: essential-node-api-ubuntu-latest
path: ${{ github.workspace }}/bin/ubuntu-latest
- name: Download Artifact Macos
uses: actions/download-artifact@v4
with:
name: essential-node-api-macos-latest
path: ${{ github.workspace }}/bin/macos-latest
- run: |
mv ${{ github.workspace }}/bin/macos-latest/essential-node-api ${{ github.workspace }}/bin/macos-latest/essential-node-api-macos-latest
mv ${{ github.workspace }}/bin/ubuntu-latest/essential-node-api ${{ github.workspace }}/bin/ubuntu-latest/essential-node-api-ubuntu-latest
chmod 755 ${{ github.workspace }}/bin/macos-latest/essential-node-api-macos-latest
chmod 755 ${{ github.workspace }}/bin/ubuntu-latest/essential-node-api-ubuntu-latest
find ${{ github.workspace }}/bin
- name: Release
uses: softprops/action-gh-release@v2
with:
files: |
${{ github.workspace }}/bin/ubuntu-latest/essential-node-api-ubuntu-latest
${{ github.workspace }}/bin/macos-latest/essential-node-api-macos-latest
4 changes: 0 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,6 @@
debug/
target/

# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
Cargo.lock

# These are backup files generated by rustfmt
**/*.rs.bk

Expand Down
19 changes: 19 additions & 0 deletions Cargo.lock

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

3 changes: 3 additions & 0 deletions crates/node-api/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
fn main() {
println!("Node!!!");
}
43 changes: 43 additions & 0 deletions flake.lock

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

38 changes: 38 additions & 0 deletions flake.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
description = ''
A nix flake for the essential node.
'';

inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
systems.url = "github:nix-systems/default";
};

outputs = inputs:
let
overlays = [
inputs.self.overlays.default
];
perSystemPkgs = f:
inputs.nixpkgs.lib.genAttrs (import inputs.systems)
(system: f (import inputs.nixpkgs { inherit overlays system; }));
in
{
overlays = {
essential-server = import ./overlay.nix { };
default = inputs.self.overlays.essential-server;
};

packages = perSystemPkgs (pkgs: {
essential-node-api = pkgs.essential-node-api;
default = inputs.self.packages.${pkgs.system}.essential-node-api;
});

devShells = perSystemPkgs (pkgs: {
essential-node-dev = pkgs.callPackage ./shell.nix { };
default = inputs.self.devShells.${pkgs.system}.essential-node-dev;
});

formatter = perSystemPkgs (pkgs: pkgs.nixpkgs-fmt);
};
}
5 changes: 5 additions & 0 deletions overlay.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# An overlay to make it easier to merge all essential-node related packages
# into nixpkgs.
{}: final: prev: {
essential-node-api = prev.callPackage ./pkgs/essential-node-api.nix { };
}
55 changes: 55 additions & 0 deletions pkgs/essential-node-api.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# A derivation for the `essential-node-api` crate.
{ lib
, stdenv
, darwin
, pkg-config
, rustPlatform
}:
let
src = builtins.path {
path = ../.;
filter = path: type:
let
keepFiles = [
"Cargo.lock"
"Cargo.toml"
"crates"
];
includeDirs = [
"crates"
];
isPathInIncludeDirs = dir: lib.strings.hasInfix dir path;
in
if lib.lists.any (p: p == (baseNameOf path)) keepFiles then
true
else
lib.lists.any (dir: isPathInIncludeDirs dir) includeDirs
;
};
crateDir = "${src}/crates/node-api";
crateTOML = "${crateDir}/Cargo.toml";
lockFile = "${src}/Cargo.lock";
in
rustPlatform.buildRustPackage {
inherit src;
pname = "essential-node-api";
version = (builtins.fromTOML (builtins.readFile crateTOML)).package.version;

buildAndTestSubdir = "crates/node-api";

nativeBuildInputs = lib.optionals stdenv.isLinux [
pkg-config
];

buildInputs = lib.optionals stdenv.isLinux [
] ++ lib.optionals stdenv.isDarwin [
darwin.apple_sdk.frameworks.SystemConfiguration
];

# We run tests separately in CI.
doCheck = false;

cargoLock = {
inherit lockFile;
};
}
19 changes: 19 additions & 0 deletions shell.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# A dev shell providing the essentials for working on essential-node.
{ cargo-toml-lint
, clippy
, mkShell
, rust-analyzer
, rustfmt
, cargo
, rustc
}:
mkShell {
buildInputs = [
cargo-toml-lint
clippy
rust-analyzer
rustfmt
cargo
rustc
];
}
Loading