mirror of
https://github.com/simplex-chat/simplexmq.git
synced 2026-03-30 16:26:02 +00:00
271 lines
8.5 KiB
YAML
271 lines
8.5 KiB
YAML
name: build
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- master
|
|
- stable
|
|
tags:
|
|
- "v*"
|
|
pull_request:
|
|
|
|
jobs:
|
|
|
|
# =============================
|
|
# Create release
|
|
# =============================
|
|
|
|
# Create release, but only if it's triggered by tag push.
|
|
# On pull requests/commits push, this job will always complete.
|
|
|
|
maybe-release:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Clone project
|
|
if: startsWith(github.ref, 'refs/tags/v')
|
|
uses: actions/checkout@v3
|
|
|
|
- name: Build changelog
|
|
id: build_changelog
|
|
if: startsWith(github.ref, 'refs/tags/v')
|
|
uses: simplex-chat/release-changelog-builder-action@v5
|
|
with:
|
|
configuration: .github/changelog_conf.json
|
|
failOnError: true
|
|
ignorePreReleases: true
|
|
commitMode: true
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Create release
|
|
if: startsWith(github.ref, 'refs/tags/v')
|
|
uses: simplex-chat/action-gh-release@v2
|
|
with:
|
|
body: |
|
|
See full changelog [here](https://github.com/simplex-chat/simplexmq/blob/master/CHANGELOG.md).
|
|
|
|
Commits:
|
|
${{ steps.build_changelog.outputs.changelog }}
|
|
prerelease: true
|
|
files: |
|
|
LICENSE
|
|
fail_on_unmatched_files: true
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
# =============================
|
|
# Main build job
|
|
# =============================
|
|
|
|
build:
|
|
name: "ubuntu-${{ matrix.os }}, GHC: ${{ matrix.ghc }}"
|
|
needs: maybe-release
|
|
env:
|
|
apps: "smp-server xftp-server ntf-server xftp"
|
|
runs-on: ubuntu-${{ matrix.os }}
|
|
services:
|
|
postgres:
|
|
image: postgres:15
|
|
env:
|
|
POSTGRES_HOST_AUTH_METHOD: trust # Allows passwordless access
|
|
options: >-
|
|
--health-cmd pg_isready
|
|
--health-interval 10s
|
|
--health-timeout 5s
|
|
--health-retries 5
|
|
ports:
|
|
# Maps tcp port 5432 on service container to the host
|
|
- 5432:5432
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- os: 22.04
|
|
ghc: "8.10.7"
|
|
platform_name: 22_04-8.10.7
|
|
should_run: ${{ !(github.ref == 'refs/heads/stable' || startsWith(github.ref, 'refs/tags/v')) }}
|
|
- os: 22.04
|
|
ghc: "9.6.3"
|
|
platform_name: 22_04-x86-64
|
|
should_run: true
|
|
- os: 24.04
|
|
ghc: "9.6.3"
|
|
platform_name: 24_04-x86-64
|
|
should_run: true
|
|
steps:
|
|
- name: Clone project
|
|
if: matrix.should_run == true
|
|
uses: actions/checkout@v3
|
|
|
|
- name: Set up Docker Buildx
|
|
if: matrix.should_run == true
|
|
uses: simplex-chat/docker-setup-buildx-action@v3
|
|
|
|
- name: Setup swap
|
|
if: matrix.ghc == '8.10.7' && matrix.should_run == true
|
|
uses: ./.github/actions/swap
|
|
with:
|
|
swap-size-gb: 20
|
|
|
|
- name: Install PostgreSQL 15 client tools
|
|
if: matrix.os == '22.04' && matrix.should_run == true
|
|
shell: bash
|
|
run: |
|
|
# Import the repository signing key
|
|
sudo install -d /usr/share/postgresql-common/pgdg
|
|
sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc
|
|
# Add the PostgreSQL APT repository
|
|
sudo sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
|
|
# Update repository and install postgresql tools
|
|
sudo apt update
|
|
sudo apt -y install postgresql-client-15
|
|
|
|
- name: Build and cache Docker image
|
|
if: matrix.should_run == true
|
|
uses: simplex-chat/docker-build-push-action@v6
|
|
with:
|
|
context: .
|
|
load: true
|
|
file: Dockerfile.build
|
|
tags: build/${{ matrix.platform_name }}:latest
|
|
cache-from: |
|
|
type=gha
|
|
type=gha,scope=master
|
|
cache-to: type=gha,mode=max
|
|
build-args: |
|
|
TAG=${{ matrix.os }}
|
|
GHC=${{ matrix.ghc }}
|
|
|
|
- name: Cache dependencies
|
|
if: matrix.should_run == true
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: |
|
|
~/.cabal/store
|
|
dist-newstyle
|
|
key: ${{ matrix.os }}-${{ hashFiles('cabal.project', 'simplexmq.cabal') }}
|
|
|
|
- name: Start container
|
|
if: matrix.should_run == true
|
|
shell: bash
|
|
run: |
|
|
docker run -t -d \
|
|
--name builder \
|
|
-v ~/.cabal:/root/.cabal \
|
|
-v /home/runner/work/_temp:/home/runner/work/_temp \
|
|
-v ${{ github.workspace }}:/project \
|
|
build/${{ matrix.platform_name }}:latest
|
|
|
|
- name: Build smp-server (postgresql) and tests
|
|
if: matrix.should_run == true
|
|
shell: docker exec -t builder sh -eu {0}
|
|
run: |
|
|
cabal update
|
|
cabal build --jobs=$(nproc) --enable-tests -fserver_postgres
|
|
mkdir -p /out
|
|
for i in smp-server simplexmq-test; do
|
|
bin=$(find /project/dist-newstyle -name "$i" -type f -executable)
|
|
chmod +x "$bin"
|
|
mv "$bin" /out/
|
|
done
|
|
strip /out/smp-server
|
|
|
|
- name: Copy simplexmq-test from container
|
|
if: matrix.should_run == true
|
|
shell: bash
|
|
run: |
|
|
docker cp builder:/out/simplexmq-test .
|
|
|
|
- name: Copy smp-server (postgresql) from container and prepare it
|
|
if: startsWith(github.ref, 'refs/tags/v') && matrix.should_run == true
|
|
id: prepare-postgres
|
|
shell: bash
|
|
run: |
|
|
name="smp-server-postgres-ubuntu-${{ matrix.platform_name }}"
|
|
docker cp builder:/out/smp-server $name
|
|
|
|
path="${{ github.workspace }}/$name"
|
|
echo "bin=$path" >> $GITHUB_OUTPUT
|
|
|
|
hash="SHA2-256($name)= $(openssl sha256 $path | cut -d' ' -f 2)"
|
|
printf 'hash=%s' "$hash" >> $GITHUB_OUTPUT
|
|
|
|
- name: Build everything else (standard)
|
|
if: matrix.should_run == true
|
|
shell: docker exec -t builder sh -eu {0}
|
|
run: |
|
|
cabal build --jobs=$(nproc)
|
|
mkdir -p /out
|
|
for i in ${{ env.apps }}; do
|
|
bin=$(find /project/dist-newstyle -name "$i" -type f -executable)
|
|
strip "$bin"
|
|
chmod +x "$bin"
|
|
mv "$bin" /out/
|
|
done
|
|
|
|
- name: Copy binaries from container and prepare them
|
|
id: prepare-regular
|
|
if: startsWith(github.ref, 'refs/tags/v') && matrix.should_run == true
|
|
shell: bash
|
|
run: |
|
|
docker cp builder:/out .
|
|
|
|
printf 'bins<<EOF\n' > bins.output
|
|
printf 'hashes<<EOF\n' > hashes.output
|
|
for i in ${{ env.apps }}; do
|
|
mv ./out/$i ./$i-ubuntu-${{ matrix.platform_name }}
|
|
|
|
name="$i-ubuntu-${{ matrix.platform_name }}"
|
|
|
|
path="${{ github.workspace }}/$name"
|
|
hash="SHA2-256($name)= $(openssl sha256 $path | cut -d' ' -f 2)"
|
|
|
|
printf '%s\n' "$path" >> bins.output
|
|
printf '%s\n\n' "$hash" >> hashes.output
|
|
done
|
|
printf 'EOF\n' >> bins.output
|
|
printf 'EOF\n' >> hashes.output
|
|
|
|
cat bins.output >> "$GITHUB_OUTPUT"
|
|
cat hashes.output >> "$GITHUB_OUTPUT"
|
|
|
|
- name: Upload binaries
|
|
if: startsWith(github.ref, 'refs/tags/v') && matrix.should_run == true
|
|
uses: simplex-chat/action-gh-release@v2
|
|
with:
|
|
append_body: true
|
|
prerelease: true
|
|
fail_on_unmatched_files: true
|
|
body: |
|
|
${{ steps.prepare-regular.outputs.hashes }}
|
|
${{ steps.prepare-postgres.outputs.hash }}
|
|
files: |
|
|
${{ steps.prepare-regular.outputs.bins }}
|
|
${{ steps.prepare-postgres.outputs.bin }}
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Test
|
|
if: matrix.should_run == true
|
|
timeout-minutes: 120
|
|
shell: bash
|
|
env:
|
|
PGHOST: localhost
|
|
run: |
|
|
i=1
|
|
attempts=1
|
|
${{ (github.ref == 'refs/heads/stable' || startsWith(github.ref, 'refs/tags/v')) }} && attempts=3
|
|
while [ "$i" -le "$attempts" ]; do
|
|
if ./simplexmq-test; then
|
|
break
|
|
else
|
|
echo "Attempt $i failed, retrying..."
|
|
i=$((i + 1))
|
|
sleep 1
|
|
fi
|
|
done
|
|
if [ "$i" -gt "$attempts" ]; then
|
|
echo "All "$attempts" attempts failed."
|
|
exit 1
|
|
fi
|