---
kind: pipeline
name: testing

platform:
  os: linux
  arch: amd64

workspace:
  base: /go
  path: src/code.gitea.io/gitea

services:
  - name: mysql
    pull: default
    image: mysql:5.7
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: yes
      MYSQL_DATABASE: test

  - name: mysql8
    pull: default
    image: mysql:8.0
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: yes
      MYSQL_DATABASE: testgitea

  - name: pgsql
    pull: default
    image: postgres:9.5
    environment:
      POSTGRES_DB: test

  - name: mssql
    pull: default
    image: microsoft/mssql-server-linux:latest
    environment:
      ACCEPT_EULA: Y
      MSSQL_PID: Standard
      SA_PASSWORD: MwantsaSecurePassword1

  - name: ldap
    pull: default
    image: gitea/test-openldap:latest

steps:
  - name: fetch-tags
    pull: default
    image: docker:git
    commands:
      - git fetch --tags --force
    when:
      event:
        exclude:
          - pull_request

  - name: pre-build
    pull: always
    image: webhippie/nodejs:latest
    commands:
      - make css
      - make js

  - name: build-without-gcc
    pull: always
    image: golang:1.11 # this step is kept as the lowest version of golang that we support
    environment:
      GO111MODULE: on
      GOPROXY: off
    commands:
      - go build -mod=vendor -o gitea_no_gcc # test if build succeeds without the sqlite tag

  - name: build-linux-386
    pull: always
    image: golang:1.12
    environment:
      GO111MODULE: on
      GOPROXY: off
      GOOS: linux
      GOARCH: 386
    commands:
      - go build -mod=vendor -o gitea_linux_386 # test if compatible with 32 bit

  - name: build
    pull: always
    image: golang:1.12
    commands:
      - make clean
      - make generate
      - make golangci-lint
      - make revive
      - make swagger-check
      - make swagger-validate
      - make test-vendor
      - make build
    environment:
      GOPROXY: https://goproxy.cn # proxy.golang.org is blocked in China, this proxy is not
      GOSUMDB: sum.golang.org
      TAGS: bindata sqlite sqlite_unlock_notify

  - name: unit-test
    pull: always
    image: golang:1.12
    commands:
      - make unit-test-coverage
    environment:
      GOPROXY: off
      TAGS: bindata sqlite sqlite_unlock_notify
    depends_on:
      - build
    when:
      branch:
        - master
      event:
        - push
        - pull_request

  - name: release-test
    pull: always
    image: golang:1.12
    commands:
      - make test
    environment:
      GOPROXY: off
      TAGS: bindata sqlite sqlite_unlock_notify
    depends_on:
      - build
    when:
      branch:
        - "release/*"
      event:
        - push
        - pull_request

  - name: tag-pre-condition
    pull: always
    image: alpine/git
    commands:
      - git update-ref refs/heads/tag_test ${DRONE_COMMIT_SHA}
    depends_on:
      - build
    when:
      event:
        - tag

  - name: tag-test
    pull: always
    image: golang:1.12
    commands:
      - make test
    environment:
      GOPROXY: off
      TAGS: bindata
    depends_on:
      - tag-pre-condition
    when:
      event:
        - tag

  - name: test-sqlite
    pull: always
    image: golang:1.12
    commands:
      - "curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash"
      - apt-get install -y git-lfs
      - timeout -s ABRT 20m make test-sqlite-migration
      - timeout -s ABRT 20m make test-sqlite
    environment:
      GOPROXY: off
      TAGS: bindata
    depends_on:
      - build

  - name: test-mysql
    pull: always
    image: golang:1.12
    commands:
      - "curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash"
      - apt-get install -y git-lfs
      - make test-mysql-migration
      - make integration-test-coverage
    environment:
      GOPROXY: off
      TAGS: bindata
      TEST_LDAP: 1
    depends_on:
      - build
    when:
      branch:
        - master
      event:
        - push
        - pull_request

  - name: tag-test-mysql
    pull: always
    image: golang:1.12
    commands:
      - "curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash"
      - apt-get install -y git-lfs
      - timeout -s ABRT 20m make test-mysql-migration
      - timeout -s ABRT 20m make test-mysql
    environment:
      GOPROXY: off
      TAGS: bindata
      TEST_LDAP: 1
    depends_on:
      - build
    when:
      event:
        - tag

  - name: test-mysql8
    pull: always
    image: golang:1.12
    commands:
      - "curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash"
      - apt-get install -y git-lfs
      - timeout -s ABRT 20m make test-mysql8-migration
      - timeout -s ABRT 20m make test-mysql8
    environment:
      GOPROXY: off
      TAGS: bindata
      TEST_LDAP: 1
    depends_on:
      - build

  - name: test-pgsql
    pull: always
    image: golang:1.12
    commands:
      - "curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash"
      - apt-get install -y git-lfs
      - timeout -s ABRT 20m make test-pgsql-migration
      - timeout -s ABRT 20m make test-pgsql
    environment:
      GOPROXY: off
      TAGS: bindata
      TEST_LDAP: 1
    depends_on:
      - build

  - name: test-mssql
    pull: always
    image: golang:1.12
    commands:
      - "curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash"
      - apt-get install -y git-lfs
      - make test-mssql-migration
      - make test-mssql
    environment:
      GOPROXY: off
      TAGS: bindata
      TEST_LDAP: 1
    depends_on:
      - build

  - name: generate-coverage
    pull: always
    image: golang:1.12
    commands:
      - make coverage
    environment:
      GOPROXY: off
      TAGS: bindata
    depends_on:
      - unit-test
      - test-mysql
    when:
      branch:
        - master
      event:
        - push
        - pull_request

  - name: coverage
    pull: always
    image: robertstettner/drone-codecov
    settings:
      files:
        - coverage.all
    environment:
      CODECOV_TOKEN:
        from_secret: codecov_token
    depends_on:
      - generate-coverage
    when:
      branch:
        - master
      event:
        - push
        - pull_request

