version: "3"

# This taskfile is ideally meant to be project agnostic and could be dropped in
# on other Go projects with minimal or no changes.
#
# To use it simply add the following lines to your main taskfile:
#   includes:
#     dist: ./DistTasks.yml
#
# The following variables must be declared in the including taskfile for the
# build process to work correctly:
# * DIST_DIR: the folder that will contain the final binaries and packages
# * PROJECT_NAME: the name of the project, used in package name
# * VERSION: the version of the project, used in package name and checksum file
# * LD_FLAGS: flags used at build time
#
# The project MUST contain a LICENSE.txt file in the root folder or packaging will fail.

tasks:
  all:
    desc: Build for distribution for all platforms
    cmds:
      - task: Windows_32bit
      - task: Windows_64bit
      - task: Linux_32bit
      - task: Linux_64bit
      - task: Linux_ARMv6
      - task: Linux_ARMv7
      - task: Linux_ARM64
      - task: macOS_64bit

  Windows_32bit:
    desc: Builds Windows 32 bit binaries
    dir: "{{ .DIST_DIR }}"
    cmds:
      - |
        docker run -v `pwd`/..:/home/build -w /home/build \
        -e CGO_ENABLED=1 \
        {{ .CONTAINER }}:{{ .CONTAINER_TAG }} \
        --build-cmd "{{ .BUILD_COMMAND }}" \
        -p "{{ .BUILD_PLATFORM }}"

        zip {{ .PACKAGE_NAME}} {{ .PLATFORM_DIR }}/{{ .PROJECT_NAME }}.exe ../LICENSE.txt -j
        sha256sum {{ .PACKAGE_NAME }} >> {{ .CHECKSUM_FILE }}

    vars:
      PLATFORM_DIR: "{{ .PROJECT_NAME }}_windows_386"
      BUILD_COMMAND: "go build -o {{ .DIST_DIR }}/{{ .PLATFORM_DIR }}/{{ .PROJECT_NAME }}.exe {{ .LDFLAGS }}"
      BUILD_PLATFORM: "windows/386"
      CONTAINER_TAG: "{{ .GO_VERSION }}-main"
      PACKAGE_PLATFORM: "Windows_32bit"
      PACKAGE_NAME: "{{ .PROJECT_NAME }}_{{ .VERSION }}_{{ .PACKAGE_PLATFORM }}.zip"

  Windows_64bit:
    desc: Builds Windows 64 bit binaries
    dir: "{{ .DIST_DIR }}"
    cmds:
      - |
        docker run -v `pwd`/..:/home/build -w /home/build \
        -e CGO_ENABLED=1 \
        {{ .CONTAINER }}:{{ .CONTAINER_TAG }} \
        --build-cmd "{{ .BUILD_COMMAND }}" \
        -p "{{ .BUILD_PLATFORM }}"

        zip {{ .PACKAGE_NAME}} {{ .PLATFORM_DIR }}/{{ .PROJECT_NAME }}.exe ../LICENSE.txt -j
        sha256sum {{ .PACKAGE_NAME }} >> {{ .CHECKSUM_FILE }}

    vars:
      PLATFORM_DIR: "{{ .PROJECT_NAME }}_windows_amd64"
      BUILD_COMMAND: "go build -o {{ .DIST_DIR }}/{{ .PLATFORM_DIR }}/{{ .PROJECT_NAME }}.exe {{ .LDFLAGS }}"
      BUILD_PLATFORM: "windows/amd64"
      CONTAINER_TAG: "{{ .GO_VERSION }}-main"
      PACKAGE_PLATFORM: "Windows_64bit"
      PACKAGE_NAME: "{{ .PROJECT_NAME }}_{{ .VERSION }}_{{ .PACKAGE_PLATFORM }}.zip"

  Linux_32bit:
    desc: Builds Linux 32 bit binaries
    dir: "{{ .DIST_DIR }}"
    cmds:
      - |
        docker run -v `pwd`/..:/home/build -w /home/build \
        -e CGO_ENABLED=1 \
        {{ .CONTAINER }}:{{ .CONTAINER_TAG }} \
        --build-cmd "{{ .BUILD_COMMAND }}" \
        -p "{{ .BUILD_PLATFORM }}"

        tar cz -C {{ .PLATFORM_DIR }} {{ .PROJECT_NAME }} -C ../.. LICENSE.txt  -f {{ .PACKAGE_NAME }}
        sha256sum {{ .PACKAGE_NAME }} >> {{ .CHECKSUM_FILE }}

    vars:
      PLATFORM_DIR: "{{ .PROJECT_NAME }}_linux_amd32"
      BUILD_COMMAND: "go build -o {{ .DIST_DIR }}/{{ .PLATFORM_DIR }}/{{ .PROJECT_NAME }} {{ .LDFLAGS }}"
      BUILD_PLATFORM: "linux/386"
      CONTAINER_TAG: "{{ .GO_VERSION }}-main"
      PACKAGE_PLATFORM: "Linux_32bit"
      PACKAGE_NAME: "{{ .PROJECT_NAME }}_{{ .VERSION }}_{{ .PACKAGE_PLATFORM }}.tar.gz"

  Linux_64bit:
    desc: Builds Linux 64 bit binaries
    dir: "{{ .DIST_DIR }}"
    cmds:
      - |
        docker run -v `pwd`/..:/home/build -w /home/build \
        -e CGO_ENABLED=1 \
        {{ .CONTAINER }}:{{ .CONTAINER_TAG }} \
        --build-cmd "{{ .BUILD_COMMAND }}" \
        -p "{{ .BUILD_PLATFORM }}"

        tar cz -C {{ .PLATFORM_DIR }} {{ .PROJECT_NAME }} -C ../.. LICENSE.txt  -f {{ .PACKAGE_NAME }}
        sha256sum {{ .PACKAGE_NAME }} >> {{ .CHECKSUM_FILE }}

    vars:
      PLATFORM_DIR: "{{ .PROJECT_NAME }}_linux_amd64"
      BUILD_COMMAND: "go build -o {{ .DIST_DIR }}/{{ .PLATFORM_DIR }}/{{ .PROJECT_NAME }} {{ .LDFLAGS }}"
      BUILD_PLATFORM: "linux/amd64"
      CONTAINER_TAG: "{{ .GO_VERSION }}-main"
      PACKAGE_PLATFORM: "Linux_64bit"
      PACKAGE_NAME: "{{ .PROJECT_NAME }}_{{ .VERSION }}_{{ .PACKAGE_PLATFORM }}.tar.gz"

  Linux_ARMv7:
    desc: Builds Linux ARMv7 binaries
    dir: "{{ .DIST_DIR }}"
    cmds:
      - |
        docker run -v `pwd`/..:/home/build -w /home/build \
        -e CGO_ENABLED=1 \
        {{ .CONTAINER }}:{{ .CONTAINER_TAG }} \
        --build-cmd "{{ .BUILD_COMMAND }}" \
        -p "{{ .BUILD_PLATFORM }}"

        tar cz -C {{ .PLATFORM_DIR }} {{ .PROJECT_NAME }} -C ../.. LICENSE.txt  -f {{ .PACKAGE_NAME }}
        sha256sum {{ .PACKAGE_NAME }} >> {{ .CHECKSUM_FILE }}

    vars:
      PLATFORM_DIR: "{{ .PROJECT_NAME }}_linux_arm_7"
      BUILD_COMMAND: "go build -o {{ .DIST_DIR }}/{{ .PLATFORM_DIR }}/{{ .PROJECT_NAME }} {{ .LDFLAGS }}"
      BUILD_PLATFORM: "linux/armv7"
      CONTAINER_TAG: "{{ .GO_VERSION }}-arm"
      PACKAGE_PLATFORM: "Linux_ARMv7"
      PACKAGE_NAME: "{{ .PROJECT_NAME }}_{{ .VERSION }}_{{ .PACKAGE_PLATFORM }}.tar.gz"

  Linux_ARMv6:
    desc: Builds Linux ARMv6 binaries
    dir: "{{ .DIST_DIR }}"
    cmds:
      - |
        docker run -v `pwd`/..:/home/build -w /home/build \
        -e CGO_ENABLED=1 \
        {{ .CONTAINER }}:{{ .CONTAINER_TAG }} \
        --build-cmd "{{ .BUILD_COMMAND }}" \
        -p "{{ .BUILD_PLATFORM }}"

        tar cz -C {{ .PLATFORM_DIR }} {{ .PROJECT_NAME }} -C ../.. LICENSE.txt  -f {{ .PACKAGE_NAME }}
        sha256sum {{ .PACKAGE_NAME }} >> {{ .CHECKSUM_FILE }}

    vars:
      PLATFORM_DIR: "{{ .PROJECT_NAME }}_linux_arm_6"
      BUILD_COMMAND: "go build -o {{ .DIST_DIR }}/{{ .PLATFORM_DIR }}/{{ .PROJECT_NAME }} {{ .LDFLAGS }}"
      BUILD_PLATFORM: "linux/armv6"
      CONTAINER_TAG: "{{ .GO_VERSION }}-arm"
      PACKAGE_PLATFORM: "Linux_ARMv6"
      PACKAGE_NAME: "{{ .PROJECT_NAME }}_{{ .VERSION }}_{{ .PACKAGE_PLATFORM }}.tar.gz"

  Linux_ARM64:
    desc: Builds Linux ARM64 binaries
    dir: "{{ .DIST_DIR }}"
    cmds:
      - |
        docker run -v `pwd`/..:/home/build -w /home/build \
        -e CGO_ENABLED=1 \
        {{ .CONTAINER }}:{{ .CONTAINER_TAG }} \
        --build-cmd "{{ .BUILD_COMMAND }}" \
        -p "{{ .BUILD_PLATFORM }}"

        tar cz -C {{ .PLATFORM_DIR }} {{ .PROJECT_NAME }} -C ../.. LICENSE.txt  -f {{ .PACKAGE_NAME }}
        sha256sum {{ .PACKAGE_NAME }} >> {{ .CHECKSUM_FILE }}

    vars:
      PLATFORM_DIR: "{{ .PROJECT_NAME }}_linux_arm_6"
      BUILD_COMMAND: "go build -o {{ .DIST_DIR }}/{{ .PLATFORM_DIR }}/{{ .PROJECT_NAME }} {{ .LDFLAGS }}"
      BUILD_PLATFORM: "linux/arm64"
      CONTAINER_TAG: "{{ .GO_VERSION }}-arm"
      PACKAGE_PLATFORM: "Linux_ARM64"
      PACKAGE_NAME: "{{ .PROJECT_NAME }}_{{ .VERSION }}_{{ .PACKAGE_PLATFORM }}.tar.gz"

  macOS_64bit:
    desc: Builds Mac OS X 64 bit binaries
    dir: "{{ .DIST_DIR }}"
    cmds:
      - |
        docker run -v `pwd`/..:/home/build -w /home/build \
        -e CGO_ENABLED=1 \
        {{ .CONTAINER }}:{{ .CONTAINER_TAG }} \
        --build-cmd "{{ .BUILD_COMMAND }}" \
        -p "{{ .BUILD_PLATFORM }}"

        tar cz -C {{ .PLATFORM_DIR }} {{ .PROJECT_NAME }} -C ../.. LICENSE.txt  -f {{ .PACKAGE_NAME }}
        sha256sum {{ .PACKAGE_NAME }} >> {{ .CHECKSUM_FILE }}

    vars:
      PLATFORM_DIR: "{{ .PROJECT_NAME }}_osx_darwin_amd64"
      BUILD_COMMAND: "go build -o {{ .DIST_DIR }}/{{ .PLATFORM_DIR }}/{{ .PROJECT_NAME }} {{ .LDFLAGS }}"
      BUILD_PLATFORM: "darwin/amd64"
      CONTAINER_TAG: "{{ .GO_VERSION }}-darwin"
      PACKAGE_PLATFORM: "macOS_64bit"
      PACKAGE_NAME: "{{ .PROJECT_NAME }}_{{ .VERSION }}_{{ .PACKAGE_PLATFORM }}.tar.gz"

vars:
  CONTAINER: "docker.elastic.co/beats-dev/golang-crossbuild"
  GO_VERSION: "1.14.7"
  CHECKSUM_FILE: "{{ .VERSION }}-checksums.txt"
