aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat
-rw-r--r--.github/workflows/build.yml25+17 −8
-rw-r--r--README.md24+10 −14
-rw-r--r--Taskfile.yml96+2 −94
-rw-r--r--mise.lock14+0 −14
-rw-r--r--mise.toml6+4 −2
-rw-r--r--nfpm.yaml6+3 −3
-rw-r--r--packaging/apt-ftparchive.conf29+0 −29
7 files changed, 36 insertions, 164 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 99da313..cf36b5e 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -18,6 +18,11 @@ jobs:
build:
name: Build and publish Nightly
runs-on: ubuntu-latest
+ concurrency:
+ group: >-
+ package-publish-mirum-${{ github.ref == 'refs/heads/main' && 'nightly'
+ || startsWith(github.ref, 'refs/tags/v') && 'stable' || github.ref }}
+ cancel-in-progress: false
permissions:
contents: write
steps:
@@ -40,6 +45,7 @@ jobs:
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
APK_PRIVATE_KEY: ${{ secrets.APK_PRIVATE_KEY }}
+ PACKAGE_KEY_VERSION: ${{ vars.PACKAGE_KEY_VERSION }}
- name: Lint
run: task lint
@@ -54,17 +60,20 @@ jobs:
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
. build/dist/build.env
task publish:release CHANNEL=$CHANNEL VERSION=$VERSION
- task publish:repos \
- CHANNEL=$CHANNEL \
- S3_BUCKET=${{ vars.S3_BUCKET }} \
- S3_PUBLIC_URL=${{ vars.S3_PUBLIC_URL }} \
- S3_PROVIDER="${{ vars.S3_PROVIDER || 'Other' }}" \
- S3_REGION=${{ vars.S3_REGION }} \
- S3_ENDPOINT=${{ vars.S3_ENDPOINT }} \
- GPG_KEY_ID=${{ vars.GPG_KEY_ID }}
+ mise run publish -- \
+ --service mirum \
+ --channel "$CHANNEL" \
+ --input build/dist \
+ deb rpm apk
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
+ GPG_KEY_ID: ${{ vars.GPG_KEY_ID }}
+ APK_PRIVATE_KEY: ${{ secrets.APK_PRIVATE_KEY }}
+ PACKAGE_KEY_VERSION: ${{ vars.PACKAGE_KEY_VERSION }}
+ S3_BUCKET: ${{ vars.S3_BUCKET }}
+ S3_ENDPOINT: ${{ vars.S3_ENDPOINT }}
+ S3_PUBLIC_URL: ${{ vars.S3_PUBLIC_URL }}
S3_ACCESS_KEY_ID: ${{ secrets.S3_ACCESS_KEY_ID }}
S3_SECRET_ACCESS_KEY: ${{ secrets.S3_SECRET_ACCESS_KEY }}
diff --git a/README.md b/README.md
index 8cb272c..a9f4640 100644
--- a/README.md
+++ b/README.md
@@ -139,8 +139,8 @@ Please note that the project is in its infancy and is **not** intended for produ
```bash
sudo apt install curl gnupg
-curl -fsSL https://dl.mirum.dev/public.gpg | sudo gpg --dearmor -o /usr/share/keyrings/mirum.gpg
-echo "deb [signed-by=/usr/share/keyrings/mirum.gpg] https://dl.mirum.dev/apt/ nightly main" | sudo tee /etc/apt/sources.list.d/mirum.list
+curl -fsSL https://pkg.dimidiumlabs.io/packages.gpg | sudo gpg --dearmor -o /usr/share/keyrings/dimidiumlabs.gpg
+echo "deb [signed-by=/usr/share/keyrings/dimidiumlabs.gpg] https://pkg.dimidiumlabs.io/mirum/apt/ nightly main" | sudo tee /etc/apt/sources.list.d/mirum.list
sudo apt update && sudo apt install mirum
# Start the server
@@ -154,10 +154,10 @@ sudo systemctl enable --now mirum-worker@default
```bash
# DNF5 (Fedora 41+, RHEL 10+)
-sudo dnf config-manager addrepo --from-repofile=https://dl.mirum.dev/rpm/nightly/mirum-nightly.repo
+sudo dnf config-manager addrepo --from-repofile=https://pkg.dimidiumlabs.io/mirum/rpm/nightly/mirum-nightly.repo
# DNF4 (Fedora 40 and older, RHEL 8/9)
-sudo curl -o /etc/yum.repos.d/mirum-nightly.repo https://dl.mirum.dev/rpm/nightly/mirum-nightly.repo
+sudo curl -o /etc/yum.repos.d/mirum-nightly.repo https://pkg.dimidiumlabs.io/mirum/rpm/nightly/mirum-nightly.repo
sudo dnf install mirum
@@ -171,8 +171,8 @@ sudo systemctl enable --now mirum-worker@default
**openSUSE:**
```bash
-sudo rpm --import https://dl.mirum.dev/public.gpg
-sudo zypper addrepo https://dl.mirum.dev/rpm/nightly/ mirum-nightly
+sudo rpm --import https://pkg.dimidiumlabs.io/packages.gpg
+sudo zypper addrepo https://pkg.dimidiumlabs.io/mirum/rpm/nightly/ mirum-nightly
sudo zypper refresh
sudo zypper install mirum
@@ -185,15 +185,11 @@ sudo systemctl enable --now mirum-worker@default
**Alpine:**
-No repository yet — grab the signing key and the signed `.apk` from the nightly
-release:
-
```sh
-sudo wget -O /etc/apk/keys/mirum.rsa.pub https://dl.mirum.dev/mirum.rsa.pub
-
-# Download the .apk for your arch from
-# https://github.com/dimidiumlabs/mirum/releases/tag/nightly
-sudo apk add ./mirum_<version>_<arch>.apk
+sudo wget -O /etc/apk/keys/packages.0001.rsa.pub https://pkg.dimidiumlabs.io/keys/packages.0001.rsa.pub
+echo "https://pkg.dimidiumlabs.io/mirum/apk/nightly" | sudo tee -a /etc/apk/repositories
+sudo apk update
+sudo apk add mirum
# Start the server
sudo rc-update add mirum-server default
diff --git a/Taskfile.yml b/Taskfile.yml
index f803a40..8e9b060 100644
--- a/Taskfile.yml
+++ b/Taskfile.yml
@@ -250,104 +250,12 @@ tasks:
--version "{{.VERSION}}" \
--arch "$arch" \
--output "{{.DIST_DIR}}" \
- --apk-public-key mirum.rsa.pub \
$formats
rm -rf {{.BUILD_DIR}}/tmp
done
printf 'VERSION={{.VERSION}}\nCHANNEL={{.CHANNEL}}\n' > {{.DIST_DIR}}/build.env
- publish:repos:
- desc: Publish packages to APT and RPM repositories on S3
- requires:
- vars:
- [
- CHANNEL,
- S3_BUCKET,
- S3_PUBLIC_URL,
- S3_PROVIDER,
- S3_REGION,
- S3_ENDPOINT,
- GPG_KEY_ID,
- ]
- cmds:
- - |
- set -e
- export GNUPGHOME=$(mktemp -d)
- RCLONE_CONF=$(mktemp)
- chmod 700 "$GNUPGHOME"
- cleanup() { rm -rf "$GNUPGHOME" "$RCLONE_CONF"; }
- trap cleanup EXIT
-
- cat > "$RCLONE_CONF" << EOF
- [s3]
- type = s3
- provider = {{.S3_PROVIDER}}
- access_key_id = ${S3_ACCESS_KEY_ID}
- secret_access_key = ${S3_SECRET_ACCESS_KEY}
- region = {{.S3_REGION}}
- endpoint = {{.S3_ENDPOINT}}
- EOF
- export RCLONE_CONFIG="$RCLONE_CONF"
-
- printf '%s' "$GPG_PRIVATE_KEY" | gpg --batch --yes --pinentry-mode loopback --passphrase "$GPG_PASSPHRASE" --import
- echo "allow-loopback-pinentry" >> "$GNUPGHOME/gpg-agent.conf"
- gpgconf --kill gpg-agent
-
- # Upload static files
- gpg --export --armor "{{.GPG_KEY_ID}}" > "$GNUPGHOME/public.gpg"
- rclone copyto "$GNUPGHOME/public.gpg" "s3:{{.S3_BUCKET}}/public.gpg"
- rclone copy packaging/dl/ "s3:{{.S3_BUCKET}}/"
-
- if [ -f "{{.DIST_DIR}}/mirum.rsa.pub" ]; then
- rclone copyto "{{.DIST_DIR}}/mirum.rsa.pub" "s3:{{.S3_BUCKET}}/mirum.rsa.pub"
- fi
-
- # APT repository
- CHANNEL={{.CHANNEL}}
- mkdir -p /tmp/apt-cache apt-repo
- rclone copy "s3:{{.S3_BUCKET}}/apt/" apt-repo/
-
- for ch in stable nightly; do
- mkdir -p apt-repo/pool/$ch
- for arch in {{.LINUX_PKG_TARGETS}}; do
- mkdir -p apt-repo/dists/$ch/main/binary-$arch
- done
- done
- cp {{.DIST_DIR}}/*.deb apt-repo/pool/$CHANNEL/
-
- cd apt-repo
- apt-ftparchive generate "$(pwd)/../packaging/apt-ftparchive.conf"
- apt-ftparchive \
- -o APT::FTPArchive::Release::Codename=$CHANNEL \
- -o APT::FTPArchive::Release::Components=main \
- -o APT::FTPArchive::Release::Architectures="{{.LINUX_PKG_TARGETS}}" \
- release dists/$CHANNEL/ > dists/$CHANNEL/Release
- gpg --default-key="{{.GPG_KEY_ID}}" --batch --yes --pinentry-mode loopback --passphrase "$GPG_PASSPHRASE" -abs -o dists/$CHANNEL/Release.gpg dists/$CHANNEL/Release
- gpg --default-key="{{.GPG_KEY_ID}}" --batch --yes --pinentry-mode loopback --passphrase "$GPG_PASSPHRASE" --clearsign -o dists/$CHANNEL/InRelease dists/$CHANNEL/Release
- cd ..
- rclone copy apt-repo/ "s3:{{.S3_BUCKET}}/apt/" --progress
-
- # RPM repository
- mkdir -p rpm-repo
- rclone copy "s3:{{.S3_BUCKET}}/rpm/$CHANNEL/" rpm-repo/
-
- cp {{.DIST_DIR}}/*.rpm rpm-repo/
-
- createrepo_c --update rpm-repo/
- gpg --default-key="{{.GPG_KEY_ID}}" --batch --yes --pinentry-mode loopback --passphrase "$GPG_PASSPHRASE" --detach-sign --armor rpm-repo/repodata/repomd.xml
-
- cat > rpm-repo/mirum-${CHANNEL}.repo << REPOEOF
- [mirum-${CHANNEL}]
- name=Mirum ${CHANNEL}
- gpgkey={{.S3_PUBLIC_URL}}/public.gpg
- baseurl={{.S3_PUBLIC_URL}}/rpm/${CHANNEL}/
- enabled=1
- gpgcheck=1
- REPOEOF
-
- rclone copy rpm-repo/ "s3:{{.S3_BUCKET}}/rpm/$CHANNEL/" --progress
-
publish:release:
desc: Create or update a GitHub Release
requires:
@@ -367,11 +275,11 @@ tasks:
done
fi
- gh release create "$TAG" {{.DIST_DIR}}/*.deb {{.DIST_DIR}}/*.rpm {{.DIST_DIR}}/*.apk {{.DIST_DIR}}/*.rsa.pub {{.DIST_DIR}}/*.tar.gz {{.DIST_DIR}}/*.zip {{.DIST_DIR}}/SHA256SUMS \
+ gh release create "$TAG" {{.DIST_DIR}}/*.deb {{.DIST_DIR}}/*.rpm {{.DIST_DIR}}/*.apk {{.DIST_DIR}}/*.tar.gz {{.DIST_DIR}}/*.zip {{.DIST_DIR}}/SHA256SUMS \
--title "$NAME" \
$( [ "{{.CHANNEL}}" = "nightly" ] && echo "--prerelease" ) \
--notes "**Version**: {{.VERSION}}" \
- || gh release upload "$TAG" {{.DIST_DIR}}/*.deb {{.DIST_DIR}}/*.rpm {{.DIST_DIR}}/*.apk {{.DIST_DIR}}/*.rsa.pub {{.DIST_DIR}}/*.tar.gz {{.DIST_DIR}}/*.zip {{.DIST_DIR}}/SHA256SUMS --clobber
+ || gh release upload "$TAG" {{.DIST_DIR}}/*.deb {{.DIST_DIR}}/*.rpm {{.DIST_DIR}}/*.apk {{.DIST_DIR}}/*.tar.gz {{.DIST_DIR}}/*.zip {{.DIST_DIR}}/SHA256SUMS --clobber
# Local dev env
devenv:config:
diff --git a/mise.lock b/mise.lock
index ea51012..c1cad8c 100644
--- a/mise.lock
+++ b/mise.lock
@@ -56,20 +56,6 @@ url = "https://nodejs.org/dist/v24.18.0/node-v24.18.0-linux-arm64.tar.gz"
checksum = "sha256:783130984963db7ba9cbd01089eaf2c2efb055c7c1693c943174b967b3050cb8"
url = "https://nodejs.org/dist/v24.18.0/node-v24.18.0-linux-x64.tar.gz"
-[[tools.rclone]]
-version = "1.74.4"
-backend = "aqua:rclone/rclone"
-
-[tools.rclone."platforms.linux-arm64"]
-checksum = "sha256:97685285c9ad6a0cf17d5844115d2a67245af6444db672187074bd9c358de419"
-url = "https://github.com/rclone/rclone/releases/download/v1.74.4/rclone-v1.74.4-linux-arm64.zip"
-url_api = "https://api.github.com/repos/rclone/rclone/releases/assets/470550100"
-
-[tools.rclone."platforms.linux-x64"]
-checksum = "sha256:fe435e0c36228e7c2f116a8701f01127bb1f694005fc11d1f27186c8bca4115d"
-url = "https://github.com/rclone/rclone/releases/download/v1.74.4/rclone-v1.74.4-linux-amd64.zip"
-url_api = "https://api.github.com/repos/rclone/rclone/releases/assets/470549540"
-
[[tools.task]]
version = "3.52.0"
backend = "aqua:go-task/task"
diff --git a/mise.toml b/mise.toml
index 1be13f0..e23f620 100644
--- a/mise.toml
+++ b/mise.toml
@@ -11,7 +11,6 @@ buf = "1.67.0"
gh = "2.96.0"
go = "1.26.6"
node = "24.18.0"
-rclone = "1.74.4"
task = "3.52.0" # Removed after Taskfile.yml is migrated to mise tasks.
zig = "0.16.0"
@@ -19,18 +18,21 @@ zig = "0.16.0"
# APT
"apt:apt-utils" = "latest"
"apt:createrepo-c" = "latest"
+"apt:debsigs" = "latest"
"apt:gnupg" = "latest"
"apt:openssl" = "latest"
+"apt:rpm" = "latest"
"apt:zip" = "latest"
# DNF
"dnf:createrepo_c" = "latest"
"dnf:gnupg2" = "latest"
"dnf:openssl" = "latest"
+"dnf:rpm" = "latest"
"dnf:zip" = "latest"
[task_config]
dir = "{{cwd}}"
includes = [
- "git::https://github.com/dimidiumlabs/infra.git//tasks?ref=9e7330a3e5bde39a87e0ac1b76c9e85db7a6d64a",
+ "git::https://github.com/dimidiumlabs/infra.git//tasks?ref=4a4589fdb968686a7c91b380ff369aba23bd8662",
]
diff --git a/nfpm.yaml b/nfpm.yaml
index e3c23af..a0fc6ad 100644
--- a/nfpm.yaml
+++ b/nfpm.yaml
@@ -127,6 +127,6 @@ rpm:
apk:
signature:
key_file: ${APK_SIGNING_KEY}
- # nfpm appends ".rsa.pub" to this value when embedding the signature;
- # clients must install the public key as /etc/apk/keys/mirum.rsa.pub.
- key_name: mirum
+ # nFPM appends ".rsa.pub"; the versioned basename lets clients retain
+ # historical package keys during rotation.
+ key_name: packages.${PACKAGE_KEY_VERSION}
diff --git a/packaging/apt-ftparchive.conf b/packaging/apt-ftparchive.conf
deleted file mode 100644
--- a/packaging/apt-ftparchive.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-// SPDX-FileCopyrightText: 2026 Nikolay Govorov
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-Dir {
- ArchiveDir ".";
- CacheDir "/tmp/apt-cache";
-};
-
-Default {
- Packages::Compress ". gzip";
- Packages::Extensions ".deb";
-};
-
-TreeDefault {
- Packages "$(DIST)/$(SECTION)/binary-$(ARCH)/Packages";
- BinCacheDB "packages-$(DIST)-$(ARCH).db";
-};
-
-Tree "dists/stable" {
- Sections "main";
- Architectures "amd64 arm64 riscv64 ppc64le";
- Directory "pool/stable";
-};
-
-Tree "dists/nightly" {
- Sections "main";
- Architectures "amd64 arm64 riscv64 ppc64le";
- Directory "pool/nightly";
-};