The psake/Invoke-Build task drift guard compares nothing against nothing
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức phù hợp với người mới
- 72/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- powershell
- Lĩnh vực
- build-system, testing-qa
Hướng nghiên cứu
Bắt đầu trong tests/IBTasks.tests.ps1 tại các khối It có tên 'Parseable by invoke-build' và 'Contains all the tasks that were in the Psake file', sau đó chạy bộ kiểm thử Pester để tái hiện lần vượt qua sai. So sánh phần kiểm tra tên tác vụ với các phép so sánh cài đặt và ký ở bên cạnh. Hoàn tất khi các tệp không thay đổi đều đạt và một khác biệt cố ý trong tên tác vụ bị thất bại.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
tests/IBTasks.tests.ps1, the It 'Contains all the tasks that were in the Psake file', is the only guard that psake and Invoke-Build still define the same tasks. It cannot fail. Two independent defects cancel each other out, and fixing either one alone turns it red.
What happens
Defect one: $IBTasksResult is $null inside the It that reads it.
$IBTasksResult = $null # Describe body: runs at discovery only
It 'Parseable by invoke-build' {
$IBTasksResult = Start-Job { ... } | Wait-Job | Receive-Job # assigned here
...
}
It 'Contains all the tasks that were in the Psake file' {
$IBTaskNames = $IBTasksResult.all.name # ...and $null here
Each It block runs in its own scope, so the assignment in the first block is not visible in the second, and the $IBTasksResult = $null at the Describe level runs during discovery rather than during the run. $IBTaskNames is therefore $null.
Defect two: $psakeTaskNames is a collection of $null.
$psakeTaskNames = Start-Job -ScriptBlock {
Invoke-PSake -docs -buildfile $using:psakeFilePath | Where-Object name -notmatch '^(default|\?)$' | ForEach-Object name
} | Wait-Job | Receive-Job
Invoke-PSake -docs formats a table to the output stream. What crosses the job boundary is therefore format records, not task objects, and a format record has no Name property. Measured on this repository at 484f24f:
Deserialized.Microsoft.PowerShell.Commands.Internal.Format.FormatStartData 1
Deserialized.Microsoft.PowerShell.Commands.Internal.Format.GroupStartData 1
Deserialized.Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData 17
Deserialized.Microsoft.PowerShell.Commands.Internal.Format.GroupEndData 1
Deserialized.Microsoft.PowerShell.Commands.Internal.Format.FormatEndData 1
$psakeTaskNames.Count = 21
non-null entries = 0
Where-Object name -notmatch ... also passes all 21 through, because $null -notmatch anything is true.
The two cancel. The loop becomes foreach ($taskItem in @($null, $null, ...)), the test is $null -notin $null, which evaluates to False, so the throw never fires. The closing assertion is @($null, $null, ...) | Should -Not -BeNullOrEmpty, which passes because the array has 21 elements even though every one of them is $null.
Measured: the guard does not fire on the divergence it exists to catch
Renaming a single task in the built IB.tasks.ps1 so it no longer matches psakeFile.ps1 — exactly the drift the test was written for:
-Task Sign SignModule, SignCatalog
+Task RenamedSignTask SignModule, SignCatalog
Describing Invoke-Build Tasks
[+] IB.tasks.ps1 exists
[+] Parseable by invoke-build
[+] Contains all the tasks that were in the Psake file <-- should be red
Tests Passed: 8, Failed: 0
PowerShell 7.6.5, Pester 6.1.0, psake 5.0.4, Windows 11.
Why it matters
Divergence between the two task files is not hypothetical; it is this repository's most productive defect class, and it reaches Invoke-Build consumers only.
- #178:
IB.tasks.ps1readTest.CodeCoverage.OutputFormatwhile the defaults defineOutputFileFormat, so no Invoke-Build consumer had a working code coverage format. - #193:
IB.tasks.ps1never passedSkipValidation, so$PSBPreference.Sign.SkipCertificateValidationwas dead for every Invoke-Build consumer while it worked for psake consumers.
Both were found by hand and then covered by the other Describe blocks in this same file — the settings-path comparison and the signing-settings comparison — which do work. The task-name comparison, the oldest of the three and the one everything else was layered on top of, has never worked. A task added to psakeFile.ps1 and forgotten in IB.tasks.ps1 would ship silently today.
Options
- Fix both defects and keep the test. Move the whole thing into one
It(or hoist the Invoke-Build run into aBeforeAllthat assigns to a$script:variable), and get real task names out of psake withGet-PSakeScriptTasks -buildFile $psakeFilePathinstead ofInvoke-PSake -docs, which returns objects rather than a formatted table. Both halves must change together; either alone makes the test fail for the wrong reason. - Replace it with a static comparison, like its two neighbours. The
Settings referenced by the task filesandSigning settings referenced by the task filesblocks in this same file parse the two task files with a regular expression and compare, with no job, no psake invocation, and no format-record hazard. Task names could be compared the same way, which would also make the test fast and immune to psake's output format changing again. - Delete it. It has never tested anything, and the two working
Describeblocks below it cover the settings-level drift that has actually bitten. This is the cheapest option and the one that loses real coverage, since neither of those blocks can see a task that exists in one file and not the other.
(2) looks like the best value: it keeps the coverage, matches the pattern the rest of the file already uses, and removes the job entirely.
Related: #178, #193.
- Ngôn ngữ chính
- PowerShell
- Star
- 145
- Fork
- 27
- Merge trung bình
- 10 giờ 16 phút
- Pull request đã merge (30 ngày)
- 34
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của psake/PowerShellBuild
-
Nothing tests the Build-PSBuildUpdatableHelp branch that deletes a consumer's output directory Đang mởbug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
psake/PowerShellBuild#218 · 1 bình luận ·
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
psake/PowerShellBuild#211 · 1 bình luận ·
-
CI: Install the built module from a local repository to verify install-time dependency behaviour Đang mởenhancement github_actions
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 68/100
psake/PowerShellBuild#229 ·
-
bug
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 55/100
psake/PowerShellBuild#222 ·
-
bug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 68/100
psake/PowerShellBuild#221 ·
Tất cả issue của psake/PowerShellBuild
Issue tương tự
-
kind/bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
kubernetes-sigs/prow#953 · 1 bình luận ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
zephyrproject-rtos/zephyr#119726 ·
-
out-of-date
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 82/100
CachyOS/CachyOS-PKGBUILDS#1894 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
-
comp/dashboard P3 type/bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 86/100
NousResearch/hermes-agent#117722 ·