mirror of
https://github.com/logos-storage/logos-storage-nim.git
synced 2026-05-13 06:49:26 +00:00
By default, the logosstorage/logos-storage-nim-cs-dist-tests:latest image will be used for the test runner in the release tests. However, if developers want to run the release tests and test changes to the runner (eg changes in the logos-storage-nim-cs-dist-tests repo), they can push their changes to a branch and manually run the `docker-runner` workflow in the logos-storage-nim-cs-dist-tests repo. This will create an image like logosstorage/logos-storage-nim-cs-dist-tests:sha-c0465a5. This image can then be used as a release tests workflow input for 'cs-dist-tests runner image'
331 lines
12 KiB
YAML
331 lines
12 KiB
YAML
name: Release
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*.*.*'
|
|
branches:
|
|
- master
|
|
workflow_dispatch:
|
|
inputs:
|
|
runner_image:
|
|
description: 'cs-dist-tests runner image (default: logosstorage/cs-codex-dist-tests:latest)'
|
|
required: false
|
|
default: 'logosstorage/cs-codex-dist-tests:latest'
|
|
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 }}
|
|
RUNNER_IMAGE: ${{ inputs.runner_image || 'logosstorage/cs-codex-dist-tests:latest' }}
|
|
NAMESPACE: default
|
|
TEST_TYPE: release-tests
|
|
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 ${{ env.NAMESPACE }}
|
|
|
|
- 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
|
|
echo "COMMAND=$(jq -c 'split(" ")' <<< '"dotnet test Tests/CodexReleaseTests"')" >> $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=${{ env.NAMEPREFIX }} \
|
|
-n ${{ env.NAMESPACE }} \
|
|
--follow \
|
|
--pod-running-timeout=300s
|
|
|
|
- name: Check job status
|
|
run: |
|
|
sleep 5
|
|
job_status=$(kubectl get jobs ${{ env.NAMEPREFIX }} -n ${{ env.NAMESPACE }} \
|
|
-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"}'
|