diff --git a/.ci/release.gitlab-ci.yml b/.ci/release.gitlab-ci.yml index 5c7c53b2..8bafffe1 100644 --- a/.ci/release.gitlab-ci.yml +++ b/.ci/release.gitlab-ci.yml @@ -77,7 +77,7 @@ release-cloudflared-to-github: - ci-image-get-image-ref - linux-packaging - linux-packaging-fips - - package-windows + - windows-package-sign script: - ./.ci/scripts/release-target.sh github-release diff --git a/.ci/scripts/windows/builds.ps1 b/.ci/scripts/windows/builds.ps1 index e4a42ea2..3abae290 100644 --- a/.ci/scripts/windows/builds.ps1 +++ b/.ci/scripts/windows/builds.ps1 @@ -4,6 +4,7 @@ $ProgressPreference = "SilentlyContinue" $env:TARGET_OS = "windows" $env:LOCAL_OS = "windows" +$TIMESTAMP_RFC3161 = "http://timestamp.digicert.com" New-Item -Path ".\artifacts" -ItemType Directory @@ -13,6 +14,8 @@ $env:LOCAL_ARCH = "amd64" $env:CGO_ENABLED = 1 & make cloudflared if ($LASTEXITCODE -ne 0) { throw "Failed to build cloudflared for amd64" } +# Sign build +azuresigntool.exe sign -kvu $env:KEY_VAULT_URL -kvi "$env:KEY_VAULT_CLIENT_ID" -kvs "$env:KEY_VAULT_SECRET" -kvc "$env:KEY_VAULT_CERTIFICATE" -kvt "$env:KEY_VAULT_TENANT_ID" -tr "$TIMESTAMP_RFC3161" -d "Cloudflare Tunnel Daemon" .\cloudflared.exe copy .\cloudflared.exe .\artifacts\cloudflared-windows-amd64.exe Write-Output "Building for 386" @@ -21,4 +24,6 @@ $env:LOCAL_ARCH = "386" $env:CGO_ENABLED = 0 & make cloudflared if ($LASTEXITCODE -ne 0) { throw "Failed to build cloudflared for 386" } +## Sign build +azuresigntool.exe sign -kvu $env:KEY_VAULT_URL -kvi "$env:KEY_VAULT_CLIENT_ID" -kvs "$env:KEY_VAULT_SECRET" -kvc "$env:KEY_VAULT_CERTIFICATE" -kvt "$env:KEY_VAULT_TENANT_ID" -tr "$TIMESTAMP_RFC3161" -d "Cloudflare Tunnel Daemon" .\cloudflared.exe copy .\cloudflared.exe .\artifacts\cloudflared-windows-386.exe diff --git a/.ci/scripts/windows/sign-msi.ps1 b/.ci/scripts/windows/sign-msi.ps1 new file mode 100644 index 00000000..9f29cd79 --- /dev/null +++ b/.ci/scripts/windows/sign-msi.ps1 @@ -0,0 +1,26 @@ +# Sign Windows artifacts using azuretool +# This script processes MSI files from the artifacts directory + +$ErrorActionPreference = "Stop" + +# Define paths +$ARTIFACT_DIR = "artifacts" +$TIMESTAMP_RFC3161 = "http://timestamp.digicert.com" + +Write-Host "Looking for Windows artifacts to sign in $ARTIFACT_DIR..." + +# Find all Windows MSI files +$msiFiles = Get-ChildItem -Path $ARTIFACT_DIR -Filter "cloudflared-windows-*.msi" -ErrorAction SilentlyContinue + +if ($msiFiles.Count -eq 0) { + Write-Host "No Windows MSI files found in $ARTIFACT_DIR" + exit 1 +} + +Write-Host "Found $($msiFiles.Count) file(s) to sign:" +foreach ($file in $msiFiles) { + Write-Host "Running azuretool sign for $($file.Name)" + azuresigntool.exe sign -kvu $env:KEY_VAULT_URL -kvi "$env:KEY_VAULT_CLIENT_ID" -kvs "$env:KEY_VAULT_SECRET" -kvc "$env:KEY_VAULT_CERTIFICATE" -kvt "$env:KEY_VAULT_TENANT_ID" -tr "$TIMESTAMP_RFC3161" -d "Cloudflare Tunnel Daemon" .\\$ARTIFACT_DIR\\$($file.Name) +} + +Write-Host "Signing process completed" diff --git a/.ci/windows.gitlab-ci.yml b/.ci/windows.gitlab-ci.yml index 9a35edb6..4a1bb35a 100644 --- a/.ci/windows.gitlab-ci.yml +++ b/.ci/windows.gitlab-ci.yml @@ -14,7 +14,7 @@ include: ########################################## ### Build Cloudflared Windows Binaries ### ########################################## -build-cloudflared-windows: +windows-build-cloudflared: <<: *windows-build-defaults stage: build script: @@ -26,7 +26,7 @@ build-cloudflared-windows: ###################################################### ### Load Environment Variables for Component Tests ### ###################################################### -load-windows-env-variables: +windows-load-env-variables: stage: pre-build extends: .component-tests script: @@ -35,8 +35,29 @@ load-windows-env-variables: - echo "DNS_API_TOKEN=$DNS_API_TOKEN" >> windows.env # We have to encode the `COMPONENT_TESTS_ORIGINCERT` secret, because it content is a file, otherwise we can't export it using gitlab - echo "COMPONENT_TESTS_ORIGINCERT=$(echo "$COMPONENT_TESTS_ORIGINCERT" | base64 -w0)" >> windows.env + - echo "KEY_VAULT_URL=$KEY_VAULT_URL" >> windows.env + - echo "KEY_VAULT_CLIENT_ID=$KEY_VAULT_CLIENT_ID" >> windows.env + - echo "KEY_VAULT_TENANT_ID=$KEY_VAULT_TENANT_ID" >> windows.env + - echo "KEY_VAULT_SECRET=$KEY_VAULT_SECRET" >> windows.env + - echo "KEY_VAULT_CERTIFICATE=$KEY_VAULT_CERTIFICATE" >> windows.env variables: COMPONENT_TESTS_CONFIG_CONTENT: Y2xvdWRmbGFyZWRfYmluYXJ5OiAuL2Nsb3VkZmxhcmVkLmV4ZQpjcmVkZW50aWFsc19maWxlOiBjcmVkLmpzb24Kb3JpZ2luY2VydDogY2VydC5wZW0Kem9uZV9kb21haW46IGFyZ290dW5uZWx0ZXN0LmNvbQp6b25lX3RhZzogNDg3OTZmMWU3MGJiNzY2OWMyOWJiNTFiYTI4MmJmNjU= + secrets: + KEY_VAULT_URL: + vault: gitlab/cloudflare/tun/cloudflared/_dev/azure_vault/app_info/key_vault_url@kv + file: false + KEY_VAULT_CLIENT_ID: + vault: gitlab/cloudflare/tun/cloudflared/_dev/azure_vault/app_info/key_vault_client_id@kv + file: false + KEY_VAULT_TENANT_ID: + vault: gitlab/cloudflare/tun/cloudflared/_dev/azure_vault/app_info/key_vault_tenant_id@kv + file: false + KEY_VAULT_SECRET: + vault: gitlab/cloudflare/tun/cloudflared/_dev/azure_vault/secret/key_vault_secret@kv + file: false + KEY_VAULT_CERTIFICATE: + vault: gitlab/cloudflare/tun/cloudflared/_dev/azure_vault/certificate/key_vault_certificate@kv + file: false artifacts: access: 'none' reports: @@ -45,12 +66,12 @@ load-windows-env-variables: ################################### ### Run Windows Component Tests ### ################################### -component-tests-cloudflared-windows: +windows-component-tests-cloudflared: <<: *windows-build-defaults stage: test - needs: ["load-windows-env-variables"] + needs: ["windows-load-env-variables"] script: - # We have to decode the secret we encoded on the `load-windows-env-variables` job + # We have to decode the secret we encoded on the `windows-load-env-variables` job - $env:COMPONENT_TESTS_ORIGINCERT = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($env:COMPONENT_TESTS_ORIGINCERT)) - powershell -ExecutionPolicy Bypass -File ".\.ci\scripts\windows\go-wrapper.ps1" "${GO_VERSION}" ".\.ci\scripts\windows\component-test.ps1" artifacts: @@ -60,13 +81,13 @@ component-tests-cloudflared-windows: ################################ ### Package Windows Binaries ### ################################ -package-windows: +windows-package: rules: - !reference [.default-rules, run-on-master] stage: package needs: - ci-image-get-image-ref - - build-cloudflared-windows + - windows-build-cloudflared image: $BUILD_IMAGE script: - .ci/scripts/package-windows.sh @@ -74,3 +95,20 @@ package-windows: artifacts: paths: - artifacts/* + +############################# +### Sign Windows Binaries ### +############################# +windows-package-sign: + <<: *windows-build-defaults + rules: + - !reference [.default-rules, run-on-master] + stage: package + needs: + - windows-package + - windows-load-env-variables + script: + - powershell -ExecutionPolicy Bypass -File ".\.ci\scripts\windows\sign-msi.ps1" + artifacts: + paths: + - artifacts/*