mirror of
https://github.com/logos-storage/logos-storage-nim.git
synced 2026-05-12 06:19:33 +00:00
- remove RUNNER_IMAGE because the cs-dist-tests image is dumb -- it clones the cs-dist-tests repo, checkouts the branch in BRANCH and then runs the release tests. So instead, always use the :latest image (which is built when there are commits to master) - add the BRANCH workflow input so you can test cs-dist-test changes in the runner if needed - remove COMMAND arg, it's always going to be 'dotnet test Tests/CodexReleaseTests' - remove NAMESPACE env variable and just use 'default'. The cluster is ephermal and so all resources deployed are for the release tests, no namespaces needed.
328 lines
12 KiB
YAML
328 lines
12 KiB
YAML
name: Release
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*.*.*'
|
|
branches:
|
|
- master
|
|
workflow_dispatch:
|
|
inputs:
|
|
branch:
|
|
description: 'cs-dist-tests branch to run tests from'
|
|
required: false
|
|
default: 'master'
|
|
type: string
|
|
|
|
env:
|
|
cache_nonce: 0 # Allows for easily busting actions/cache caches
|
|
nim_version: pinned
|
|
storage_binary_base: logos-storage
|
|
c_bindings_lib_base: libstorage
|
|
build_dir: build
|
|
nim_flags: ''
|
|
windows_libs: 'libstdc++-6.dll libgomp-1.dll libgcc_s_seh-1.dll libwinpthread-1.dll'
|
|
|
|
jobs:
|
|
# Matrix
|
|
matrix:
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
matrix: ${{ steps.matrix.outputs.matrix }}
|
|
steps:
|
|
- name: Compute matrix
|
|
id: matrix
|
|
uses: fabiocaccamo/create-matrix-action@v5
|
|
with:
|
|
matrix: |
|
|
os {linux}, cpu {amd64}, builder {ubuntu-22.04}, nim_version {${{ env.nim_version }}}, shell {bash --noprofile --norc -e -o pipefail}
|
|
os {linux}, cpu {arm64}, builder {ubuntu-22.04-arm}, nim_version {${{ env.nim_version }}}, shell {bash --noprofile --norc -e -o pipefail}
|
|
os {macos}, cpu {arm64}, builder {macos-14}, nim_version {${{ env.nim_version }}}, shell {bash --noprofile --norc -e -o pipefail}
|
|
os {windows}, cpu {amd64}, builder {windows-latest}, nim_version {${{ env.nim_version }}}, shell {msys2}
|
|
|
|
# Build
|
|
build:
|
|
needs: matrix
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include: ${{fromJson(needs.matrix.outputs.matrix)}}
|
|
|
|
defaults:
|
|
run:
|
|
shell: ${{ matrix.shell }} {0}
|
|
|
|
name: ${{ matrix.os }}-${{ matrix.cpu }}-${{ matrix.nim_version }}
|
|
runs-on: ${{ matrix.builder }}
|
|
timeout-minutes: 80
|
|
steps:
|
|
- name: Set conditional env variables
|
|
shell: bash
|
|
run: |
|
|
if [[ "${{ github.ref_type }}" == "tag" ]]; then
|
|
echo "VERSION=${{ github.ref_name }}" >> $GITHUB_ENV
|
|
echo "TAGGED_RELEASE=true" >> $GITHUB_ENV
|
|
else
|
|
echo "VERSION=${GITHUB_SHA::7}" >> $GITHUB_ENV
|
|
echo "TAGGED_RELEASE=false" >> $GITHUB_ENV
|
|
fi
|
|
- name: Checkout sources
|
|
uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
|
|
- name: Setup Nimbus Build System
|
|
uses: ./.github/actions/nimbus-build-system
|
|
with:
|
|
os: ${{ matrix.os }}
|
|
cpu: ${{ matrix.cpu }}
|
|
shell: ${{ matrix.shell }}
|
|
nim_version: ${{ matrix.nim_version }}
|
|
|
|
- name: Compute binary name
|
|
run: |
|
|
case ${{ matrix.os }} in
|
|
linux*) os_name="linux" ;;
|
|
macos*) os_name="darwin" ;;
|
|
windows*) os_name="windows" ;;
|
|
esac
|
|
storage_binary="${{ env.storage_binary_base }}-${os_name}-${{ matrix.cpu }}-${{ env.VERSION }}"
|
|
c_bindings_lib="${{ env.c_bindings_lib_base }}-${os_name}-${{ matrix.cpu }}-${{ env.VERSION }}"
|
|
if [[ ${os_name} == "windows" ]]; then
|
|
storage_binary="${storage_binary}.exe"
|
|
fi
|
|
echo "storage_binary=${storage_binary}" >>$GITHUB_ENV
|
|
echo "c_bindings_lib=${c_bindings_lib}" >>$GITHUB_ENV
|
|
|
|
- name: Build Logos Storage binary
|
|
run: |
|
|
make NIMFLAGS="--out:${{ env.build_dir }}/${{ env.storage_binary }} ${{ env.nim_flags }}"
|
|
|
|
- name: Package ${{ env.storage_binary_base }} Linux (compress and preserve perms)
|
|
if: matrix.os == 'linux'
|
|
run: |
|
|
sudo apt-get update && sudo apt-get install -y zip
|
|
zip -j "${{ env.build_dir }}/${{env.storage_binary}}.zip" ./${{ env.build_dir }}/*
|
|
|
|
- name: Package ${{ env.storage_binary_base }} MacOS (compress and preserve perms)
|
|
if: matrix.os == 'macos'
|
|
run: |
|
|
zip -j "${{ env.build_dir }}/${{env.storage_binary}}.zip" ./${{ env.build_dir }}/*
|
|
|
|
- name: Package ${{ env.storage_binary_base }} Windows (compress and preserve perms)
|
|
if: matrix.os == 'windows'
|
|
shell: msys2 {0}
|
|
run: |
|
|
7z a -tzip "${{ env.build_dir }}/${{env.storage_binary}}.zip" ./${{ env.build_dir }}/*
|
|
|
|
- name: Upload Logos Storage binary to workflow artifacts
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ env.storage_binary }}.zip
|
|
path: ${{ env.build_dir }}/${{ env.storage_binary }}.zip
|
|
retention-days: 30
|
|
|
|
- name: Copy and zip Windows dlls to build/dlls dir (Windows)
|
|
if: matrix.os == 'windows'
|
|
run: |
|
|
mkdir -p "${{ env.build_dir }}/dlls"
|
|
for lib in ${{ env.windows_libs }}; do
|
|
cp -v "${MINGW_PREFIX}/bin/${lib}" "${{ env.build_dir }}/dlls"
|
|
done
|
|
7z a -tzip "${{ env.build_dir }}/${{ env.storage_binary }}-dlls.zip" ./${{ env.build_dir }}/dlls/*.dll
|
|
|
|
- name: Upload Windows dlls to workflow artifacts
|
|
if: matrix.os == 'windows'
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ env.storage_binary }}-dlls.zip
|
|
path: ${{ env.build_dir }}/${{ env.storage_binary }}-dlls.zip
|
|
retention-days: 30
|
|
|
|
- name: Build ${{ env.c_bindings_lib_base }} (Linux)
|
|
if: matrix.os == 'linux'
|
|
run: |
|
|
make -j${ncpu} update
|
|
make -j${ncpu} libstorage
|
|
|
|
- name: Build ${{ env.c_bindings_lib_base }} (MacOS)
|
|
if: matrix.os == 'macos'
|
|
run: |
|
|
make -j${ncpu} update
|
|
STORAGE_LIB_PARAMS="--passL:\"-Wl,-install_name,@rpath/${{ env.c_bindings_lib_base }}.dylib\"" make -j${ncpu} libstorage
|
|
|
|
- name: Build ${{ env.c_bindings_lib_base }} (Windows)
|
|
if: matrix.os == 'windows'
|
|
shell: msys2 {0}
|
|
run: |
|
|
make -j${ncpu} update
|
|
make -j${ncpu} libstorage
|
|
|
|
- name: Package ${{ env.c_bindings_lib_base }} Linux
|
|
if: matrix.os == 'linux'
|
|
run: |
|
|
sudo apt-get update && sudo apt-get install -y zip
|
|
zip -j "${{ env.build_dir }}/${{ env.c_bindings_lib }}.zip" ${{ env.build_dir }}/${{ env.c_bindings_lib_base }}.so
|
|
zip -j "${{ env.build_dir }}/${{ env.c_bindings_lib }}.zip" library/${{ env.c_bindings_lib_base }}.h
|
|
|
|
- name: Package ${{ env.c_bindings_lib_base }} MacOS
|
|
if: matrix.os == 'macos'
|
|
run: |
|
|
zip -j "${{ env.build_dir }}/${{ env.c_bindings_lib }}.zip" ${{ env.build_dir }}/${{ env.c_bindings_lib_base }}.dylib
|
|
zip -j "${{ env.build_dir }}/${{ env.c_bindings_lib }}.zip" library/${{ env.c_bindings_lib_base }}.h
|
|
|
|
- name: Package ${{ env.c_bindings_lib_base }} (Windows)
|
|
if: matrix.os == 'windows'
|
|
shell: msys2 {0}
|
|
run: |
|
|
7z a -tzip "${{ env.build_dir }}/${{ env.c_bindings_lib }}.zip" ./${{ env.build_dir }}/${{ env.c_bindings_lib_base }}.dll
|
|
7z a -tzip "${{ env.build_dir }}/${{ env.c_bindings_lib }}.zip" ./library/${{ env.c_bindings_lib_base }}.h
|
|
|
|
- name: Upload ${{ env.c_bindings_lib_base }} to workflow artifacts
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ env.c_bindings_lib }}.zip
|
|
path: ${{ env.build_dir }}/${{ env.c_bindings_lib }}.zip
|
|
if-no-files-found: error
|
|
|
|
# Build Docker dist-tests image
|
|
build-docker-dist-tests:
|
|
name: Build Docker dist-tests image
|
|
if: github.ref_type == 'tag'
|
|
uses: ./.github/workflows/docker-reusable.yml
|
|
with:
|
|
nimflags: '-d:disableMarchNative -d:storage_enable_api_debug_peers=true -d:storage_enable_log_counter=true'
|
|
nat_ip_auto: true
|
|
tag_latest: false
|
|
tag_stable: false
|
|
tag_suffix: dist-tests
|
|
tag_sha: false
|
|
secrets: inherit
|
|
|
|
# Release tests
|
|
release-tests:
|
|
name: Release Tests
|
|
runs-on: ubuntu-latest
|
|
if: github.ref_type == 'tag'
|
|
needs: build-docker-dist-tests
|
|
env:
|
|
TF_VAR_region: ams3
|
|
TF_VAR_do_token: ${{ secrets.DO_TOKEN }}
|
|
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
|
|
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
|
|
CODEXDOCKERIMAGE: ${{ needs.build-docker-dist-tests.outputs.logos_storage_image }}
|
|
TEST_TYPE: release-tests
|
|
BRANCH: ${{ inputs.branch || 'master' }}
|
|
SOURCE: https://github.com/logos-storage/logos-storage-nim-cs-dist-tests
|
|
TF_DIR: .github/release/clusters/codex-dist-tests-do-ams3
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Setup Terraform
|
|
uses: hashicorp/setup-terraform@v3
|
|
|
|
- name: Setup doctl
|
|
uses: digitalocean/action-doctl@v2
|
|
with:
|
|
token: ${{ secrets.DO_TOKEN }}
|
|
|
|
- name: Setup kubectl
|
|
uses: azure/setup-kubectl@v4
|
|
with:
|
|
version: v1.30.5
|
|
|
|
- name: Terraform init
|
|
working-directory: ${{ env.TF_DIR }}
|
|
run: terraform init
|
|
|
|
- name: Terraform apply
|
|
working-directory: ${{ env.TF_DIR }}
|
|
run: terraform apply -auto-approve
|
|
|
|
- name: Get kubeconfig
|
|
run: doctl kubernetes cluster kubeconfig save codex-dist-tests-do-ams3
|
|
|
|
- name: Create in-cluster app kubeconfig secret
|
|
run: |
|
|
kubectl create secret generic codex-dist-tests-app-kubeconfig \
|
|
--from-file=kubeconfig.yaml=$HOME/.kube/config \
|
|
-n default
|
|
|
|
- name: Set run variables
|
|
run: |
|
|
RUNID=$(date +%Y%m%d-%H%M%S)
|
|
echo "RUNID=${RUNID}" >> $GITHUB_ENV
|
|
echo "NAMEPREFIX=r-tests-${RUNID}" >> $GITHUB_ENV
|
|
echo "TESTID=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
|
|
|
|
- name: Deploy test job
|
|
run: envsubst < .github/release/job-release-tests.yaml | kubectl apply -f -
|
|
|
|
- name: Stream test logs
|
|
run: |
|
|
kubectl logs -l job-name=$NAMEPREFIX \
|
|
-n default \
|
|
--follow \
|
|
--pod-running-timeout=300s
|
|
|
|
- name: Check job status
|
|
run: |
|
|
sleep 5
|
|
job_status=$(kubectl get jobs $NAMEPREFIX -n default \
|
|
-o jsonpath='{.status.conditions[0].type}')
|
|
echo "Job status: $job_status"
|
|
[[ "$job_status" == "Complete" ]] || exit 1
|
|
|
|
- name: Terraform destroy
|
|
if: always()
|
|
working-directory: ${{ env.TF_DIR }}
|
|
run: terraform destroy -auto-approve
|
|
|
|
# Release
|
|
release:
|
|
runs-on: ubuntu-latest
|
|
needs: [build, release-tests]
|
|
if: needs.build.result == 'success' && needs.release-tests.result == 'success'
|
|
steps:
|
|
- name: Set conditional env variables
|
|
shell: bash
|
|
run: |
|
|
if [[ "${{ github.ref_type }}" == "tag" ]]; then
|
|
echo "VERSION=${{ github.ref_name }}" >> $GITHUB_ENV
|
|
echo "TAGGED_RELEASE=true" >> $GITHUB_ENV
|
|
else
|
|
echo "VERSION=${GITHUB_SHA::7}" >> $GITHUB_ENV
|
|
echo "TAGGED_RELEASE=false" >> $GITHUB_ENV
|
|
fi
|
|
- name: Download binaries from workflow artifacts into temp folder
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
pattern: ${{ env.storage_binary_base }}*
|
|
merge-multiple: true
|
|
path: /tmp/release
|
|
|
|
- name: Download ${{ env.c_bindings_lib_base }} from workflow artifacts into temp folder
|
|
uses: actions/download-artifact@v5
|
|
with:
|
|
pattern: ${{ env.c_bindings_lib_base }}*
|
|
merge-multiple: true
|
|
path: /tmp/release
|
|
|
|
- name: Create GH release
|
|
uses: softprops/action-gh-release@v2
|
|
if: env.TAGGED_RELEASE == 'true'
|
|
with:
|
|
files: |
|
|
/tmp/release/*-*
|
|
make_latest: true
|
|
|
|
- name: Generate Python SDK
|
|
uses: peter-evans/repository-dispatch@v3
|
|
if: env.TAGGED_RELEASE == 'true'
|
|
with:
|
|
token: ${{ secrets.DISPATCH_PAT }}
|
|
repository: logos-storage/logos-storage-py-api-client
|
|
event-type: generate
|
|
client-payload: '{"openapi_url": "https://raw.githubusercontent.com/logos-storage/logos-storage-nim/${{ github.ref }}/openapi.yaml"}'
|