image: docker:stable

stages:
- build frontend
- build
- manifest

default:
  before_script:
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

build frontend:
  image: node:lts-alpine
  stage: build frontend
  before_script: []
  variables:
    NODE_ENV: "production"
  cache:
    paths:
    - maubot/management/frontend/node_modules
  script:
  - cd maubot/management/frontend
  - yarn --prod
  - yarn build
  - mv build ../../../frontend
  artifacts:
    paths:
    - frontend
    expire_in: 1 hour

build amd64:
  stage: build
  tags:
  - amd64
  script:
  - echo maubot/management/frontend >> .dockerignore
  - docker pull $CI_REGISTRY_IMAGE:latest || true
  - docker build --pull --cache-from $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-amd64 . -f Dockerfile.ci
  - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-amd64
  - docker rmi $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-amd64

build arm64:
  stage: build
  tags:
  - arm64
  script:
  - echo maubot/management/frontend >> .dockerignore
  - docker pull $CI_REGISTRY_IMAGE:latest || true
  - docker build --pull --cache-from $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-arm64 . -f Dockerfile.ci
  - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-arm64
  - docker rmi $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-arm64

manifest:
  stage: manifest
  before_script:
  - "mkdir -p $HOME/.docker && echo '{\"experimental\": \"enabled\"}' > $HOME/.docker/config.json"
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
  - docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-amd64
  - docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-arm64
  - if [ $CI_COMMIT_BRANCH == "master" ]; then docker manifest create $CI_REGISTRY_IMAGE:latest $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-amd64 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-arm64 && docker manifest push $CI_REGISTRY_IMAGE:latest; fi
  - if [ $CI_COMMIT_BRANCH != "master" ]; then docker manifest create $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-amd64 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-arm64 && docker manifest push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME; fi
  - docker rmi $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-amd64 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-arm64


build standalone amd64:
  stage: build
  tags:
  - amd64
  script:
    - docker pull $CI_REGISTRY_IMAGE:standalone || true
    - docker build --pull --cache-from $CI_REGISTRY_IMAGE:standalone --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-standalone . -f maubot/standalone/Dockerfile
    - if [ $CI_COMMIT_BRANCH == "master" ]; then docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-standalone $CI_REGISTRY_IMAGE:standalone && docker push $CI_REGISTRY_IMAGE:standalone; fi
    - if [ $CI_COMMIT_BRANCH != "master" ]; then docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-standalone $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME-standalone && docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME-standalone; fi