---
kind: pipeline
name: translations

platform:
  os: linux
  arch: amd64

workspace:
  base: /go
  path: src/code.gitea.io/gitea

trigger:
  branch:
    - master
  event:
    - push

steps:
  - name: download
    pull: always
    image: jonasfranz/crowdin
    settings:
      download: true
      export_dir: options/locale/
      ignore_branch: true
      project_identifier: gitea
    environment:
      CROWDIN_KEY:
        from_secret: crowdin_key

  - name: update
    pull: default
    image: alpine:3.10
    commands:
      - mv ./options/locale/locale_en-US.ini ./options/
      - "sed -i -e 's/=\"/=/g' -e 's/\"$$//g' ./options/locale/*.ini"
      - "sed -i -e 's/\\\\\\\\\"/\"/g' ./options/locale/*.ini"
      - mv ./options/locale_en-US.ini ./options/locale/

  - name: push
    pull: always
    image: appleboy/drone-git-push
    settings:
      author_email: "teabot@gitea.io"
      author_name: GiteaBot
      commit: true
      commit_message: "[skip ci] Updated translations via Crowdin"
      remote: "git@github.com:go-gitea/gitea.git"
    environment:
      GIT_PUSH_SSH_KEY:
        from_secret: git_push_ssh_key

  - name: upload_translations
    pull: always
    image: jonasfranz/crowdin
    settings:
      files:
        locale_en-US.ini: options/locale/locale_en-US.ini
      ignore_branch: true
      project_identifier: gitea
    environment:
      CROWDIN_KEY:
        from_secret: crowdin_key

---
kind: pipeline
name: release-master

platform:
  os: linux
  arch: amd64

workspace:
  base: /go
  path: src/code.gitea.io/gitea

