Skip to content
Merged

Sep26 #322

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
b00df76
add .gitignore
yellowbean Aug 23, 2026
391afe9
feat: fix pool-level DefaultByAmt allocation across multiple assets
samnaughtonb Aug 16, 2026
9d87a96
fix: fee double-count in FeeFlowByPoolPeriod/FeeFlowByBondPeriod
yellowbean Aug 31, 2026
639b85f
Revert "fix: fee double-count in FeeFlowByPoolPeriod/FeeFlowByBondPer…
yellowbean Sep 1, 2026
0c3bfcd
fix prorata calc & enable apply default by amount to scheduleMortgage
yellowbean Sep 26, 2026
023a2af
fix: error when pool DefaultByAmt exceeds total current balance
yellowbean Sep 26, 2026
52b58bf
expose PrepaymentABS (only for monthly)
yellowbean Sep 27, 2026
225b152
bump version to-> < 0.52.6 >
yellowbean Sep 27, 2026
1742d65
update dockerfile & workflow to cover arm64
yellowbean Sep 28, 2026
aa5ec33
bump version to-> < 0.52.7 >
yellowbean Sep 28, 2026
8d1209c
fix #327
yellowbean Oct 13, 2026
7a7888e
fix #331
yellowbean Oct 13, 2026
e1b8634
fix #325
yellowbean Oct 13, 2026
cb73353
fix head/tail
yellowbean Oct 13, 2026
6f573a0
fix #333
yellowbean Oct 14, 2026
d85cd94
fix #335
yellowbean Oct 14, 2026
cf050b2
Fix#346: add para support on endpoints
yellowbean Oct 14, 2026
1ee1ff9
fix #348
yellowbean Oct 14, 2026
f046cb6
fix #352
yellowbean Oct 14, 2026
a6554a8
cabal updat
yellowbean Oct 14, 2026
3bb176a
UT: collected-CF safety tests (buildCollectedCF empty groups / padding)
yellowbean Oct 14, 2026
612149c
bump version to-> < 0.52.8 >
yellowbean Oct 14, 2026
5193636
Fix#353: default NonPerfAssumption/RunContext, -Werror=missing-fields…
yellowbean Oct 16, 2026
2ee3864
Fix#346: resolve the worker cap from HASTRUCTURE_WORKERS env (superse…
yellowbean Oct 16, 2026
4093f29
Fix#328: strict canonical TxnComment JSON codec with roundtrip tests
yellowbean Oct 16, 2026
5ce395b
Fix#345: ServerConfig per-endpoint run caps and worker precedence; co…
yellowbean Oct 17, 2026
e55f7ed
Fix#344: add json error boundary on warp
yellowbean Oct 17, 2026
742df51
Fix#329: make API handlers total over request types - misroutes rejec…
yellowbean Oct 17, 2026
e33a7d9
Fix#332: totalize cashflow aggregation (NonEmpty sumTsCF, firstDate e…
yellowbean Oct 17, 2026
ec21f10
Fix#323: PrepaymentABS SMM=0 at/after implied balance exhaustion (no …
yellowbean Oct 17, 2026
d7b1565
CI: build multi-arch Docker images natively per platform + smoke test…
yellowbean Oct 17, 2026
c929825
Fix#344: force handler responses before warp starts the response (val…
yellowbean Oct 17, 2026
9be2aee
Fix#329: use the JSON envelope for HTTP 400 request rejections (PR #3…
yellowbean Oct 17, 2026
e24c500
L2/L3: track UT.LedgerTest in cabal; prorataFactors clamps negative b…
yellowbean Oct 17, 2026
9eebc6e
bump version to-> < 0.52.11 >
yellowbean Oct 17, 2026
ad4a7f1
docs: make Features section collapsible
yellowbean Oct 17, 2026
b1b1223
CI: fix multi-arch merge — pass metadata JSON tags with -t flags; add…
yellowbean Oct 17, 2026
baacde2
docs: fill Installation section; document config.yml fields
yellowbean Oct 17, 2026
4c7a5aa
bump version to-> < 0.52.12 >
yellowbean Oct 17, 2026
a74860c
CI: modernize v-tag release workflow - publish binaries to GitHub Rel…
yellowbean Oct 18, 2026
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
140 changes: 108 additions & 32 deletions .github/workflows/docker-image-dev-by-tag.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,47 @@ on:
push:
tags:
- 'a*'
workflow_dispatch:

