Просмотр исходного кода

feat: add PizzaKV release identity

Danilo Fragoso 3 часов назад
Родитель
Сommit
ab37e02ebf
6 измененных файлов с 99 добавлено и 2 удалено
  1. 66 0
      .github/workflows/ci.yml
  2. 1 0
      .gitignore
  3. 1 0
      VERSION
  4. 7 2
      main.zig
  5. 8 0
      makefile
  6. 16 0
      version.zig

+ 66 - 0
.github/workflows/ci.yml

@@ -0,0 +1,66 @@
+name: CI
+
+on:
+  push:
+    branches: [main]
+  pull_request:
+  workflow_dispatch:
+
+permissions:
+  contents: read
+
+jobs:
+  verify:
+    name: Build, test, and verify FreeBSD ARM64 artifacts
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
+
+      - name: Install Zig
+        uses: mlugg/setup-zig@v2
+        with:
+          version: 0.15.2
+
+      - name: Check formatting
+        run: zig fmt --check *.zig
+
+      - name: Run tests
+        run: make test
+
+      - name: Build native binary
+        run: make build
+
+      - name: Verify version output
+        run: |
+          expected="$(cat VERSION)"
+          got="$(./bin/pizzakv -version)"
+          echo "version output: $got"
+          test "$got" = "PizzaKV $expected"
+
+      - name: Cross-compile release targets
+        run: |
+          make build-amd64
+          make build-amd64-freebsd
+          make build-arm64-freebsd
+          make build-amd64-static
+
+      - name: Stage artifacts and checksums
+        run: |
+          version="$(cat VERSION)"
+          mkdir -p dist
+          cp bin/pizzakv               "dist/pizzakv-${version}-linux-amd64"
+          cp bin/pizzakv_amd64         "dist/pizzakv-${version}-linux-amd64-portable"
+          cp bin/pizzakv_amd64_static  "dist/pizzakv-${version}-linux-amd64-static"
+          cp bin/pizzakv_amd64_freebsd "dist/pizzakv-${version}-freebsd-amd64"
+          cp bin/pizzakv_arm64_freebsd "dist/pizzakv-${version}-freebsd-arm64"
+          (cd dist && sha256sum ./* > SHA256SUMS)
+          cat dist/SHA256SUMS
+
+      - name: Upload verification artifacts
+        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+        with:
+          name: pizzakv-${{ github.sha }}
+          path: dist/
+          retention-days: 14
+          if-no-files-found: error

+ 1 - 0
.gitignore

@@ -9,5 +9,6 @@ tools/
 .dbb
 test_nov.js
 bin/
+dist/
 /pizzakv_*
 .DS_Store

+ 1 - 0
VERSION

@@ -0,0 +1 @@
+0.1.0

+ 7 - 2
main.zig

@@ -7,6 +7,7 @@ const pizzaria = @import("command.zig");
 const resp = @import("redis.zig");
 const pkbfi = @import("pkbfi.zig");
 const migration = @import("migration.zig");
+const version = @import("version.zig");
 
 const initial_buffer = 64 * 1024;
 const max_connection_bytes = 512 * 1024 * 1024;
@@ -342,7 +343,11 @@ pub fn main() !void {
     defer args.deinit();
     _ = args.skip();
     while (args.next()) |argument| {
-        if (std.mem.startsWith(u8, argument, "-host=")) host = argument[6..] else if (std.mem.startsWith(u8, argument, "-port=")) port = try std.fmt.parseInt(u16, argument[6..], 10) else if (std.mem.startsWith(u8, argument, "-path=")) path = argument[6..] else if (std.mem.startsWith(u8, argument, "-migrate=")) migration_source = argument[9..] else if (std.mem.eql(u8, argument, "-unix")) unix_path = ".pizzakv.sock" else if (std.mem.startsWith(u8, argument, "-unix=")) unix_path = argument[6..] else if (std.mem.eql(u8, argument, "-redis") or std.mem.eql(u8, argument, "-pkbfi") or std.mem.eql(u8, argument, "-iwal")) {} else return error.InvalidArgument;
+        if (std.mem.startsWith(u8, argument, "-host=")) host = argument[6..] else if (std.mem.startsWith(u8, argument, "-port=")) port = try std.fmt.parseInt(u16, argument[6..], 10) else if (std.mem.startsWith(u8, argument, "-path=")) path = argument[6..] else if (std.mem.startsWith(u8, argument, "-migrate=")) migration_source = argument[9..] else if (std.mem.eql(u8, argument, "-unix")) unix_path = ".pizzakv.sock" else if (std.mem.startsWith(u8, argument, "-unix=")) unix_path = argument[6..] else if (std.mem.eql(u8, argument, "-redis") or std.mem.eql(u8, argument, "-pkbfi") or std.mem.eql(u8, argument, "-iwal")) {} else if (std.mem.eql(u8, argument, "-version") or std.mem.eql(u8, argument, "--version") or std.mem.eql(u8, argument, "-v")) {
+            var buffer: [64]u8 = undefined;
+            try std.fs.File.stdout().writeAll(try std.fmt.bufPrint(&buffer, "PizzaKV {s}\n", .{version.string}));
+            return;
+        } else return error.InvalidArgument;
     }
     if (migration_source) |source| {
         const result = try migration.migrate(std.heap.smp_allocator, source, path);
@@ -357,7 +362,7 @@ pub fn main() !void {
     const listener = if (unix_path) |name| try socket.initUnix(name) else try socket.init(host, port);
     defer posix.close(listener);
     defer if (unix_path) |name| posix.unlink(name) catch {};
-    std.debug.print("PizzaKV {s} Pizzaria/RESP/PKBFI\n", .{path});
+    std.debug.print("PizzaKV {s} ({s}) Pizzaria/RESP/PKBFI\n", .{ version.string, path });
     while (!should_exit.load(.acquire)) {
         var descriptors = [_]posix.pollfd{.{ .fd = listener, .events = posix.POLL.IN, .revents = 0 }};
         if ((posix.poll(&descriptors, 100) catch continue) == 0) continue;

+ 8 - 0
makefile

@@ -15,6 +15,10 @@ build-amd64-freebsd:
 	zig build-exe main.zig -O ReleaseFast --name pizzakv_amd64_freebsd -lc -target x86_64-freebsd
 	mv pizzakv_amd64_freebsd ./bin/pizzakv_amd64_freebsd
 
+build-arm64-freebsd:
+	zig build-exe main.zig -O ReleaseFast --name pizzakv_arm64_freebsd -lc -target aarch64-freebsd
+	mv pizzakv_arm64_freebsd ./bin/pizzakv_arm64_freebsd
+
 build-amd64-static:
 	zig build-exe main.zig -O ReleaseFast --name pizzakv_amd64_static -lc -target x86_64-linux-musl -static
 	mv pizzakv_amd64_static ./bin/pizzakv_amd64_static
@@ -26,6 +30,7 @@ clean:
 	rm -f pizzakv
 
 test:
+	zig test version.zig
 	zig test pkvdb.zig
 	zig test keydir.zig
 	zig test ordered_index.zig
@@ -35,5 +40,8 @@ test:
 	zig test pkbfi.zig
 	zig test migration.zig
 
+version:
+	@cat VERSION
+
 bench:
 	zig run benchmark.zig -O ReleaseFast

+ 16 - 0
version.zig

@@ -0,0 +1,16 @@
+const std = @import("std");
+
+pub const string = std.mem.trim(u8, @embedFile("VERSION"), " \t\r\n");
+
+test "version is a SemVer core" {
+    try std.testing.expect(string.len > 0);
+
+    const core_end = std.mem.indexOfAny(u8, string, "-+") orelse string.len;
+    var parts = std.mem.splitScalar(u8, string[0..core_end], '.');
+    var count: usize = 0;
+    while (parts.next()) |part| {
+        count += 1;
+        _ = try std.fmt.parseInt(u64, part, 10);
+    }
+    try std.testing.expectEqual(@as(usize, 3), count);
+}