image: node:18

variables:
  NODE_ENV: test

cache: &cache
  key:
    files:
      - yarn.lock
  paths:
    - node_modules/
  policy: pull

stages:
  - deps
  - test
  - deploy

deps:
  stage: deps
  script: yarn install --ignore-scripts
  only:
    changes:
      - yarn.lock
  cache:
    <<: *cache
    policy: push

danger:
  stage: test
  script:
    # https://github.com/danger/danger-js/issues/1029#issuecomment-998915436
    - export CI_MERGE_REQUEST_IID=${CI_OPEN_MERGE_REQUESTS#*!}
    - npx danger ci
  allow_failure: true

lint-js:
  stage: test
  script: yarn lint:js
  only:
    changes:
      - "**/*.js"
      - "**/*.jsx"
      - "**/*.ts"
      - "**/*.tsx"
      - ".eslintignore"
      - ".eslintrc.js"

lint-sass:
  stage: test
  script: yarn lint:sass
  only:
    changes:
      - "**/*.scss"
      - "**/*.css"
      - ".stylelintrc.json"

jest:
  stage: test
  script: yarn test:coverage
  only:
    changes:
      - "**/*.js"
      - "**/*.json"
      - "app/soapbox/**/*"
      - "webpack/**/*"
      - "custom/**/*"
      - "jest.config.js"
      - "package.json"
      - "yarn.lock"
      - ".gitlab-ci.yml"
  coverage: /All files[^|]*\|[^|]*\s+([\d\.]+)/
  artifacts:
    reports:
      junit: junit.xml
      coverage_report:
        coverage_format: cobertura
        path: .coverage/cobertura-coverage.xml

nginx-test:
  stage: test
  image: nginx:latest
  before_script: cp installation/mastodon.conf /etc/nginx/conf.d/default.conf
  script: nginx -t
  only:
    changes:
      - "installation/mastodon.conf"

build-production:
  stage: test
  script: yarn build
  variables:
    NODE_ENV: production
  artifacts:
    paths:
     - static

docs-deploy:
  stage: deploy
  image: alpine:latest
  before_script:
    - apk add curl
  script:
    - curl -X POST -F"token=$CI_JOB_TOKEN" -F'ref=master' https://gitlab.com/api/v4/projects/15685485/trigger/pipeline
  only:
    refs:
      - develop
    changes:
      - "docs/**/*"

# Supposed to fail when translations are outdated, instead always passes
#
# i18n:
#   stage: build
#   script: yarn manage:translations
#   variables:
#     NODE_ENV: development
#   before_script:
#     - yarn
#     - yarn build

review:
  stage: deploy
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: https://$CI_COMMIT_REF_SLUG.git.soapbox.pub
  script:
    - npx -y surge static $CI_COMMIT_REF_SLUG.git.soapbox.pub
  allow_failure: true

pages:
  stage: deploy
  before_script: []
  script:
    # artifacts are kept between jobs
    - mv static public
  variables:
    NODE_ENV: production
  artifacts:
    paths:
    - public
  only:
    refs:
      - develop
