mirror of
https://github.com/silverqx/TinyORM.git
synced 2026-02-05 01:39:39 -06:00
423 lines
16 KiB
YAML
423 lines
16 KiB
YAML
# MySQL and PostgreSQL
|
|
# ---
|
|
# Both use the default unencrypted database connections.
|
|
|
|
name: Linux GCC/Clang Qt5.15
|
|
|
|
on:
|
|
pull_request:
|
|
push:
|
|
branches:
|
|
- main
|
|
- gh-actions
|
|
|
|
jobs:
|
|
|
|
build:
|
|
name: cmake build / ctest
|
|
|
|
runs-on: ubuntu-20.04
|
|
|
|
strategy:
|
|
matrix:
|
|
compiler:
|
|
- key: clang14
|
|
apt: [ clang-14, lld-14, g++-11 ]
|
|
command: clang++-14
|
|
|
|
- key: gcc11
|
|
apt: [ g++-11 ]
|
|
command: g++-11
|
|
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
|
|
- name: TinyORM prepare environment
|
|
run: |
|
|
runnerWorkPath=$(realpath '${{ runner.workspace }}/..')
|
|
echo "TinyRunnerWorkPath=$runnerWorkPath" >> $GITHUB_ENV
|
|
|
|
sqlitePath="$runnerWorkPath/SQLite/$DB_SQLITE_DATABASE"
|
|
echo "TinySQLitePath=$sqlitePath" >> $GITHUB_ENV
|
|
env:
|
|
DB_SQLITE_DATABASE: ${{ secrets.DB_SQLITE_DATABASE }}
|
|
|
|
- name: PostgreSQL service start
|
|
run: |
|
|
sudo systemctl start postgresql.service
|
|
|
|
- name: PostgreSQL service check status
|
|
run: |
|
|
sudo systemctl status postgresql.service
|
|
pg_isready
|
|
|
|
- name: PostgreSQL create TinyORM user
|
|
run: >-
|
|
sudo --user=postgres --
|
|
psql --command="create user \"$DB_PGSQL_USERNAME\"
|
|
with createdb password '$DB_PGSQL_PASSWORD';"
|
|
env:
|
|
DB_PGSQL_PASSWORD: ${{ secrets.DB_PGSQL_PASSWORD }}
|
|
DB_PGSQL_USERNAME: ${{ secrets.DB_PGSQL_USERNAME }}
|
|
|
|
- name: PostgreSQL create TinyORM database
|
|
run: |
|
|
sudo --user=postgres -- createdb --owner=$DB_PGSQL_USERNAME $DB_PGSQL_DATABASE
|
|
env:
|
|
DB_PGSQL_DATABASE: ${{ secrets.DB_PGSQL_DATABASE }}
|
|
DB_PGSQL_USERNAME: ${{ secrets.DB_PGSQL_USERNAME }}
|
|
|
|
- name: MySQL initialize crystal_mysqld.cnf configuration
|
|
working-directory: .github/resources/linux
|
|
run: |
|
|
sudo mv --target-directory=/etc/mysql/mysql.conf.d/ ./crystal_mysqld.cnf
|
|
|
|
- name: MySQL initialize crystal_client.cnf configuration (global)
|
|
working-directory: .github/resources/linux
|
|
run: >-
|
|
cat ./crystal_client.template.cnf |
|
|
sed "s/{MYSQL_HOST}/$DB_MYSQL_HOST/" |
|
|
sudo tee /etc/mysql/conf.d/crystal_client.cnf > /dev/null
|
|
env:
|
|
DB_MYSQL_HOST: ${{ secrets.DB_MYSQL_HOST }}
|
|
|
|
- name: MySQL service start
|
|
run: |
|
|
sudo systemctl start mysql.service
|
|
|
|
- name: MySQL change ${{ secrets.DB_MYSQL_ROOT_USERNAME }} password
|
|
run: >-
|
|
echo "
|
|
alter user '$DB_MYSQL_ROOT_USERNAME'@'localhost'
|
|
identified with caching_sha2_password by '$DB_MYSQL_ROOT_PASSWORD';" |
|
|
mysql --user="$DB_MYSQL_ROOT_USERNAME" --password="$DB_MYSQL_ROOT_PASSWORD_DEFAULT"
|
|
env:
|
|
DB_MYSQL_ROOT_PASSWORD: ${{ secrets.DB_MYSQL_ROOT_PASSWORD }}
|
|
DB_MYSQL_ROOT_PASSWORD_DEFAULT: ${{ secrets.DB_MYSQL_ROOT_PASSWORD_DEFAULT }}
|
|
DB_MYSQL_ROOT_USERNAME: ${{ secrets.DB_MYSQL_ROOT_USERNAME }}
|
|
|
|
- name: MySQL populate time zone tables 👌
|
|
run: >-
|
|
mysql_tzinfo_to_sql /usr/share/zoneinfo |
|
|
mysql --user="$DB_MYSQL_ROOT_USERNAME" --password="$DB_MYSQL_ROOT_PASSWORD" mysql
|
|
|
|
sudo systemctl restart mysql.service
|
|
env:
|
|
DB_MYSQL_ROOT_PASSWORD: ${{ secrets.DB_MYSQL_ROOT_PASSWORD }}
|
|
DB_MYSQL_ROOT_USERNAME: ${{ secrets.DB_MYSQL_ROOT_USERNAME }}
|
|
|
|
- name: MySQL service check status
|
|
run: |
|
|
echo '::group::Service status'
|
|
systemctl status mysql.service
|
|
echo '::endgroup::'
|
|
|
|
echo '::group::Service is-active check'
|
|
systemctl is-active --quiet mysql.service
|
|
echo '::endgroup::'
|
|
|
|
echo '::group::Ping'
|
|
mysqladmin --user="$DB_MYSQL_ROOT_USERNAME" --password="$DB_MYSQL_ROOT_PASSWORD" ping
|
|
echo '::endgroup::'
|
|
env:
|
|
DB_MYSQL_ROOT_PASSWORD: ${{ secrets.DB_MYSQL_ROOT_PASSWORD }}
|
|
DB_MYSQL_ROOT_USERNAME: ${{ secrets.DB_MYSQL_ROOT_USERNAME }}
|
|
|
|
- name: MySQL create TinyORM database
|
|
run: >-
|
|
echo "
|
|
create database if not exists \`$DB_MYSQL_DATABASE\`
|
|
default character set $DB_MYSQL_CHARSET
|
|
default collate $DB_MYSQL_COLLATION;" |
|
|
mysql --user="$DB_MYSQL_ROOT_USERNAME" --password="$DB_MYSQL_ROOT_PASSWORD"
|
|
env:
|
|
DB_MYSQL_CHARSET: ${{ secrets.DB_MYSQL_CHARSET }}
|
|
DB_MYSQL_COLLATION: ${{ secrets.DB_MYSQL_COLLATION }}
|
|
DB_MYSQL_DATABASE: ${{ secrets.DB_MYSQL_DATABASE }}
|
|
DB_MYSQL_ROOT_PASSWORD: ${{ secrets.DB_MYSQL_ROOT_PASSWORD }}
|
|
DB_MYSQL_ROOT_USERNAME: ${{ secrets.DB_MYSQL_ROOT_USERNAME }}
|
|
|
|
- name: MySQL create TinyORM user
|
|
run: >-
|
|
echo "
|
|
create user '$DB_MYSQL_USERNAME'@'%'
|
|
identified with caching_sha2_password by '$DB_MYSQL_PASSWORD';
|
|
grant all privileges on \`tinyorm\\_%\`.* to '$DB_MYSQL_USERNAME'@'%';
|
|
grant select on \`mysql\`.\`time_zone_name\` to '$DB_MYSQL_USERNAME'@'%';
|
|
flush privileges;" |
|
|
mysql --user="$DB_MYSQL_ROOT_USERNAME" --password="$DB_MYSQL_ROOT_PASSWORD"
|
|
env:
|
|
DB_MYSQL_PASSWORD: ${{ secrets.DB_MYSQL_PASSWORD }}
|
|
DB_MYSQL_ROOT_PASSWORD: ${{ secrets.DB_MYSQL_ROOT_PASSWORD }}
|
|
DB_MYSQL_ROOT_USERNAME: ${{ secrets.DB_MYSQL_ROOT_USERNAME }}
|
|
DB_MYSQL_USERNAME: ${{ secrets.DB_MYSQL_USERNAME }}
|
|
|
|
- name: SQLite create TinyORM database
|
|
run: |
|
|
mkdir --parents "$(dirname "${{ env.TinySQLitePath }}")"
|
|
|
|
touch '${{ env.TinySQLitePath }}'
|
|
|
|
- name: Print MySQL, SQLite, PostgreSQL database versions
|
|
run: |
|
|
mysql --version
|
|
pg_config --version
|
|
sqlite3 --version
|
|
|
|
- name: add-apt-repository gcc 11 and Qt 5.15.2
|
|
run: |
|
|
sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test
|
|
sudo add-apt-repository --yes ppa:beineri/opt-qt-5.15.2-focal
|
|
|
|
- name: add-apt-repository Clang 14
|
|
if: ${{ matrix.compiler.key == 'clang14' }}
|
|
run: |
|
|
wget -O- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
|
|
sudo add-apt-repository --yes 'deb http://apt.llvm.org/focal/ llvm-toolchain-focal-14 main'
|
|
|
|
- name: apt update
|
|
run: |
|
|
sudo apt update
|
|
|
|
- name: apt install ${{ join(matrix.compiler.apt, ', ') }}, and Qt 5.15.2 base
|
|
run: |
|
|
sudo apt install --yes ${{ join(matrix.compiler.apt, ' ') }} qt515base
|
|
|
|
- name: ninja install latest version
|
|
uses: seanmiddleditch/gha-setup-ninja@master
|
|
with:
|
|
destination: ${{ env.TinyRunnerWorkPath }}/ninja-build
|
|
|
|
- name: Ccache initialize download
|
|
id: downloads-initialize-ccache
|
|
run: |
|
|
filename=$(basename "$URL_CCACHE_LINUX_X64")
|
|
echo "Filename=$filename" >> $GITHUB_OUTPUT
|
|
|
|
filepath="${{ runner.temp }}/$filename"
|
|
echo "Filepath=$filepath" >> $GITHUB_OUTPUT
|
|
|
|
hash=$(wget "$URL_CACHE_HASH_LINUX" -O- --no-verbose --quiet)
|
|
echo "Hash=$hash" >> $GITHUB_OUTPUT
|
|
env:
|
|
URL_CACHE_HASH_LINUX: ${{ secrets.URL_CACHE_HASH_LINUX }}
|
|
URL_CCACHE_LINUX_X64: ${{ secrets.URL_CCACHE_LINUX_X64 }}
|
|
|
|
- name: Ccache restore cache (download)
|
|
uses: actions/cache@v3
|
|
id: downloads-cache-ccache
|
|
with:
|
|
path: ${{ env.archive_filepath }}
|
|
key: ${{ runner.os }}-caches-${{ env.cache_name }}-${{ env.cache_hash }}
|
|
env:
|
|
archive_filepath: ${{ steps.downloads-initialize-ccache.outputs.Filepath }}
|
|
cache_hash: ${{ steps.downloads-initialize-ccache.outputs.Hash }}
|
|
cache_name: ccache
|
|
|
|
- name: Ccache download
|
|
if: steps.downloads-cache-ccache.outputs.cache-hit != 'true'
|
|
run: |
|
|
wget "$URL_CCACHE_LINUX_X64" --output-document="$archive_filepath" --no-verbose
|
|
env:
|
|
archive_filepath: ${{ steps.downloads-initialize-ccache.outputs.Filepath }}
|
|
URL_CCACHE_LINUX_X64: ${{ secrets.URL_CCACHE_LINUX_X64 }}
|
|
|
|
- name: Ccache install
|
|
run: |
|
|
echo '::group::Extract archive'
|
|
tar xJvf "$archive_filepath" --directory '${{ runner.temp }}'
|
|
echo '::endgroup::'
|
|
|
|
echo '::group::Install'
|
|
extractedFolder=$(basename --suffix='.tar.xz' "$archive_filename")
|
|
cd "${{ runner.temp }}/$extractedFolder"
|
|
sudo make install
|
|
echo '::endgroup::'
|
|
|
|
echo '::group::Print version'
|
|
ccache --version
|
|
echo '::endgroup::'
|
|
env:
|
|
archive_filename: ${{ steps.downloads-initialize-ccache.outputs.Filename }}
|
|
archive_filepath: ${{ steps.downloads-initialize-ccache.outputs.Filepath }}
|
|
|
|
- name: Ccache initialize
|
|
id: ccache-initialize-cache
|
|
run: |
|
|
cachePath=$(ccache --get-config cache_dir)
|
|
echo "CachePath=$cachePath" >> $GITHUB_OUTPUT
|
|
|
|
echo "ImageOS=$ImageOS" >> $GITHUB_OUTPUT
|
|
|
|
- name: Ccache restore cache 🕺
|
|
uses: actions/cache@v3
|
|
with:
|
|
path: ${{ env.cache_path }}
|
|
key: ${{ runner.os }}-${{ env.image_os }}-ccache-${{ env.cache_name }}-${{ github.run_id }}
|
|
restore-keys: |
|
|
${{ runner.os }}-${{ env.image_os }}-ccache-${{ env.cache_name }}-
|
|
env:
|
|
cache_name: ${{ matrix.compiler.key }}-qt5
|
|
cache_path: ${{ steps.ccache-initialize-cache.outputs.CachePath }}
|
|
image_os: ${{ steps.ccache-initialize-cache.outputs.ImageOS }}
|
|
|
|
- name: Ccache setup 🥳
|
|
run: |
|
|
echo '::group::Prepare ccache config'
|
|
# gcc: ~ 115 * 3 + 100 ; clang: ~ 90 * 3 + 100
|
|
ccache --set-config max_size=${{ matrix.compiler.key == 'gcc11' && '450M' || '380M' }}
|
|
ccache --set-config sloppiness=pch_defines,time_macros
|
|
ccache --show-config
|
|
echo '::endgroup::'
|
|
|
|
echo '::group::Clear ccache statistics'
|
|
ccache --zero-stats
|
|
echo '::endgroup::'
|
|
|
|
echo '::group::Print version'
|
|
ccache --version
|
|
echo '::endgroup::'
|
|
|
|
- name: vcpkg set-up environment
|
|
run: |
|
|
echo "VCPKG_ROOT=$VCPKG_INSTALLATION_ROOT" >> $GITHUB_ENV
|
|
echo 'VCPKG_DEFAULT_TRIPLET=x64-linux-dynamic' >> $GITHUB_ENV
|
|
echo 'VCPKG_MAX_CONCURRENCY=2' >> $GITHUB_ENV
|
|
|
|
- name: CMake print version
|
|
run: |
|
|
cmake --version
|
|
|
|
- name: TinyORM create build folder (${{ matrix.compiler.key }}-cmake-debug)
|
|
run: |
|
|
mkdir --parents '../TinyORM-builds-cmake/build-${{ matrix.compiler.key }}-cmake-debug'
|
|
|
|
- name: TinyORM cmake configure (${{ matrix.compiler.key }}-cmake-debug)
|
|
run: >-
|
|
source .github/resources/qt5env.sh
|
|
|
|
cmake
|
|
-S .
|
|
-B ../TinyORM-builds-cmake/build-${{ matrix.compiler.key }}-cmake-debug
|
|
-G Ninja
|
|
-D CMAKE_CXX_COMPILER_LAUNCHER:FILEPATH=/usr/local/bin/ccache
|
|
-D CMAKE_CXX_COMPILER:FILEPATH='/usr/bin/${{ matrix.compiler.command }}'
|
|
-D CMAKE_TOOLCHAIN_FILE:FILEPATH="$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake"
|
|
-D CMAKE_DISABLE_PRECOMPILE_HEADERS:BOOL=ON
|
|
-D CMAKE_BUILD_TYPE:STRING=Debug
|
|
-D VERBOSE_CONFIGURE:BOOL=ON
|
|
-D MATCH_EQUAL_EXPORTED_BUILDTREE:BOOL=OFF
|
|
-D MYSQL_PING:BOOL=ON
|
|
-D BUILD_TESTS:BOOL=ON
|
|
-D ORM:BOOL=ON
|
|
-D TOM:BOOL=ON
|
|
-D TOM_EXAMPLE:BOOL=ON
|
|
|
|
- name: TinyORM cmake build ✨ (${{ matrix.compiler.key }}-cmake-debug)
|
|
run: >-
|
|
source .github/resources/qt5env.sh
|
|
|
|
cmake --build ../TinyORM-builds-cmake/build-${{ matrix.compiler.key }}-cmake-debug
|
|
--target all --parallel 2
|
|
|
|
- name: Ccache statistics
|
|
run: |
|
|
ccache --show-stats -vv
|
|
|
|
- name: Create and Seed tables for unit tests 🎉
|
|
working-directory: ../TinyORM-builds-cmake/build-${{ matrix.compiler.key }}-cmake-debug/tests/testdata_tom
|
|
run: >-
|
|
export LD_LIBRARY_PATH=../..${LD_LIBRARY_PATH:+:}"$LD_LIBRARY_PATH"
|
|
|
|
./tom_testdata migrate
|
|
--database=tinyorm_testdata_tom_mysql,tinyorm_testdata_tom_postgres,tinyorm_testdata_tom_sqlite
|
|
--seed --no-ansi
|
|
env:
|
|
DB_MYSQL_CHARSET: ${{ secrets.DB_MYSQL_CHARSET }}
|
|
DB_MYSQL_COLLATION: ${{ secrets.DB_MYSQL_COLLATION }}
|
|
DB_MYSQL_DATABASE: ${{ secrets.DB_MYSQL_DATABASE }}
|
|
DB_MYSQL_HOST: ${{ secrets.DB_MYSQL_HOST }}
|
|
DB_MYSQL_PASSWORD: ${{ secrets.DB_MYSQL_PASSWORD }}
|
|
DB_MYSQL_USERNAME: ${{ secrets.DB_MYSQL_USERNAME }}
|
|
DB_PGSQL_CHARSET: ${{ secrets.DB_PGSQL_CHARSET }}
|
|
DB_PGSQL_DATABASE: ${{ secrets.DB_PGSQL_DATABASE }}
|
|
DB_PGSQL_HOST: ${{ secrets.DB_PGSQL_HOST }}
|
|
DB_PGSQL_PASSWORD: ${{ secrets.DB_PGSQL_PASSWORD }}
|
|
DB_PGSQL_SEARCHPATH: ${{ secrets.DB_PGSQL_SEARCHPATH }}
|
|
DB_PGSQL_USERNAME: ${{ secrets.DB_PGSQL_USERNAME }}
|
|
DB_SQLITE_DATABASE: ${{ env.TinySQLitePath }}
|
|
TOM_TESTDATA_ENV: testing
|
|
|
|
- name: TinyORM execute ctest 🔥
|
|
working-directory: ../TinyORM-builds-cmake/build-${{ matrix.compiler.key }}-cmake-debug
|
|
run: |
|
|
ctest --output-on-failure
|
|
env:
|
|
DB_MYSQL_CHARSET: ${{ secrets.DB_MYSQL_CHARSET }}
|
|
DB_MYSQL_COLLATION: ${{ secrets.DB_MYSQL_COLLATION }}
|
|
DB_MYSQL_DATABASE: ${{ secrets.DB_MYSQL_DATABASE }}
|
|
DB_MYSQL_HOST: ${{ secrets.DB_MYSQL_HOST }}
|
|
DB_MYSQL_PASSWORD: ${{ secrets.DB_MYSQL_PASSWORD }}
|
|
DB_MYSQL_USERNAME: ${{ secrets.DB_MYSQL_USERNAME }}
|
|
DB_PGSQL_CHARSET: ${{ secrets.DB_PGSQL_CHARSET }}
|
|
DB_PGSQL_DATABASE: ${{ secrets.DB_PGSQL_DATABASE }}
|
|
DB_PGSQL_HOST: ${{ secrets.DB_PGSQL_HOST }}
|
|
DB_PGSQL_PASSWORD: ${{ secrets.DB_PGSQL_PASSWORD }}
|
|
DB_PGSQL_SEARCHPATH: ${{ secrets.DB_PGSQL_SEARCHPATH }}
|
|
DB_PGSQL_USERNAME: ${{ secrets.DB_PGSQL_USERNAME }}
|
|
DB_SQLITE_DATABASE: ${{ env.TinySQLitePath }}
|
|
TOM_TESTS_ENV: testing
|
|
|
|
- name: Tom example test some commands (MySQL) 🚀
|
|
working-directory: ../TinyORM-builds-cmake/build-${{ matrix.compiler.key }}-cmake-debug/examples/tom
|
|
run: |
|
|
export LD_LIBRARY_PATH=../..${LD_LIBRARY_PATH:+:}"$LD_LIBRARY_PATH"
|
|
|
|
./tom migrate:install --database=tinyorm_tom_mysql --no-ansi
|
|
./tom migrate:status --database=tinyorm_tom_mysql --no-ansi
|
|
./tom migrate --database=tinyorm_tom_mysql --seed --no-ansi
|
|
./tom migrate:refresh --database=tinyorm_tom_mysql --seed --no-ansi
|
|
./tom migrate:status --database=tinyorm_tom_mysql --no-ansi
|
|
env:
|
|
DB_MYSQL_CHARSET: ${{ secrets.DB_MYSQL_CHARSET }}
|
|
DB_MYSQL_COLLATION: ${{ secrets.DB_MYSQL_COLLATION }}
|
|
DB_MYSQL_DATABASE: ${{ secrets.DB_MYSQL_DATABASE }}
|
|
DB_MYSQL_HOST: ${{ secrets.DB_MYSQL_HOST }}
|
|
DB_MYSQL_PASSWORD: ${{ secrets.DB_MYSQL_PASSWORD }}
|
|
DB_MYSQL_USERNAME: ${{ secrets.DB_MYSQL_USERNAME }}
|
|
TOM_EXAMPLE_ENV: testing
|
|
|
|
- name: Tom example test some commands (PostgreSQL) 🙌
|
|
working-directory: ../TinyORM-builds-cmake/build-${{ matrix.compiler.key }}-cmake-debug/examples/tom
|
|
run: |
|
|
export LD_LIBRARY_PATH=../..${LD_LIBRARY_PATH:+:}"$LD_LIBRARY_PATH"
|
|
|
|
./tom migrate:install --database=tinyorm_tom_postgres --no-ansi
|
|
./tom migrate:status --database=tinyorm_tom_postgres --no-ansi
|
|
./tom migrate --database=tinyorm_tom_postgres --seed --no-ansi
|
|
./tom migrate:refresh --database=tinyorm_tom_postgres --seed --no-ansi
|
|
./tom migrate:status --database=tinyorm_tom_postgres --no-ansi
|
|
env:
|
|
DB_PGSQL_CHARSET: ${{ secrets.DB_PGSQL_CHARSET }}
|
|
DB_PGSQL_DATABASE: ${{ secrets.DB_PGSQL_DATABASE }}
|
|
DB_PGSQL_HOST: ${{ secrets.DB_PGSQL_HOST }}
|
|
DB_PGSQL_PASSWORD: ${{ secrets.DB_PGSQL_PASSWORD }}
|
|
DB_PGSQL_SEARCHPATH: ${{ secrets.DB_PGSQL_SEARCHPATH }}
|
|
DB_PGSQL_USERNAME: ${{ secrets.DB_PGSQL_USERNAME }}
|
|
TOM_EXAMPLE_ENV: testing
|
|
|
|
- name: Tom example test some commands (SQLite) 🏁
|
|
working-directory: ../TinyORM-builds-cmake/build-${{ matrix.compiler.key }}-cmake-debug/examples/tom
|
|
run: |
|
|
export LD_LIBRARY_PATH=../..${LD_LIBRARY_PATH:+:}"$LD_LIBRARY_PATH"
|
|
|
|
./tom migrate:install --database=tinyorm_tom_sqlite --no-ansi
|
|
./tom migrate:status --database=tinyorm_tom_sqlite --no-ansi
|
|
./tom migrate --database=tinyorm_tom_sqlite --seed --no-ansi
|
|
# Dropping columns is supported only from the SQLite 3.35, so used migrate:fresh instead (image SQLite 3.31.1)
|
|
./tom migrate:fresh --database=tinyorm_tom_sqlite --seed --no-ansi
|
|
./tom migrate:status --database=tinyorm_tom_sqlite --no-ansi
|
|
env:
|
|
DB_SQLITE_DATABASE: ${{ env.TinySQLitePath }}
|
|
TOM_EXAMPLE_ENV: testing
|