name: windows_exporter CI/CD # Trigger on pull requests and releases # Deployments will only occur for releases (see `if` clauses in the build job). on: pull_request: branches: - master release: types: - published - edited permissions: contents: read packages: write jobs: test: runs-on: windows-2019 steps: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 with: go-version: '^1.17.5' - name: Test run: make test - name: Install e2e deps run: | go get github.com/prometheus/promu@v0.11.1 go get github.com/josephspurrier/goversioninfo/cmd/goversioninfo@v1.2.0 # GOPATH\bin dir must be appended to PATH else the `promu` command won't be found echo "$(go env GOPATH)\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - name: e2e Test run: make e2e-test lint: runs-on: windows-2022 steps: # `gofmt` linter run by golangci-lint fails on CRLF line endings (the default for Windows) - name: Set git to use LF run: | git config --global core.autocrlf false git config --global core.eol lf - uses: actions/checkout@v2 - uses: actions/setup-go@v2 with: go-version: '^1.17.5' - name: golangci-lint uses: golangci/golangci-lint-action@v2 with: version: v1.43 args: "--timeout=5m" # golangci-lint action doesn't always provide helpful output, so re-run without the action for # better output of the problem. # The cache from the golangci-lint step is re-used here, so this step should finish quickly. - name: errors if: ${{ failure() }} run: golangci-lint run --timeout=5m -c .golangci.yaml codespell: name: Check for spelling errors runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: codespell-project/actions-codespell@master with: check_filenames: true # When using this Action in other repos, the --skip option below can be removed skip: ./.git ignore_words_list: calle build: runs-on: windows-2022 needs: - test - lint - codespell steps: - uses: actions/checkout@v2 with: # fetch-depth required for gitversion in `Build` step fetch-depth: 0 - uses: actions/setup-go@v2 with: go-version: '^1.17.5' - name: Install Build deps run: | dotnet tool install --global GitVersion.Tool --version 5.* go get github.com/prometheus/promu@v0.11.1 go get github.com/josephspurrier/goversioninfo/cmd/goversioninfo@v1.2.0 # GOPATH\bin dir must be added to PATH else the `promu` and `goversioninfo` commands won't be found echo "$(go env GOPATH)\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - name: Build run: | $ErrorActionPreference = "Stop" dotnet-gitversion /output json /showvariable FullSemVer | Set-Content VERSION -PassThru $Version = Get-Content VERSION # Windows versioninfo resources need the file version by parts (but product version is free text) $VersionParts = ($Version -replace '^v?([0-9\.]+).*$','$1').Split(".") goversioninfo.exe -ver-major $VersionParts[0] -ver-minor $VersionParts[1] -ver-patch $VersionParts[2] -product-version $Version -platform-specific make crossbuild make build-all # GH requires all files to have different names, so add version/arch to differentiate foreach($Arch in "amd64","386") { Move-Item output\$Arch\windows_exporter.exe output\windows_exporter-$Version-$Arch.exe } - name: Upload Artifacts uses: actions/upload-artifact@v2 with: name: windows_exporter_binaries path: output\windows_exporter-*.exe - name: Build Release Artifacts if: startsWith(github.ref, 'refs/tags/') run: | $ErrorActionPreference = "Stop" $BuildVersion = Get-Content VERSION $TagName = $env:GITHUB_REF -replace 'refs/tags/', '' # The MSI version is not semver compliant, so just take the numerical parts $MSIVersion = $TagName -replace '^v?([0-9\.]+).*$','$1' foreach($Arch in "amd64","386") { Write-Verbose "Building windows_exporter $MSIVersion msi for $Arch" .\installer\build.ps1 -PathToExecutable .\output\windows_exporter-$BuildVersion-$Arch.exe -Version $MSIVersion -Arch "$Arch" Move-Item installer\Output\windows_exporter-$MSIVersion-$Arch.msi output\ } promu checksum output\ - name: Login to GitHub container registry if: startsWith(github.ref, 'refs/tags/') uses: docker/login-action@v1 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Push Latest image if: ${{ github.event_name != 'pull_request' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | VERSION=latest make push-all - name: Release if: startsWith(github.ref, 'refs/tags/') env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | $TagName = $env:GITHUB_REF -replace 'refs/tags/', '' Get-ChildItem -Path output\* -Include @('windows_exporter*.msi', 'windows_exporter*.exe', 'sha256sums.txt') | Foreach-Object {gh release upload $TagName $_} make push-all