From 6a1d522d012e5396ac0a0e4a1400ed8f45e0f146 Mon Sep 17 00:00:00 2001 From: James Bebbington Date: Mon, 22 Jun 2020 16:16:51 +1000 Subject: [PATCH] Added wix file and build step to create msi --- .circleci/config.yml | 29 ++++++++++- .gitignore | 4 ++ Makefile | 4 +- packaging/msi/make.ps1 | 53 ++++++++++++++++++++ packaging/msi/opentelemetry-collector.wxs | 56 ++++++++++++++++++++++ packaging/msi/opentelemetry.ico | Bin 0 -> 275598 bytes 6 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 packaging/msi/make.ps1 create mode 100644 packaging/msi/opentelemetry-collector.wxs create mode 100644 packaging/msi/opentelemetry.ico diff --git a/.circleci/config.yml b/.circleci/config.yml index 85ae9810040..96db399dee3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -73,7 +73,7 @@ workflows: only: /^v([0-9])+.([0-9])+.([0-9])+.*/ - cross-compile: requires: - - build + - setup-and-lint filters: tags: only: /^v([0-9])+.([0-9])+.([0-9])+.*/ @@ -101,6 +101,12 @@ workflows: filters: tags: only: /^v([0-9])+.([0-9])+.([0-9])+.*/ + - windows-msi: + requires: + - cross-compile + filters: + tags: + only: /^v([0-9])+.([0-9])+.([0-9])+.*/ - publish-stable: requires: - cross-compile @@ -109,6 +115,7 @@ workflows: - gosec - coverage - windows-test + - windows-msi filters: branches: ignore: /.*/ @@ -122,6 +129,7 @@ workflows: - gosec - coverage - windows-test + - windows-msi filters: branches: only: master @@ -284,3 +292,22 @@ jobs: command: | sudo npm install -g markdown-link-check bash .circleci/check-links/check-links.sh + + windows-msi: + executor: + name: win/default + shell: powershell.exe + steps: + - attach_to_workspace + - run: + name: Install Wix Toolset + command: .\packaging\msi\make.ps1 Install-Tools + - run: + name: Build MSI + command: .\packaging\msi\make.ps1 New-MSI + - run: + name: Validate MSI + command: .\packaging\msi\make.ps1 Confirm-MSI + - persist_to_workspace: + root: ~/ + paths: project/bin diff --git a/.gitignore b/.gitignore index 41fd25b4ea3..44b2a015653 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,7 @@ coverage.txt coverage_all.txt coverage_old.txt coverage.html + +# Wix +*.wixobj +*.wixpdb diff --git a/Makefile b/Makefile index 7292906b9b0..52675408117 100644 --- a/Makefile +++ b/Makefile @@ -146,7 +146,7 @@ install-tools: .PHONY: otelcol otelcol: - GO111MODULE=on CGO_ENABLED=0 go build -o ./bin/otelcol_$(GOOS)_$(GOARCH) $(BUILD_INFO) ./cmd/otelcol + GO111MODULE=on CGO_ENABLED=0 go build -o ./bin/otelcol_$(GOOS)_$(GOARCH)$(EXTENSION) $(BUILD_INFO) ./cmd/otelcol .PHONY: run run: @@ -201,7 +201,7 @@ binaries-linux_arm64: .PHONY: binaries-windows_amd64 binaries-windows_amd64: - GOOS=windows GOARCH=amd64 $(MAKE) binaries + GOOS=windows GOARCH=amd64 EXTENSION=.exe $(MAKE) binaries # Definitions for ProtoBuf generation. diff --git a/packaging/msi/make.ps1 b/packaging/msi/make.ps1 new file mode 100644 index 00000000000..61164b8c41c --- /dev/null +++ b/packaging/msi/make.ps1 @@ -0,0 +1,53 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +<# +.SYNOPSIS + Makefile like build commands for the Collector on Windows. + + Usage: .\make.ps1 [- ...] + Example: .\make.ps1 New-MSI -Config "./my-config.yaml" +.PARAMETER Target + Build target to run (Install-Tools, New-MSI) +#> +Param( + [Parameter(Mandatory=$true, ValueFromRemainingArguments=$true)][string]$Target +) + +$ErrorActionPreference = "Stop" + +function Install-Tools { + choco install wixtoolset -y + setx /m PATH "%PATH%;C:\Program Files (x86)\WiX Toolset v3.11\bin" + refreshenv +} + +function New-MSI( + [string]$Config="./examples/otel-local-config.yaml" +) { + $Version = If($env:VERSION) { $env:VERSION } else { "0.0.1" } + candle -arch x64 -dVersion="$Version" -dConfig="$Config" packaging/msi/opentelemetry-collector.wxs + light opentelemetry-collector.wixobj + Move-Item -Force opentelemetry-collector.msi bin/opentelemetry-collector.msi +} + +function Confirm-MSI { + msiexec /i bin/opentelemetry-collector.msi /qn + Stop-Service otelcol + Start-Service otelcol + msiexec /x bin/opentelemetry-collector.msi /qn +} + +$sb = [scriptblock]::create("$Target") +Invoke-Command -ScriptBlock $sb diff --git a/packaging/msi/opentelemetry-collector.wxs b/packaging/msi/opentelemetry-collector.wxs new file mode 100644 index 00000000000..0d276d99a61 --- /dev/null +++ b/packaging/msi/opentelemetry-collector.wxs @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CONFIG AND NOT Installed + + + diff --git a/packaging/msi/opentelemetry.ico b/packaging/msi/opentelemetry.ico new file mode 100644 index 0000000000000000000000000000000000000000..9bdd4cf54e47f7fc7689dd285742eeff87ef9fd3 GIT binary patch literal 275598 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 YaaqN$u0JDM!SsZ+{N<-zBj2S8QZl>h($ literal 0 HcmV?d00001