---
name: build_vault

# This workflow is intended to be called by the build workflow for each Vault
# binary that needs to be built and packaged. The ci make targets that are
# utilized automatically determine build metadata and handle building and
# packing vault.

on:
  workflow_call:
    inputs:
      bundle-path:
        required: false
        type: string
      cgo-enabled:
        type: string
        default: 0
      create-packages:
        type: boolean
        default: true
      goos:
        required: true
        type: string
      goarch:
        required: true
        type: string
      go-tags:
        type: string
      package-name:
        type: string
        default: vault
      vault-version:
        type: string
        required: true
      web-ui-cache-key:
        type: string
        required: true

jobs:
  build:
    runs-on: custom-linux-xl-vault-latest
    name: Vault ${{ inputs.goos }} ${{ inputs.goarch }} v${{ inputs.vault-version }}
    steps:
      - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
      - uses: ./.github/actions/set-up-go
        with:
          github-token: ${{ secrets.ELEVATED_GITHUB_TOKEN }}
      - name: Restore UI from cache
        uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1
        with:
          # Restore the UI asset from the UI build workflow. Never use a partial restore key.
          enableCrossOsArchive: true
          fail-on-cache-miss: true
          path: http/web_ui
          key: ${{ inputs.web-ui-cache-key }}
      - name: Build Vault
        env:
          CGO_ENABLED: ${{ inputs.cgo-enabled }}
          GOARCH: ${{ inputs.goarch }}
          GOOS: ${{ inputs.goos }}
          GO_TAGS: ${{ inputs.go-tags }}
        run: make ci-build
      - name: Determine artifact basename
        env:
          GOARCH: ${{ inputs.goarch }}
          GOOS: ${{ inputs.goos }}
        run: echo "ARTIFACT_BASENAME=$(make ci-get-artifact-basename)" >> "$GITHUB_ENV"
      - name: Bundle Vault
        env:
          BUNDLE_PATH: out/${{ env.ARTIFACT_BASENAME }}.zip
        run: make ci-bundle
      - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
        with:
          name: ${{ env.ARTIFACT_BASENAME }}.zip
          path: out/${{ env.ARTIFACT_BASENAME }}.zip
          if-no-files-found: error
      - if: ${{ inputs.create-packages }}
        uses: hashicorp/actions-packaging-linux@v1
        with:
          name: ${{ github.event.repository.name }}
          description: Vault is a tool for secrets management, encryption as a service, and privileged access management.
          arch: ${{ inputs.goarch }}
          version: ${{ inputs.vault-version }}
          maintainer: HashiCorp
          homepage: https://github.com/hashicorp/vault
          license: MPL-2.0
          binary: dist/${{ inputs.package-name }}
          deb_depends: openssl
          rpm_depends: openssl
          config_dir: .release/linux/package/
          preinstall: .release/linux/preinst
          postinstall: .release/linux/postinst
          postremove: .release/linux/postrm
      - if: ${{ inputs.create-packages }}
        name: Determine package file names
        run: |
          echo "RPM_PACKAGE=$(basename out/*.rpm)" >> "$GITHUB_ENV"
          echo "DEB_PACKAGE=$(basename out/*.deb)" >> "$GITHUB_ENV"
      - if: ${{ inputs.create-packages }}
        uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
        with:
          name: ${{ env.RPM_PACKAGE }}
          path: out/${{ env.RPM_PACKAGE }}
          if-no-files-found: error
      - if: ${{ inputs.create-packages }}
        uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
        with:
          name: ${{ env.DEB_PACKAGE }}
          path: out/${{ env.DEB_PACKAGE }}
          if-no-files-found: error