trigger:
  branch:
    - master
    - "release/*"
  event:
    - push

depends_on:
  - testing
  - translations

steps:
  - name: fetch-tags
    pull: default
    image: docker:git
    commands:
      - git fetch --tags --force

  - name: static
    pull: always
    image: techknowlogick/xgo:latest
    commands:
      - export PATH=$PATH:$GOPATH/bin
      - make generate
      - make release
    environment:
      GOPROXY: off
      TAGS: bindata sqlite sqlite_unlock_notify

  - name: gpg-sign
    pull: always
    image: plugins/gpgsign:1
    settings:
      detach_sign: true
      excludes:
        - "dist/release/*.sha256"
      files:
        - "dist/release/*"
    environment:
      GPGSIGN_KEY:
        from_secret: gpgsign_key
      GPGSIGN_PASSPHRASE:
        from_secret: gpgsign_passphrase
    depends_on:
      - static

  - name: release-branch-release
    pull: always
    image: plugins/s3:1
    settings:
      acl: public-read
      bucket: releases
      endpoint: https://storage.gitea.io
      path_style: true
      source: "dist/release/*"
      strip_prefix: dist/release/
      target: "/gitea/${DRONE_BRANCH##release/v}"
    environment:
      AWS_ACCESS_KEY_ID:
        from_secret: aws_access_key_id
      AWS_SECRET_ACCESS_KEY:
        from_secret: aws_secret_access_key
    depends_on:
      - gpg-sign
    when:
      branch:
        - "release/*"
      event:
        - push

  - name: release
    pull: always
    image: plugins/s3:1
    settings:
      acl: public-read
      bucket: releases
      endpoint: https://storage.gitea.io
      path_style: true
      source: "dist/release/*"
      strip_prefix: dist/release/
      target: /gitea/master
    environment:
      AWS_ACCESS_KEY_ID:
        from_secret: aws_access_key_id
      AWS_SECRET_ACCESS_KEY:
        from_secret: aws_secret_access_key
    depends_on:
      - gpg-sign
    when:
      branch:
        - master
      event:
        - push

---
kind: pipeline
name: release-version

platform:
  os: linux
  arch: amd64

workspace:
  base: /go
  path: src/code.gitea.io/gitea

trigger:
  event:
    - tag

depends_on:
  - testing

steps:
  - name: fetch-tags
    pull: default
    image: docker:git
    commands:
      - git fetch --tags --force

  - name: static
    pull: always
    image: techknowlogick/xgo:latest
    commands:
      - export PATH=$PATH:$GOPATH/bin
      - make generate
      - make release
    environment:
      GOPROXY: off
      TAGS: bindata sqlite sqlite_unlock_notify

  - name: gpg-sign
    pull: always
    image: plugins/gpgsign:1
    settings:
      detach_sign: true
      excludes:
        - "dist/release/*.sha256"
      files:
        - "dist/release/*"
    environment:
      GPGSIGN_KEY:
        from_secret: gpgsign_key
      GPGSIGN_PASSPHRASE:
        from_secret: gpgsign_passphrase
    depends_on:
      - static

  - name: release
    pull: always
    image: plugins/s3:1
    settings:
      acl: public-read
      bucket: releases
      endpoint: https://storage.gitea.io
      path_style: true
      source: "dist/release/*"
      strip_prefix: dist/release/
      target: "/gitea/${DRONE_TAG##v}"
    environment:
      AWS_ACCESS_KEY_ID:
        from_secret: aws_access_key_id
      AWS_SECRET_ACCESS_KEY:
        from_secret: aws_secret_access_key
    depends_on:
      - gpg-sign

  - name: github
    pull: always
    image: plugins/github-release:1
    settings:
      files:
        - "dist/release/*"
    environment:
      GITHUB_TOKEN:
        from_secret: github_token
    depends_on:
      - gpg-sign

---
kind: pipeline
name: docs

platform:
  os: linux
  arch: amd64

