image: node:21

variables:
  NODE_ENV: test
  DS_EXCLUDED_ANALYZERS: gemnasium-python

default:
  interruptible: true

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

stages:
  - deps
  - test
  - deploy
  - release

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

lint:
  stage: test
  script: yarn lint
  only:
    changes:
      - "**/*.js"
      - "**/*.jsx"
      - "**/*.cjs"
      - "**/*.mjs"
      - "**/*.ts"
      - "**/*.tsx"
      - "**/*.scss"
      - "**/*.css"
      - ".eslintignore"
      - ".eslintrc.json"
      - ".stylelintrc.json"

build:
  stage: test
  before_script:
    - apt-get update -y && apt-get install -y zip
  script:
    - yarn build
    - cp dist/index.html dist/404.html
    - cd dist && zip -r ../soapbox.zip . && cd ..
  variables:
    NODE_ENV: production
  artifacts:
    paths:
     - soapbox.zip

i18n:
  stage: test
  script:
    - yarn i18n
    - git diff --quiet || (echo "Locale files are out of date. Please run `yarn i18n`" && exit 1)

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:
    variables:
      - $CI_DEFAULT_BRANCH == $CI_COMMIT_REF_NAME
    changes:
      - "docs/**/*"

review:
  stage: deploy
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: https://$CI_COMMIT_REF_SLUG.git.soapbox.pub
  before_script:
    - apt-get update -y && apt-get install -y unzip
  script:
    - unzip soapbox.zip -d dist
    - npx -y surge dist $CI_COMMIT_REF_SLUG.git.soapbox.pub
  allow_failure: true

pages:
  stage: deploy
  before_script:
    - apt-get update -y && apt-get install -y unzip
  script:
    # artifacts are kept between jobs
    - unzip soapbox.zip -d public
  variables:
    NODE_ENV: production
  artifacts:
    paths:
    - public
  only:
    variables:
      - $CI_DEFAULT_BRANCH == $CI_COMMIT_REF_NAME

docker:
  stage: deploy
  image: docker:24.0.7
  services:
    - docker:24.0.7-dind
  tags:
    - dind
  # https://medium.com/devops-with-valentine/how-to-build-a-docker-image-and-push-it-to-the-gitlab-container-registry-from-a-gitlab-ci-pipeline-acac0d1f26df
  script:
    - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER $CI_REGISTRY --password-stdin
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
  rules:
    - if: $CI_COMMIT_TAG
  interruptible: false

release:
  stage: release
  rules:
    - if: $CI_COMMIT_TAG
  script:
    - npx tsx ./scripts/do-release.ts
  interruptible: false

include:
  - template: Jobs/Dependency-Scanning.gitlab-ci.yml
