Small fixes and refactoring #146
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: C++ CI | |
on: | |
push: | |
branches: [ '*' ] # NOTE: replace/update with appropriate branch name(s) | |
tags: [ '*' ] | |
pull_request: | |
types: [ closed ] | |
branches: [ '*' ] # NOTE: replace/update with appropriate branch name(s) | |
workflow_dispatch: | |
inputs: | |
build_type: | |
description: Build type | |
required: false | |
default: 'Debug' | |
type: choice | |
options: | |
- Debug | |
- Release | |
- RelWithDebInfo | |
- MinSizeRel | |
env: | |
BUILD_TYPE: ${{ inputs.build_type || 'Debug' }} | |
SRC_EXECUTABLE_NAME: "Password-Keeper-src" | |
TEST_EXECUTABLE_NAME: "Password-Keeper-Test-Runner" | |
INPUT_FILENAME: "tastatura.txt" | |
BIN_DIR: "bin" # update in cmake/Options.cmake:6 if changing name here | |
BUILD_DIR: "build" | |
EXT_DIR: "ext" | |
GEN_DIR: "generated" | |
DB_NAME: ${{ secrets.DB_NAME }} | |
DB_USER: ${{ secrets.DB_USER }} | |
DB_PASSWORD: ${{ secrets.DB_PASSWORD }} | |
DB_HOST: ${{ secrets.DB_HOST }} | |
DB_PORT: ${{ secrets.DB_PORT }} | |
defaults: | |
run: | |
# Use a bash shell, so we can use the same syntax for environment variable | |
# access regardless of the host operating system | |
# https://github.com/saxbophone/CPP20-Cross-Platform-Template | |
shell: bash | |
jobs: | |
cppcheck: | |
name: "Cppcheck" | |
# concurrency: | |
# group: "Cppcheck" | |
runs-on: ubuntu-22.04 | |
timeout-minutes: 5 | |
env: | |
# check https://github.com/danmar/cppcheck/releases for latest version | |
# NOTE: consider updating this value in scripts/build_cppcheck.sh:4 when changing this value | |
CPPCHECK_VER: "2.14.2" | |
steps: | |
- name: Checkout repo | |
uses: actions/checkout@v4 | |
- name: Run cppcheck | |
uses: ./.github/actions/cppcheck | |
clang-tidy: | |
name: "Clang-Tidy" | |
# concurrency: | |
# group: "Clang-Tidy" | |
runs-on: ubuntu-22.04 | |
timeout-minutes: 5 | |
env: | |
CLANG_VER: 18 | |
steps: | |
- name: Checkout repo | |
uses: actions/checkout@v4 | |
- name: Run clang-tidy | |
uses: ./.github/actions/clang-tidy | |
build: | |
name: ${{ matrix.name }} | |
# concurrency: | |
# group: ${{ matrix.name }} | |
runs-on: ${{ matrix.os }} | |
timeout-minutes: 15 | |
permissions: | |
attestations: write | |
contents: write | |
id-token: write | |
env: | |
CC: ${{ matrix.c }} | |
CXX: ${{ matrix.cxx }} | |
VSCMD_SKIP_SENDTELEMETRY: 1 | |
# NOTE: replace with another version if this one does not work | |
# For more versions, see https://winlibs.com or | |
# https://github.com/brechtsanders/winlibs_mingw/releases/ | |
MINGW_VER: "13.3.0posix-11.0.1-msvcrt-r1/winlibs-x86_64-posix-seh-gcc-13.3.0-mingw-w64msvcrt-11.0.1-r1.7z" | |
# Example: | |
# MINGW_VER: "13.3.0posix-11.0.1-ucrt-r1/winlibs-x86_64-posix-seh-gcc-13.3.0-mingw-w64ucrt-11.0.1-r1.7z" | |
# MINGW_VER: "14.1.0posix-18.1.7-12.0.0-ucrt-r2/winlibs-x86_64-posix-seh-gcc-14.1.0-mingw-w64ucrt-12.0.0-r2.7z" | |
# MINGW_VER: "14.1.0posix-18.1.7-12.0.0-msvcrt-r2/winlibs-x86_64-posix-seh-gcc-14.1.0-mingw-w64msvcrt-12.0.0-r2.7z" | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
# - os: ubuntu-22.04 | |
# c: clang-18 | |
# cxx: clang++-18 | |
# clang_ver: "18" | |
# clang_ver_full: "18.1.8" | |
# name: "MSan: Ubuntu 22.04 Clang 18" | |
# cmake_flags: "-DUSE_MSAN=ON" | |
# cmake_generator: Ninja | |
# # This env runs memory sanitizers | |
# runs_msan: true | |
- os: ubuntu-22.04 | |
c: gcc-12 | |
cxx: g++-12 | |
name: "ASan: Ubuntu 22.04 GCC 12" | |
cmake_flags: "-DUSE_ASAN=ON" | |
cmake_generator: Ninja | |
# This env runs address sanitizers | |
runs_asan: true | |
# this is used to add a suffix to the archive name since we use the same compiler version | |
asan_name: "-asan" | |
- os: ubuntu-22.04 | |
c: gcc-12 | |
cxx: g++-12 | |
name: "Valgrind: Ubuntu 22.04 GCC 12" | |
# cmake_flags: | |
cmake_generator: Ninja | |
# This env runs valgrind | |
runs_valgrind: true | |
- os: macos-14 | |
c: clang | |
cxx: clang++ | |
name: "macOS 14 Apple Clang 15" | |
cmake_flags: "-DUSE_ASAN=OFF" | |
# cmake_generator: | |
# This env runs address sanitizers | |
runs_asan: false | |
- os: macos-14 | |
c: gcc-13 | |
cxx: g++-13 | |
name: "macOS 14 GCC 13" | |
# cmake_flags: | |
# cmake_generator: Ninja | |
# - os: windows-2022 | |
# c: cl | |
# cxx: cl | |
# name: "ASan: Windows 2022 MSVC 19.41" | |
# cmake_flags: "-DUSE_ASAN=ON" | |
# # Ninja is not faster on MSVC because... MSVC | |
# # cmake_generator: "Ninja" | |
# # cmake_generator: "Ninja Multi-Config" | |
# # This env runs address sanitizers | |
# runs_asan: true | |
- os: windows-2022 | |
c: gcc | |
cxx: g++ | |
name: "Windows 2022 MinGW GCC 13" | |
# cmake_flags: | |
cmake_generator: Ninja | |
steps: | |
- name: Checkout repo | |
uses: actions/checkout@v4 | |
- name: Install PostgreSQL | |
uses: ./.github/actions/install-postgres | |
- name: Set timestamp and zip name | |
run: | | |
echo "TIMESTAMP=$(date +%Y-%m-%d-%H-%M-%S)" >> ${GITHUB_ENV} | |
# use the full name as prefix: {user_name}_{repo_name} (replace / with _) | |
echo "ZIP_NAME=$(echo "${GITHUB_REPOSITORY}_${{ env.BUILD_TYPE }}_${{ matrix.os }}_${{ matrix.cxx }}${{ matrix.asan_name }}" | sed 's|/|_|')" >> ${GITHUB_ENV} | |
# or use only the repo name (github does not have a predefined environment variable for this) | |
# the regex splits by / and keeps everything after / without the / character | |
# echo "ZIP_NAME=$(echo "${GITHUB_REPOSITORY}_${{ env.BUILD_TYPE }}_${{ matrix.os }}_${{ matrix.cxx }}${{ matrix.asan_name }}" | sed -E 's|.+/(.+)|\1|')" >> ${GITHUB_ENV} | |
- name: Install packages | |
uses: ./.github/actions/install-packages | |
- name: Configure CMake | |
uses: ./.github/actions/configure-cmake | |
with: | |
custom_flags: ${{ matrix.cmake_flags }} | |
warnings_as_errors: 'ON' | |
- name: Build | |
run: | | |
bash ./scripts/cmake.sh build -t ${{ env.BUILD_TYPE }} | |
- name: Install | |
# Use CMake to "install" build artifacts (only interested in CMake registered targets) to our custom artifacts directory | |
run: | | |
bash ./scripts/cmake.sh install -i artifacts -t ${{ env.BUILD_TYPE }} | |
- name: Move artifacts | |
run: | | |
mkdir ${{ env.ZIP_NAME }} | |
mv artifacts/${{ env.BIN_DIR }}/* ${{ env.ZIP_NAME }} | |
ls -la ${{ env.ZIP_NAME }} | |
- name: Process artifacts | |
uses: ./.github/actions/process-artifacts | |
- name: Upload Artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ env.ZIP_NAME }}_${{ env.TIMESTAMP }} | |
path: ${{ env.ZIP_NAME }} | |
retention-days: 30 | |
- name: Runtime checks | |
uses: ./.github/actions/runtime-checks | |
- name: Create release | |
uses: ./.github/actions/create-release | |
if: startsWith(github.ref, 'refs/tags/') | |
test: | |
name: "Test" | |
runs-on: ubuntu-latest | |
needs: build | |
timeout-minutes: 5 | |
services: | |
postgres: | |
image: postgres:latest | |
env: | |
POSTGRES_USER: pipeline_test_user | |
POSTGRES_PASSWORD: pipeline_test_password | |
POSTGRES_DB: pipeline_test_password_keeper | |
options: >- | |
--health-cmd "pg_isready -U pipeline_test_user" | |
--health-interval 10s | |
--health-timeout 5s | |
--health-retries 5 | |
ports: | |
- 5432:5432 | |
env: | |
DB_HOST: localhost | |
DB_NAME: pipeline_test_password_keeper | |
DB_USER: pipeline_test_user | |
DB_PASSWORD: pipeline_test_password | |
DB_PORT: 5432 | |
RUNS_TESTS: 1 | |
steps: | |
- name: "Checkout code" | |
uses: actions/checkout@v4 | |
- name: "Set up GCC" | |
run: sudo apt-get install -y build-essential gcc | |
- name: "Install dependencies" | |
run: | | |
sudo apt-get update | |
sudo apt-get install -y postgresql | |
- name: "Install CMake and Ninja" | |
run: | | |
sudo apt-get install -y cmake ninja-build | |
- name: "Build project" | |
run: | | |
cmake -S . -B build -G Ninja -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DRUN_TESTS=ON -DSKIP_BUILD_TEST=ON | |
cmake --build build | |
- name: "Postgres setup" | |
run: | | |
export PGPASSWORD=pipeline_test_password | |
psql -h localhost -U pipeline_test_user -d pipeline_test_password_keeper -c " | |
CREATE TABLE IF NOT EXISTS users ( | |
id SERIAL PRIMARY KEY, | |
username VARCHAR(50) UNIQUE NOT NULL, | |
passwordSalt VARCHAR(150) NOT NULL, | |
passwordHash VARCHAR(150) NOT NULL | |
); | |
CREATE TABLE IF NOT EXISTS bankaccounts ( | |
id SERIAL REFERENCES users (id), | |
username VARCHAR(50) NOT NULL, | |
password VARCHAR(50) NOT NULL, | |
IBAN VARCHAR(50) NOT NULL, | |
bank VARCHAR(50) NOT NULL, | |
CONSTRAINT pk_bankaccount PRIMARY KEY (id, username, password, IBAN, bank) | |
); | |
CREATE TABLE IF NOT EXISTS emailaccounts ( | |
id SERIAL REFERENCES users (id), | |
username VARCHAR(50) NOT NULL, | |
password VARCHAR(50) NOT NULL, | |
emailAddress VARCHAR(50) NOT NULL, | |
mailProvider VARCHAR(50) NOT NULL, | |
CONSTRAINT pk_emailaccounts PRIMARY KEY (id, username, password, emailAddress, mailProvider) | |
); | |
CREATE TABLE IF NOT EXISTS socialmediaaccounts ( | |
id SERIAL REFERENCES users (id), | |
username VARCHAR(50) NOT NULL, | |
password VARCHAR(50) NOT NULL, | |
platform VARCHAR(50) NOT NULL, | |
profileUrl VARCHAR(50) NOT NULL, | |
CONSTRAINT pk_socialmediaaccounts PRIMARY KEY (id, username, password, platform, profileUrl) | |
); | |
" | |
- name: "Run tests" | |
env: | |
DB_HOST: ${{ env.DB_HOST }} | |
DB_NAME: ${{ env.DB_NAME }} | |
DB_USER: ${{ env.DB_USER }} | |
DB_PASSWORD: ${{ env.DB_PASSWORD }} | |
DB_PORT: ${{ env.DB_PORT }} | |
run: | | |
cd build | |
ctest --verbose --no-compress-output |