name: Build and Release

on:
  workflow_dispatch:
    inputs:
      version:
        description: 'Netmaker version'
        required: true
  release:
    types: [published]

jobs:
  version:
    runs-on: ubuntu-latest
    outputs:
      tag: ${{ steps.echo.outputs.tag }}
      version: ${{ steps.echo.outputs.version }}
    steps:
      - name: Get Version Number
        run: |
          if [[ -n "${{ github.event.inputs.version }}" ]]; then
            NETMAKER_VERSION=${{ github.event.inputs.version }}
          else
            NETMAKER_VERSION=$(curl -fsSL https://api.github.com/repos/gravitl/netmaker/tags | grep 'name' | head -1 | cut -d'"' -f4)
          fi
          echo "NETMAKER_VERSION=${NETMAKER_VERSION}" >> $GITHUB_ENV
          # remove everything but digits and . for package (deb, rpm, etc) versions
          PACKAGE_VERSION=$(echo ${NETMAKER_VERSION} | tr -cd '[:digit:].')
          echo "PACKAGE_VERSION=${PACKAGE_VERSION}" >> $GITHUB_ENV
      - name: Echo
        id: echo
        run: |
          echo ${{ env.NETMAKER_VERSION }}
          echo ${{ env.PACKAGE_VERSION }}
          if [[ -z ${{ env.NETMAKER_VERSION }} || -z ${{ env.PACKAGE_VERSION }} ]]
          then
            exit 1
          fi
          echo "::set-output name=tag::${{ env.NETMAKER_VERSION }}"
          echo "::set-output name=version::${{ env.PACKAGE_VERSION }}"
  netmaker:
    runs-on: ubuntu-latest
    needs: version
    steps:
      - name: set variables
        run: |
          echo ${{ needs.version.outputs.tag }} ${{ needs.version.outputs.version }}
          TAG=${{needs.version.outputs.tag}}
          VERSION=${{needs.version.outputs.version}}
          if [[ -z ${VERSION} || -z ${TAG} ]]; then
            exit 1
          fi
          echo "NETMAKER_VERSION=${TAG}"  >> $GITHUB_ENV
          echo "PACKAGE_VERSION=${VERSION}" >> $GITHUB_ENV
      - name: Checkout
        uses: actions/checkout@v2
      - name: Setup go
        uses: actions/setup-go@v2
        with:
          go-version: 1.18
      - name: Build
        run: |
          env CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -ldflags="-X 'main.version=${NETMAKER_VERSION}'" -o build/netmaker main.go
      - name: Upload netmaker x86 to Release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: build/netmaker
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netmaker

  netclient-x86:
    runs-on: ubuntu-latest
    needs: version
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set Variables
        run: |
          TAG=${{needs.version.outputs.tag}}
          VERSION=${{needs.version.outputs.version}}
          echo "NETMAKER_VERSION=${TAG}"  >> $GITHUB_ENV
          echo "PACKAGE_VERSION=${VERSION}" >> $GITHUB_ENV
      - name: Setup go
        uses: actions/setup-go@v2
        with:
          go-version: 1.18

      - name: Build cli
        run: |
          cd netclient
          env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-X 'main.version=${NETMAKER_VERSION}'" -o build/netclient main.go

      - name: Upload netclient x86 to Release
        continue-on-error: true
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient/build/netclient
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient

      - name: build gui
        run: |
          sudo apt-get install -y gcc libgl1-mesa-dev xorg-dev
          go build -tags=gui -ldflags="-X 'main.version=${NETMAKER_VERSION}'" -o build/netclient-gui .

      - name: Upload netclient x86 gui to Release
        continue-on-error: true
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient/build/netclient-gui
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-gui

      - name: Package x86 deb
        continue-on-error: true
        uses: gravitl/github-action-fpm@master
        with:
          fpm_args: './netclient/build/netclient=/sbin/netclient ./netclient/build/netclient.service=/lib/systemd/system/netclient.service'
          fpm_opts: '-s dir -t deb --architecture amd64 --version ${{ env.PACKAGE_VERSION }}'

      - name: Upload x86 deb to Release
        continue-on-error: true
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient_${{ env.PACKAGE_VERSION }}_amd64.deb
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient_${{ env.PACKAGE_VERSION }}_amd64.deb

      - name: Package x86 rpm
        continue-on-error: true
        uses: gravitl/github-action-fpm@master
        with:
          fpm_args: './netclient/build/netclient=/sbin/netclient ./netclient/build/netclient.service=/lib/systemd/system/netclient.service'
          fpm_opts: '-s dir -t rpm --architecture amd64 --version ${{ env.PACKAGE_VERSION }}'

      - name: Upload x86 rpm to Release
        continue-on-error: true
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient-${{ env.PACKAGE_VERSION }}-1.x86_64.rpm
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-${{ env.PACKAGE_VERSION }}-1.x86_64.rpm

      - name: Package x86 pacman
        continue-on-error: true
        uses: gravitl/github-action-fpm@master
        with:
          # arch has particular path requirements --- cannot write to a symbolic link e.g. /sbin and /lib
          fpm_args: './netclient/build/netclient=/usr/bin/netclient ./netclient/build/netclient.service=/usr/lib/systemd/system/netclient.service'
          fpm_opts: '-s dir -t pacman --architecture amd64 --version ${{ env.PACKAGE_VERSION }}'

      - name: Upload x86 pacman to Release
        continue-on-error: true
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient-${{ env.PACKAGE_VERSION }}-1-x86_64.pkg.tar.zst
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-${{ env.PACKAGE_VERSION }}-1-x86_64.pkg.tar.zst

  netclient-arm:
    runs-on: ubuntu-latest
    needs: version
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set Variables
        run: |
          TAG=${{needs.version.outputs.tag}}
          VERSION=${{needs.version.outputs.version}}
          echo "NETMAKER_VERSION=${TAG}"  >> $GITHUB_ENV
          echo "PACKAGE_VERSION=${VERSION}" >> $GITHUB_ENV
      - name: Setup go
        uses: actions/setup-go@v2
        with:
          go-version: 1.18
      - name: Build
        run: |
          cd netclient
          env CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -ldflags="-X 'main.version=${NETMAKER_VERSION}'" -o build/netclient-arm5/netclient main.go
          env CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -ldflags="-X 'main.version=${NETMAKER_VERSION}'" -o build/netclient-arm6/netclient main.go
          env CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags="-X 'main.version=${NETMAKER_VERSION}'" -o build/netclient-arm7/netclient main.go
          env CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-X 'main.version=${NETMAKER_VERSION}'" -o build/netclient-arm64/netclient main.go

      - name: Upload arm5 to Release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient/build/netclient-arm5/netclient
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-arm5

      - name: Upload arm6 to Release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient/build/netclient-arm6/netclient
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-arm6

      - name: Upload arm7 to Release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient/build/netclient-arm7/netclient
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-arm7

      - name: Upload arm64 to Release
        continue-on-error: true
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient/build/netclient-arm64/netclient
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-arm64

      - name: Package arm64 deb
        continue-on-error: true
        uses: gravitl/github-action-fpm@master
        with:
          fpm_args: './netclient/build/netclient-arm64/netclient=/sbin/netclient ./netclient/build/netclient.service=/lib/systemd/netclient.service'
          fpm_opts: '-s dir -t deb --architecture arm64 --version ${{ env.PACKAGE_VERSION }}'
      - name: Upload arm deb to Release
        continue-on-error: true
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient_${{ env.PACKAGE_VERSION }}_arm64.deb
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient_${{ env.PACKAGE_VERSION }}_arm64.deb

      - name: Package arm64 rpm
        continue-on-error: true
        uses: gravitl/github-action-fpm@master
        with:
          fpm_args: './netclient/build/netclient-arm64/netclient=/sbin/netclient ./netclient/build/netclient.service=/lib/systemd/netclient.service'
          fpm_opts: '-s dir -t rpm --architecture arm64 --version ${{ env.PACKAGE_VERSION }}'

      - name: Upload arm64 rpm to Release
        continue-on-error: true
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient-${{ env.PACKAGE_VERSION }}-1.aarch64.rpm
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-${{ env.PACKAGE_VERSION }}-1.aarch64.rpm

  netclient-mipsle:
    runs-on: ubuntu-latest
    needs: version
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set Variables
        run: |
          TAG=${{needs.version.outputs.tag}}
          VERSION=${{needs.version.outputs.version}}
          echo "NETMAKER_VERSION=${TAG}"  >> $GITHUB_ENV
          echo "PACKAGE_VERSION=${VERSION}" >> $GITHUB_ENV
      - name: Setup go
        uses: actions/setup-go@v2
        with:
          go-version: 1.18
      - name: Build
        run: |
          cd netclient
          env CGO_ENABLED=0 GOOS=linux GOARCH=mipsle go build -ldflags "-s -w -X 'main.version=$NETMAKER_VERSION'" -o build/netclient-mipsle/netclient main.go && upx build/netclient-mipsle/netclient

      - name: Upload mipsle to Release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient/build/netclient-mipsle/netclient
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-mipsle

  netclient-freebsd:
    runs-on: ubuntu-latest
    needs: version
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set Variables
        run: |
          TAG=${{needs.version.outputs.tag}}
          VERSION=${{needs.version.outputs.version}}
          echo "NETMAKER_VERSION=${TAG}"  >> $GITHUB_ENV
          echo "PACKAGE_VERSION=${VERSION}" >> $GITHUB_ENV
      - name: Setup go
        uses: actions/setup-go@v2
        with:
          go-version: 1.18
      - name: Build
        run: |
          cd netclient
          env CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags="-X 'main.Version=${NETMAKER_VERSION}'" -o build/netclient-freebsd/netclient main.go
          env CGO_ENABLED=0 GOOS=freebsd GOARCH=arm GOARM=5 go build -ldflags="-X 'main.version=${NETMAKER_VERSION}'" -o build/netclient-freebsd-arm5/netclient main.go
          env CGO_ENABLED=0 GOOS=freebsd GOARCH=arm GOARM=6 go build -ldflags="-X 'main.version=${NETMAKER_VERSION}'" -o build/netclient-freebsd-arm6/netclient main.go
          env CGO_ENABLED=0 GOOS=freebsd GOARCH=arm GOARM=7 go build -ldflags="-X 'main.version=${NETMAKER_VERSION}'" -o build/netclient-freebsd-arm7/netclient main.go
          env CGO_ENABLED=0 GOOS=freebsd GOARCH=arm64 go build -ldflags="-X 'main.version=${NETMAKER_VERSION}'" -o build/netclient-freebsd-arm64/netclient main.go

      - name: Upload freebsd to Release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient/build/netclient-freebsd/netclient
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-freebsd

      - name: Upload freebsd-arm5 to Release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient/build/netclient-freebsd-arm5/netclient
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-freebsd-arm5

      - name: Upload freebsd-arm6 to Release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient/build/netclient-freebsd-arm6/netclient
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-freebsd-arm6

      - name: Upload freebsd-arm7 to Release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient/build/netclient-freebsd-arm7/netclient
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-freebsd-arm7

      - name: Upload freebsd-arm64 to Release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient/build/netclient-freebsd-arm64/netclient
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-freebsd-arm64

  netclient-darwin:
    runs-on: macos-latest
    needs: version
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set Variables
        run: |
          TAG=${{needs.version.outputs.tag}}
          VERSION=${{needs.version.outputs.version}}
          echo "NETMAKER_VERSION=${TAG}"  >> $GITHUB_ENV
          echo "PACKAGE_VERSION=${VERSION}" >> $GITHUB_ENV
      - name: Setup go
        uses: actions/setup-go@v2
        with:
          go-version: 1.18
      - name: Build
        run: |
          cd netclient
          env GOOS=darwin GOARCH=amd64 go build -tags=gui -ldflags="-X 'main.version=${NETMAKER_VERSION}'" -o build/netclient-darwin/netclient .
          env CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 go build -tags=gui -ldflags="-X 'main.version=${NETMAKER_VERSION}'" -o build/netclient-darwin-arm64/netclient main.go
      - name: Upload darwin-amd64 to Release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient/build/netclient-darwin/netclient
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-darwin

      - name: Upload darwin-arm64 to Release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient/build/netclient-darwin-arm64/netclient
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient-darwin-arm64

  netclient-windows:
    runs-on: windows-latest
    needs: version
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set Variables
        run: |
          TAG=${{needs.version.outputs.tag}}
          VERSION=${{needs.version.outputs.version}}
          echo "NETMAKER_VERSION=${TAG}"  >> $GITHUB_ENV
          echo "PACKAGE_VERSION=${VERSION}" >> $GITHUB_ENV
        shell: bash
      - name: Setup go
        uses: actions/setup-go@v3
        with:
          go-version: 1.18
      - name: Mysys2 setup
        uses: msys2/setup-msys2@v2
        with:
          install: >-
            git
            mingw-w64-x86_64-toolchain
      - name: Build
        run: |
          echo $(go env GOPATH)/bin >> $GITHUB_PATH
          cd netclient
          go get -v github.com/josephspurrier/goversioninfo
          go install -v github.com/josephspurrier/goversioninfo/cmd/goversioninfo
          go generate
          go build -tags=gui -ldflags="-X 'main.version=${NETMAKER_VERSION}'" -o build/netclient.exe .

      - name: Upload netclient windows to Release
        continue-on-error: true
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: netclient/build/netclient.exe
          tag: ${{ env.NETMAKER_VERSION }}
          overwrite: true
          prerelease: true
          asset_name: netclient.exe

  linux-packages:
    runs-on: ubuntu-latest
    needs: [version, netclient-x86, netclient-arm]
    steps:
      - name: Repository Dispatch
        uses: peter-evans/repository-dispatch@v2.0.0
        with:
          token: ${{ secrets.PERS_TOKEN_FOR_NETMAKER_DEVOPS}}
          repository: gravitl/netmaker-devops
          event-type: build-packages
          client-payload: '{"VERSION": "${{ env.PACKAGE_VERSION }}"}'