jobs:
# Multi-arch strategy: each platform is built natively on a runner of the same
# architecture (no QEMU, no cross-compilation), pushed by digest, and the
# per-platform digests are merged into one multi-arch manifest at the end.
# This fixes the previous setup where the build stage was pinned to
# $BUILDPLATFORM: on an amd64 runner that produced an amd64 binary for the
# arm64 image ("exec format error" at runtime).
#
# NOTE: linux/arm64 uses GitHub-hosted arm64 runners. If the repository does
# not have access to them, replace `ubuntu-24.04-arm` with `ubuntu-22.04-arm`,
# or fall back to the QEMU variant described in the PR #322 review (drop the
# platform pin in the Dockerfile, add the QEMU setup step back, and build both
# platforms in one job).

build:

runs-on: ubuntu-latest
env:
IMAGE: ${{ secrets.DOCKER_HUB_USERNAME }}/hastructure

jobs:
build:
strategy:
fail-fast: false
matrix:
include:
- platform: linux/amd64
arch: amd64
runner: ubuntu-latest
- platform: linux/arm64
arch: arm64
runner: ubuntu-24.04-arm
runs-on: ${{ matrix.runner }}
steps:
-
name: Set up QEMU
uses: docker/setup-qemu-action@v2
-
name: Set up Docker Buildx
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
-
name: Login to Docker Hub
uses: docker/login-action@v2

- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_PW }}

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: yellowbean/hastructure
tags: |
type=match,pattern=(a\d+.\d+.\d+),group=1
flavor: |
latest=false

- name: 'Cleanup build folder'
run: |
ls -la ./
Expand All @@ -43,15 +53,81 @@ jobs:
ls -la .
rm -rf /opt/ghc
rm -rf /opt/hostedtoolcache

-
name: Build and push
uses: docker/build-push-action@v3

- name: Build and push by digest
id: build
uses: docker/build-push-action@v6
with:
platforms: ${{ matrix.platform }}
outputs: type=image,name=${{ env.IMAGE }},push-by-digest=true,name-canonical=true,push=true
cache-from: type=registry,ref=${{ env.IMAGE }}:buildcache-${{ matrix.arch }}
cache-to: type=registry,ref=${{ env.IMAGE }}:buildcache-${{ matrix.arch }},mode=max

- name: Smoke test (the image must start and answer /version)
run: |
docker run -d --name smoke-${{ matrix.arch }} \
--platform ${{ matrix.platform }} \
-p 18081:8081 \
${{ env.IMAGE }}@${{ steps.build.outputs.digest }}
ok=0
for i in $(seq 1 15); do
if curl -fsS http://localhost:18081/version; then ok=1; break; fi
sleep 1
done
docker rm -f smoke-${{ matrix.arch }}
test "$ok" = "1"

- name: Export digest
run: |
mkdir -p /tmp/digests
digest="${{ steps.build.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"

- name: Upload digest
uses: actions/upload-artifact@v4
with:
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ secrets.DOCKER_HUB_USERNAME }}/hastructure:dev, ${{ steps.meta.outputs.tags }}
cache-from: type=registry,ref=${{ secrets.DOCKER_HUB_USERNAME }}/hastructure:buildcache
cache-to: type=registry,ref=${{ secrets.DOCKER_HUB_USERNAME }}/hastructure:buildcache,mode=max
name: digests-${{ matrix.arch }}
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1

merge:
runs-on: ubuntu-latest
needs: build
steps:
- name: Download digests
uses: actions/download-artifact@v4
with:
path: /tmp/digests
pattern: digests-*
merge-multiple: true

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_PW }}

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE }}
tags: |
type=match,pattern=(a\d+\.\d+\.\d+),group=1
type=raw,value=dev
flavor: |
latest=false

- name: Create multi-arch manifest
working-directory: /tmp/digests
run: |
docker buildx imagetools create \
$(jq -r '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf '${{ env.IMAGE }}@sha256:%s ' *)


- name: Inspect manifest
run: docker buildx imagetools inspect ${{ env.IMAGE }}:dev
Loading
Loading