[release/v7.5]Convert powershell/PowerShell-CI-linux to GitHub Actions (#24946)

This commit is contained in:
Travis Plunk
2025-02-05 11:32:01 -08:00
committed by GitHub
parent cf8256680c
commit 5492f07de0
7 changed files with 425 additions and 68 deletions
@@ -0,0 +1,95 @@
name: linux_packaging
description: 'Test very basic Linux packaging'
# This isn't working yet
# It fails with
# ERROR: While executing gem ... (Gem::FilePermissionError)
# You don't have write permissions for the /var/lib/gems/2.7.0 directory.
# WARNING: Installation of gem dotenv 2.8.1 failed! Must resolve manually.
runs:
using: composite
steps:
- name: Capture Environment
if: success() || failure()
run: 'Get-ChildItem -Path env: | Out-String -width 9999 -Stream | write-Verbose -Verbose'
shell: pwsh
- name: Download Build Artifacts
uses: actions/download-artifact@v4
with:
path: "${{ github.workspace }}"
- name: Capture Artifacts Directory
continue-on-error: true
run: Get-ChildItem "${{ github.workspace }}/build/*" -Recurse
shell: pwsh
- name: Bootstrap
run: |-
Import-Module ./build.psm1
Start-PSBootstrap -Package
shell: pwsh
- name: Capture Artifacts Directory
continue-on-error: true
run: Import-Module ./build.psm1
shell: pwsh
- name: Extract Files
uses: actions/github-script@v7.0.0
env:
DESTINATION_FOLDER: "${{ github.workspace }}/bins"
ARCHIVE_FILE_PATTERNS: "${{ github.workspace }}/build/build.zip"
with:
script: |-
const fs = require('fs').promises
const path = require('path')
const target = path.resolve(process.env.DESTINATION_FOLDER)
const patterns = process.env.ARCHIVE_FILE_PATTERNS
const globber = await glob.create(patterns)
await io.mkdirP(path.dirname(target))
for await (const file of globber.globGenerator()) {
if ((await fs.lstat(file)).isDirectory()) continue
await exec.exec(`7z x ${file} -o${target} -aoa`)
}
- name: Fix permissions
continue-on-error: true
run: |-
find "${{ github.workspace }}/bins" -type d -exec chmod +rwx {} \;
find "${{ github.workspace }}/bins" -type f -exec chmod +rw {} \;
shell: bash
- name: Capture Extracted Build ZIP
continue-on-error: true
run: Get-ChildItem "${{ github.workspace }}/bins/*" -Recurse -ErrorAction SilentlyContinue
shell: pwsh
- name: Packaging Tests
if: success()
run: |-
Import-Module ./tools/ci.psm1
Restore-PSOptions -PSOptionsPath '${{ github.workspace }}/build/psoptions.json'
$options = (Get-PSOptions)
$rootPath = '${{ github.workspace }}/bins'
$originalRootPath = Split-Path -path $options.Output
$path = Join-Path -path $rootPath -ChildPath (split-path -leaf -path $originalRootPath)
$pwshPath = Join-Path -path $path -ChildPath 'pwsh'
chmod a+x $pwshPath
$options.Output = $pwshPath
Set-PSOptions $options
Invoke-CIFinish
shell: pwsh
- name: Upload packages
run: |-
Get-ChildItem "${env:BUILD_ARTIFACTSTAGINGDIRECTORY}/*.deb" -Recurse | ForEach-Object {
$packagePath = $_.FullName
Write-Host "Uploading $packagePath"
Write-Host "##vso[artifact.upload containerfolder=deb;artifactname=deb]$packagePath"
}
Get-ChildItem "${env:BUILD_ARTIFACTSTAGINGDIRECTORY}/*.rpm" -Recurse | ForEach-Object {
$packagePath = $_.FullName
Write-Host "Uploading $packagePath"
Write-Host "##vso[artifact.upload containerfolder=rpm;artifactname=rpm]$packagePath"
}
Get-ChildItem "${env:BUILD_ARTIFACTSTAGINGDIRECTORY}/*.tar.gz" -Recurse | ForEach-Object {
$packagePath = $_.FullName
Write-Host "Uploading $packagePath"
Write-Host "##vso[artifact.upload containerfolder=rpm;artifactname=rpm]$packagePath"
}
shell: pwsh
+91
View File
@@ -0,0 +1,91 @@
name: nix_test
description: 'Test PowerShell on non-Windows platforms'
inputs:
purpose:
required: false
default: ''
type: string
tagSet:
required: false
default: CI
type: string
ctrfFolder:
required: false
default: ctrf
type: string
runs:
using: composite
steps:
- name: Capture Environment
if: success() || failure()
run: 'Get-ChildItem -Path env: | Out-String -width 9999 -Stream | write-Verbose -Verbose'
shell: pwsh
- name: Download Build Artifacts
uses: actions/download-artifact@v4
with:
path: "${{ github.workspace }}"
- name: Capture Artifacts Directory
continue-on-error: true
run: Get-ChildItem "${{ github.workspace }}/build/*" -Recurse
shell: pwsh
- name: Bootstrap
shell: pwsh
run: |-
Import-Module ./tools/ci.psm1
Invoke-CIInstall -SkipUser
- name: Extract Files
uses: actions/github-script@v7.0.0
env:
DESTINATION_FOLDER: "${{ github.workspace }}/bins"
ARCHIVE_FILE_PATTERNS: "${{ github.workspace }}/build/build.zip"
with:
script: |-
const fs = require('fs').promises
const path = require('path')
const target = path.resolve(process.env.DESTINATION_FOLDER)
const patterns = process.env.ARCHIVE_FILE_PATTERNS
const globber = await glob.create(patterns)
await io.mkdirP(path.dirname(target))
for await (const file of globber.globGenerator()) {
if ((await fs.lstat(file)).isDirectory()) continue
await exec.exec(`7z x ${file} -o${target} -aoa`)
}
- name: Fix permissions
continue-on-error: true
run: |-
find "${{ github.workspace }}/bins" -type d -exec chmod +rwx {} \;
find "${{ github.workspace }}/bins" -type f -exec chmod +rw {} \;
shell: bash
- name: Capture Extracted Build ZIP
continue-on-error: true
run: Get-ChildItem "${{ github.workspace }}/bins/*" -Recurse -ErrorAction SilentlyContinue
shell: pwsh
- name: Test
if: success()
run: |-
Import-Module ./tools/ci.psm1
Restore-PSOptions -PSOptionsPath '${{ github.workspace }}/build/psoptions.json'
$options = (Get-PSOptions)
$rootPath = '${{ github.workspace }}/bins'
$originalRootPath = Split-Path -path $options.Output
$path = Join-Path -path $rootPath -ChildPath (split-path -leaf -path $originalRootPath)
$pwshPath = Join-Path -path $path -ChildPath 'pwsh'
chmod a+x $pwshPath
$options.Output = $pwshPath
Set-PSOptions $options
Invoke-CITest -Purpose '${{ inputs.purpose }}' -TagSet '${{ inputs.tagSet }}' -TitlePrefix '${{ inputs.buildName }}' -OutputFormat JUnitXml
shell: pwsh
- name: Convert, Publish, and Upload Pester Test Results
uses: "./.github/actions/test/process-pester-results"
with:
name: "${{ inputs.purpose }}-${{ inputs.tagSet }}"
testResultsFolder: "${{ runner.workspace }}/testResults"
ctrfFolder: "${{ inputs.ctrfFolder }}"
@@ -0,0 +1,64 @@
name: process-pester-test-results
description: 'Process Pester test results'
inputs:
name:
required: true
default: ''
type: string
testResultsFolder:
required: false
default: "${{ runner.workspace }}/testResults"
type: string
ctrfFolder:
required: false
default: ctrf
type: string
runs:
using: composite
steps:
- name: Convert JUnit to CTRF
run: |-
Get-ChildItem -Path "${{ inputs.testResultsFolder }}/*.xml" -Recurse | ForEach-Object {
npx --yes junit-to-ctrf $_.FullName --output ./${{ inputs.ctrfFolder }}/$($_.BaseName).json --tool Pester
}
shell: pwsh
# this task only takes / as directory separators
- name: Publish Test Report
uses: ctrf-io/github-test-reporter@v1
with:
report-path: './${{ inputs.ctrfFolder }}/*.json'
exit-on-fail: true
summary-report: true
test-report: false
test-list-report: false
failed-report: false
fail-rate-report: false
flaky-report: false
flaky-rate-report: false
failed-folded-report: true
previous-results-report: false
ai-report: true
skipped-report: false
suite-folded-report: false
suite-list-report: false
pull-request-report: false
commit-report: false
custom-report: false
if: always()
- name: Upload testResults artifact
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-pester-${{ inputs.name }}
path: ${{ runner.workspace }}/testResults
- name: Upload ctrf artifact
if: always()
uses: actions/upload-artifact@v4
with:
name: ctrf-pester-${{ inputs.name }}
path: ${{ inputs.ctrfFolder }}
+5 -44
View File
@@ -60,48 +60,9 @@ runs:
Invoke-CITest -Purpose '${{ inputs.purpose }}' -TagSet '${{ inputs.tagSet }}' -OutputFormat JUnitXml
shell: pwsh
- name: Convert JUnit to CTRF
run: |-
Get-ChildItem -Path "${{ runner.workspace }}/testResults/*.xml" -Recurse | ForEach-Object {
npx --yes junit-to-ctrf $_.FullName --output .\${{ inputs.ctrfFolder }}\$($_.BaseName).json --tool Pester --env 'Windows ${{ inputs.purpose }} ${{ inputs.tagSet }}'
}
shell: powershell
# this task only takes / as directory separators
- name: Publish Test Report
uses: ctrf-io/github-test-reporter@v1
- name: Convert, Publish, and Upload Pester Test Results
uses: "./.github/actions/test/process-pester-results"
with:
report-path: './${{ inputs.ctrfFolder }}/*.json'
exit-on-fail: true
summary-report: true
test-report: false
test-list-report: false
failed-report: false
fail-rate-report: false
flaky-report: false
flaky-rate-report: false
failed-folded-report: true
previous-results-report: false
ai-report: true
skipped-report: false
suite-folded-report: false
suite-list-report: false
pull-request-report: false
commit-report: false
custom-report: false
if: always()
- name: Upload testResults artifact
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-pester-${{ inputs.purpose }}-${{ inputs.tagSet }}
path: ${{ runner.workspace }}\testResults
- name: Upload ctrf artifact
if: always()
uses: actions/upload-artifact@v4
with:
name: ctrf-pester-${{ inputs.purpose }}-${{ inputs.tagSet }}
path: ${{ inputs.ctrfFolder }}
name: "${{ inputs.purpose }}-${{ inputs.tagSet }}"
testResultsFolder: ${{ runner.workspace }}\testResults
ctrfFolder: "${{ inputs.ctrfFolder }}"
+141
View File
@@ -0,0 +1,141 @@
name: Linux-CI
run-name: "${{ github.ref_name }} - ${{ github.run_number }}"
on:
workflow_dispatch:
push:
branches:
- master
- release*
- feature*
paths:
- "**"
- "!.github/ISSUE_TEMPLATE/**"
- "!.dependabot/config.yml"
- "!.pipelines/**"
- "!test/perf/**"
pull_request:
branches:
- master
- release/**
- feature*
paths:
- ".github/actions/**"
- ".github/workflows/linux-ci.yml"
- "**.props"
- build.psm1
- src/**
- test/**
- tools/buildCommon/**
- tools/ci.psm1
- tools/WindowsCI.psm1
- "!test/common/markdown/**"
- "!test/perf/**"
env:
DOTNET_CLI_TELEMETRY_OPTOUT: 1
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
FORCE_FEATURE: 'False'
FORCE_PACKAGE: 'False'
NUGET_KEY: none
POWERSHELL_TELEMETRY_OPTOUT: 1
__SuppressAnsiEscapeSequences: 1
nugetMultiFeedWarnLevel: none
system_debug: 'false'
jobs:
ci_build:
name: Build PowerShell
runs-on: ubuntu-20.04
steps:
- name: checkout
uses: actions/checkout@v4.1.0
with:
fetch-depth: 1000
- name: Build
uses: "./.github/actions/build/ci"
linux_test_unelevated_ci:
name: Linux Unelevated CI
needs: ci_build
runs-on: ubuntu-20.04
steps:
- name: checkout
uses: actions/checkout@v4.1.0
with:
fetch-depth: 1000
- name: Linux Unelevated CI
uses: "./.github/actions/test/nix"
with:
purpose: UnelevatedPesterTests
tagSet: CI
linux_test_elevated_ci:
name: Linux Elevated CI
needs: ci_build
runs-on: ubuntu-20.04
steps:
- name: checkout
uses: actions/checkout@v4.1.0
with:
fetch-depth: 1000
- name: Linux Elevated CI
uses: "./.github/actions/test/nix"
with:
purpose: ElevatedPesterTests
tagSet: CI
linux_test_unelevated_others:
name: Linux Unelevated Others
needs: ci_build
runs-on: ubuntu-20.04
steps:
- name: checkout
uses: actions/checkout@v4.1.0
with:
fetch-depth: 1000
- name: Linux Unelevated Others
uses: "./.github/actions/test/nix"
with:
purpose: UnelevatedPesterTests
tagSet: Others
linux_test_elevated_others:
name: Linux Elevated Others
needs: ci_build
runs-on: ubuntu-20.04
steps:
- name: checkout
uses: actions/checkout@v4.1.0
with:
fetch-depth: 1000
- name: Linux Elevated Others
uses: "./.github/actions/test/nix"
with:
purpose: ElevatedPesterTests
tagSet: Others
verify_xunit:
name: Verify xUnit test results
needs: ci_build
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v4.1.0
with:
fetch-depth: 1000
- name: Verify xUnit test results
uses: "./.github/actions/test/verify_xunit"
# TODO: Enable this when we have a Linux packaging workflow
# ERROR: While executing gem ... (Gem::FilePermissionError)
# You don't have write permissions for the /var/lib/gems/2.7.0 directory.
# WARNING: Installation of gem dotenv 2.8.1 failed! Must resolve manually.
# linux_packaging:
# name: Attempt Linux Packaging
# needs: ci_build
# runs-on: ubuntu-20.04
# steps:
# - name: checkout
# uses: actions/checkout@v4.1.0
# with:
# fetch-depth: 1000
# - name: Verify xUnit test results
# uses: "./.github/actions/test/linux-packaging"
+12 -13
View File
@@ -7,30 +7,29 @@ on:
- release/**
- feature*
paths:
- "*"
- "**"
- "!.vsts-ci/misc-analysis.yml"
- "!.github/ISSUE_TEMPLATE/*"
- "!.github/workflows/*"
- "!.github/ISSUE_TEMPLATE/**"
- "!.dependabot/config.yml"
- "!test/perf/*"
- "!.pipelines/*"
- "!test/perf/**"
- "!.pipelines/**"
pull_request:
branches:
- master
- release/**
- feature*
paths:
- ".vsts-ci/templates/*"
- ".vsts-ci/windows.yml"
- "*.props"
- ".github/actions/**"
- ".github/workflows/windows-ci.yml"
- "**.props"
- build.psm1
- src/*
- test/*
- tools/buildCommon/*
- src/**
- test/**
- tools/buildCommon/**
- tools/ci.psm1
- tools/WindowsCI.psm1
- "!test/common/markdown/*"
- "!test/perf/*"
- "!test/common/markdown/**"
- "!test/perf/**"
permissions:
contents: read