workspace:
  base: /go
  path: src/code.gitea.io/gitea

steps:
  - name: build-docs
    pull: always
    image: webhippie/hugo:latest
    commands:
      - cd docs
      - make trans-copy
      - make clean
      - make build

  - name: publish-docs
    pull: always
    image: lucap/drone-netlify:latest
    settings:
      path: docs/public/
      site_id: d2260bae-7861-4c02-8646-8f6440b12672
    environment:
      NETLIFY_TOKEN:
        from_secret: netlify_token
    when:
      branch:
        - master
      event:
        - push

---
kind: pipeline
name: docker-linux-amd64

platform:
  os: linux
  arch: amd64

workspace:
  base: /go
  path: src/code.gitea.io/gitea

depends_on:
  - testing

trigger:
  ref:
  - refs/heads/master
  - "refs/tags/**"
  - "refs/pull/**"

steps:
  - name: fetch-tags
    pull: default
    image: docker:git
    commands:
      - git fetch --tags --force
    when:
      event:
        exclude:
          - pull_request

  - name: dryrun
    pull: always
    image: plugins/docker:linux-amd64
    settings:
      dry_run: true
      repo: gitea/gitea
      tags: linux-amd64
      build_args:
        - GOPROXY=off
    when:
      event:
        - pull_request

  - name: publish
    pull: always
    image: plugins/docker:linux-amd64
    settings:
      auto_tag: true
      auto_tag_suffix: linux-amd64
      repo: gitea/gitea
      build_args:
        - GOPROXY=off
      password:
        from_secret: docker_password
      username:
        from_secret: docker_username
    when:
      event:
        exclude:
        - pull_request



---
kind: pipeline
name: docker-linux-arm64

platform:
  os: linux
  arch: arm64

workspace:
  base: /go
  path: src/code.gitea.io/gitea

depends_on:
  - testing

trigger:
  ref:
  - refs/heads/master
  - "refs/tags/**"
  - "refs/pull/**"

steps:
  - name: fetch-tags
    pull: default
    image: docker:git
    commands:
      - git fetch --tags --force
    when:
      event:
        exclude:
          - pull_request

  - name: dryrun
    pull: always
    image: plugins/docker:linux-arm64
    settings:
      dry_run: true
      repo: gitea/gitea
      tags: linux-arm64
      build_args:
        - GOPROXY=off
    when:
      event:
        - pull_request

  - name: publish
    pull: always
    image: plugins/docker:linux-arm64
    settings:
      auto_tag: true
      auto_tag_suffix: linux-arm64
      repo: gitea/gitea
      build_args:
        - GOPROXY=off
      password:
        from_secret: docker_password
      username:
        from_secret: docker_username
    when:
      event:
        exclude:
        - pull_request

---
kind: pipeline
name: docker-manifest

platform:
  os: linux
  arch: amd64

steps:
  - name: manifest
    pull: always
    image: plugins/manifest
    settings:
      auto_tag: true
      ignore_missing: true
      spec: docker/manifest.tmpl
      password:
        from_secret: docker_password
      username:
        from_secret: docker_username

trigger:
  ref:
  - refs/heads/master
  - "refs/tags/**"

depends_on:
  - docker-linux-amd64
  - docker-linux-arm64

---
kind: pipeline
name: notify

platform:
  os: linux
  arch: amd64

workspace:
  base: /go
  path: src/code.gitea.io/gitea

when:
  status:
    - success
    - failure

depends_on:
  - testing
  - translations
  - release-version
  - release-master
  - docker-linux-amd64
  - docker-linux-arm64
  - docker-manifest
  - docs

steps:
  - name: discord
    pull: always
    image: appleboy/drone-discord:1.0.0
    environment:
      DISCORD_WEBHOOK_ID:
        from_secret: discord_webhook_id
      DISCORD_WEBHOOK_TOKEN:
        from_secret: discord_webhook_token