image: code.castopod.org:5050/adaures/castopod:ci

stages:
  - prepare
  - quality
  - bundle
  - release
  - build
  - deploy

php-dependencies:
  stage: prepare
  script:
    # Install all php dependencies
    - composer install --prefer-dist --no-ansi --no-interaction --no-progress --ignore-platform-reqs
  cache:
    key:
      files:
        - composer.lock
    paths:
      - .composer-cache
  artifacts:
    expire_in: 30 mins
    paths:
      - vendor/

js-dependencies:
  stage: prepare
  script:
    # Install all js dependencies
    - pnpm install
  cache:
    key:
      files:
        - pnpm-lock.yaml
    paths:
      - .pnpm-store
  artifacts:
    expire_in: 30 mins
    paths:
      - node_modules/

lint-commit-msg:
  stage: quality
  script:
    - chmod +x ./scripts/lint-commit-msg.sh
    # lint commit message
    - ./scripts/lint-commit-msg.sh
  dependencies:
    - js-dependencies
  only:
    - develop
    - main
    - beta
    - alpha

lint-php:
  stage: quality
  script:
    # check php code style
    - vendor/bin/ecs check --ansi
    # phpstan - increase memory limit to 1GB to prevent script failure
    - php -d memory_limit=1G vendor/bin/phpstan analyse --ansi
    # run rector to check for php errors
    - vendor/bin/rector process --dry-run --ansi
  dependencies:
    - php-dependencies

lint-js:
  stage: quality
  script:
    - pnpm run prettier
    - pnpm run typecheck
    - pnpm run lint
    - pnpm run lint:css
  dependencies:
    - js-dependencies

tests:
  stage: quality
  services:
    - mariadb
  variables:
    MYSQL_ROOT_PASSWORD: "R00Tp4ssW0RD"
    MYSQL_DATABASE: "test"
    MYSQL_USER: "castopod"
    MYSQL_PASSWORD: "castopod"
  script:
    - echo "SHOW DATABASES;" | mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mariadb "$MYSQL_DATABASE"

    # run phpunit without code coverage
    # TODO: add code coverage
    - vendor/bin/phpunit --no-coverage
  dependencies:
    - php-dependencies

bundle:
  stage: bundle
  before_script:
    # prepare dependencies before bundling
    - chmod +x ./scripts/bundle-prepare.sh
    - ./scripts/bundle-prepare.sh
  script:
    # make scripts/bundle.sh executable
    - chmod +x ./scripts/bundle.sh

    # bundle castopod with commit ref as version
    - ./scripts/bundle.sh ${CI_COMMIT_REF_SLUG}_${CI_COMMIT_SHORT_SHA}
  dependencies:
    - php-dependencies
    - js-dependencies
  artifacts:
    name: "castopod-${CI_COMMIT_REF_SLUG}_${CI_COMMIT_SHORT_SHA}"
    paths:
      - castopod
  only:
    variables:
      - $CI_PROJECT_NAMESPACE == "adaures"
  except:
    - main
    - beta
    - alpha

release:
  stage: release
  before_script:
    # IMPORTANT: delete local git tags before release to prevent eventual script failure (ie. tag already exists)
    - git tag | xargs git tag -d

    # prepare dependencies before release, both bundle and package scripts will be run by semantic-release
    - chmod +x ./scripts/bundle-prepare.sh
    - ./scripts/bundle-prepare.sh
  script:
    # make release scripts executable
    - chmod +x ./scripts/bundle.sh
    - chmod +x ./scripts/package.sh

    # run semantic-release script (configured in `.releaserc.json` file)
    - pnpm run release
  dependencies:
    - php-dependencies
    - js-dependencies
  artifacts:
    paths:
      - castopod
      - CP_VERSION.env
  only:
    - main
    - beta
    - alpha

website:
  stage: deploy
  trigger: adaures/castopod.org
  only:
    - main
    - beta
    - alpha

documentation:
  stage: deploy
  trigger:
    include: docs/.gitlab-ci.yml
    strategy: depend
  only:
    changes:
      - docs/**/*

docker:
  stage: build
  trigger:
    include: docker/production/.gitlab-ci.yml
    strategy: depend
  variables:
    PARENT_PIPELINE_ID: $CI_PIPELINE_ID
  only:
    refs:
      - develop
      - main
      - beta
      - alpha
    variables:
      - $CI_PROJECT_NAMESPACE == "adaures"
