depends_on:
  - test
  - web

variables:
  - &golang_image 'golang:1.18.7'
  - &node_image 'node:18-alpine'
  - &xgo_image 'techknowlogick/xgo:go-1.18.7'
  - &xgo_version 'go-1.18.7'
  - &platforms_release 'linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/386,linux/amd64,linux/ppc64le,linux/riscv64,linux/s390x,windows/amd64,freebsd/arm64,freebsd/amd64,openbsd/arm64,openbsd/amd64'
  - &platforms_server 'linux/arm/v7,linux/arm64/v8,linux/amd64,linux/ppc64le,linux/riscv64'
  - &platforms_preview 'linux/arm/v6,linux/arm64/v8,linux/amd64,linux/riscv64,windows/amd64'
  - &platforms_alpine 'linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/amd64,linux/ppc64le'

pipeline:
  vendor:
    image: *golang_image
    pull: true
    commands:
      - go mod vendor

  ###############
  # S e r v e r #
  ###############
  build-web:
    image: *node_image
    directory: web/
    commands:
      - corepack enable
      - pnpm install --frozen-lockfile
      - pnpm build

  cross-compile-server:
    image: *xgo_image
    pull: true
    commands:
      - apt update
      - apt install -y tree
      - make cross-compile-server
    environment:
      PLATFORMS: linux|arm/v7;linux|arm64/v8;linux|amd64;linux|ppc64le;linux|riscv64
      TAGS: bindata sqlite sqlite_unlock_notify
      XGO_VERSION: *xgo_version

  publish-server-preview:
    image: woodpeckerci/plugin-docker-buildx
    secrets: [ docker_username, docker_password ]
    group: docker
    settings:
      repo: woodpeckerci/woodpecker-server
      dockerfile: docker/Dockerfile.server.multiarch
      platforms: *platforms_server
      tag: pull_${CI_COMMIT_PULL_REQUEST}
    when:
      event: pull_request

  publish-server-alpine-preview:
    image: woodpeckerci/plugin-docker-buildx
    secrets: [ docker_username, docker_password ]
    group: docker
    settings:
      repo: woodpeckerci/woodpecker-server
      dockerfile: docker/Dockerfile.server.alpine.multiarch
      platforms: *platforms_alpine
      tag: pull_${CI_COMMIT_PULL_REQUEST}-alpine
    when:
      event: pull_request

  publish-next-server:
    image: woodpeckerci/plugin-docker-buildx
    group: docker
    secrets: [docker_username, docker_password]
    settings:
      repo: woodpeckerci/woodpecker-server
      dockerfile: docker/Dockerfile.server.multiarch
      platforms: *platforms_server
      tag: [next, "next-${CI_COMMIT_SHA:0:10}"]
    when:
      branch: ${CI_REPO_DEFAULT_BRANCH}
      event: push

  publish-next-server-alpine:
    image: woodpeckerci/plugin-docker-buildx
    group: docker
    secrets: [ docker_username, docker_password ]
    settings:
      repo: woodpeckerci/woodpecker-server
      dockerfile: docker/Dockerfile.server.alpine.multiarch
      platforms: *platforms_alpine
      tag: [next-alpine, "next-${CI_COMMIT_SHA:0:10}-alpine"]
    when:
      branch: ${CI_REPO_DEFAULT_BRANCH}
      event: push

  publish-release-branch-server:
    image: woodpeckerci/plugin-docker-buildx
    group: docker
    secrets: [docker_username, docker_password]
    settings:
      repo: woodpeckerci/woodpecker-server
      dockerfile: docker/Dockerfile.server.multiarch
      platforms: *platforms_server
      tag: ${CI_COMMIT_BRANCH##release/}
    when:
      branch: release/*
      event: push

  publish-release-branch-server-alpine:
    image: woodpeckerci/plugin-docker-buildx
    group: docker
    secrets: [ docker_username, docker_password ]
    settings:
      repo: woodpeckerci/woodpecker-server
      dockerfile: docker/Dockerfile.server.alpine.multiarch
      platforms: *platforms_alpine
      tag: ${CI_COMMIT_BRANCH##release/}
    when:
      branch: release/*
      event: push

  release-server:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [docker_username, docker_password]
    settings:
      repo: woodpeckerci/woodpecker-server
      dockerfile: docker/Dockerfile.server.multiarch
      platforms: *platforms_server
      # remove 'latest' on older version branches to avoid accidental downgrade
      tag: [latest, "${CI_COMMIT_TAG}"]
    when:
      event: tag

  release-server-alpine:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [ docker_username, docker_password ]
    settings:
      repo: woodpeckerci/woodpecker-server
      dockerfile: docker/Dockerfile.server.alpine.multiarch
      platforms: *platforms_alpine
      # remove 'latest-alpine' on older version branches to avoid accidental downgrade
      tag: [latest-alpine, "${CI_COMMIT_TAG}-alpine"]
    when:
      event: tag

  #############
  # A g e n t #
  #############

  publish-agent-preview:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [ docker_username, docker_password ]
    settings:
      repo: woodpeckerci/woodpecker-agent
      dockerfile: docker/Dockerfile.agent.multiarch
      platforms: *platforms_preview
      tag: pull_${CI_COMMIT_PULL_REQUEST}
    when:
      event: pull_request

  publish-next-agent:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [docker_username, docker_password]
    settings:
      repo: woodpeckerci/woodpecker-agent
      dockerfile: docker/Dockerfile.agent.multiarch
      platforms: *platforms_release
      tag: [next, "next-${CI_COMMIT_SHA:0:10}"]
    when:
      branch: ${CI_REPO_DEFAULT_BRANCH}
      event: push

  publish-next-agent-alpine:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [ docker_username, docker_password ]
    settings:
      repo: woodpeckerci/woodpecker-agent
      dockerfile: docker/Dockerfile.agent.alpine.multiarch
      platforms: *platforms_alpine
      tag: [next-alpine, "next-${CI_COMMIT_SHA:0:10}-alpine"]
    when:
      branch: ${CI_REPO_DEFAULT_BRANCH}
      event: push

  publish-release-branch-agent:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [docker_username, docker_password]
    settings:
      repo: woodpeckerci/woodpecker-agent
      dockerfile: docker/Dockerfile.agent.multiarch
      platforms: *platforms_release
      tag: ${CI_COMMIT_BRANCH##release/}
    when:
      branch: release/*
      event: push

  publish-release-branch-agent-alpine:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [ docker_username, docker_password ]
    settings:
      repo: woodpeckerci/woodpecker-agent
      dockerfile: docker/Dockerfile.agent.alpine.multiarch
      platforms: *platforms_alpine
      tag: ${CI_COMMIT_BRANCH##release/}
    when:
      branch: release/*
      event: push

  release-agent:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [docker_username, docker_password]
    settings:
      repo: woodpeckerci/woodpecker-agent
      dockerfile: docker/Dockerfile.agent.multiarch
      platforms: *platforms_release
      # remove 'latest' on older version branches to avoid accidental downgrade
      tag: [latest, "${CI_COMMIT_TAG}"]
    when:
      event: tag

  release-agent-alpine:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [ docker_username, docker_password ]
    settings:
      repo: woodpeckerci/woodpecker-agent
      dockerfile: docker/Dockerfile.agent.alpine.multiarch
      platforms: *platforms_alpine
      # remove 'latest-alpine' on older version branches to avoid accidental downgrade
      tag: [latest-alpine, "${CI_COMMIT_TAG}-alpine"]
    when:
      event: tag

  #########
  # C L I #
  #########

  publish-cli-preview:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [ docker_username, docker_password ]
    settings:
      repo: woodpeckerci/woodpecker-cli
      dockerfile: docker/Dockerfile.cli.multiarch
      platforms: *platforms_preview
      tag: pull_${CI_COMMIT_PULL_REQUEST}
    when:
      event: pull_request

  publish-next-cli:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [docker_username, docker_password]
    settings:
      repo: woodpeckerci/woodpecker-cli
      dockerfile: docker/Dockerfile.cli.multiarch
      platforms: *platforms_release
      tag: [next, "next-${CI_COMMIT_SHA:0:10}"]
    when:
      branch: ${CI_REPO_DEFAULT_BRANCH}
      event: push

  publish-next-cli-alpine:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [ docker_username, docker_password ]
    settings:
      repo: woodpeckerci/woodpecker-cli
      dockerfile: docker/Dockerfile.cli.alpine.multiarch
      platforms: *platforms_alpine
      tag: [next-alpine, "next-${CI_COMMIT_SHA:0:10}-alpine"]
    when:
      branch: ${CI_REPO_DEFAULT_BRANCH}
      event: push

  publish-release-branch-cli:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [docker_username, docker_password]
    settings:
      repo: woodpeckerci/woodpecker-cli
      dockerfile: docker/Dockerfile.cli.multiarch
      platforms: *platforms_release
      tag: ${CI_COMMIT_BRANCH##release/}
    when:
      branch: release/*
      event: push

  publish-release-branch-cli-alpine:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [ docker_username, docker_password ]
    settings:
      repo: woodpeckerci/woodpecker-cli
      dockerfile: docker/Dockerfile.cli.alpine.multiarch
      platforms: *platforms_alpine
      tag: ${CI_COMMIT_BRANCH##release/}
    when:
      branch: release/*
      event: push

  release-cli:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [docker_username, docker_password]
    settings:
      repo: woodpeckerci/woodpecker-cli
      dockerfile: docker/Dockerfile.cli.multiarch
      platforms: *platforms_release
      # remove 'latest' on older version branches to avoid accidental downgrade
      tag: [latest, "${CI_COMMIT_TAG}"]
    when:
      event: tag

  release-cli-alpine:
    group: docker
    image: woodpeckerci/plugin-docker-buildx
    secrets: [ docker_username, docker_password ]
    settings:
      repo: woodpeckerci/woodpecker-cli
      dockerfile: docker/Dockerfile.cli.alpine.multiarch
      platforms: *platforms_alpine
      # remove 'latest-alpine' on older version branches to avoid accidental downgrade
      tag: [latest-alpine, "${CI_COMMIT_TAG}-alpine"]
    when:
      event: tag
