Skip to content

Commit 5bcfc55

Browse files
committed
Initial Commit
1 parent e773c6b commit 5bcfc55

File tree

111 files changed

+10493
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

111 files changed

+10493
-0
lines changed

.editorconfig

+400
Large diffs are not rendered by default.

.gitignore

+459
Large diffs are not rendered by default.

.vsconfig

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"version": "1.0",
3+
"components": [
4+
"Microsoft.Component.MSBuild",
5+
"Microsoft.Net.Component.4.7.2.TargetingPack",
6+
"Microsoft.NetCore.Component.SDK",
7+
"Microsoft.VisualStudio.Component.NuGet.BuildTools",
8+
"Microsoft.VisualStudio.Component.Roslyn.Compiler"
9+
]
10+
}

Directory.Build.props

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<Project>
2+
<PropertyGroup>
3+
<Nullable>enable</Nullable>
4+
5+
<!-- Use the latest version of C# available -->
6+
<LangVersion>Latest</LangVersion>
7+
8+
<!-- ArtifactsDirectory is an Azure Pipelines variable so presents as an env var -->
9+
<BaseArtifactsPath Condition="'$(ArtifactsDirectory)' != ''">$(ArtifactsDirectory)\$(Configuration)\</BaseArtifactsPath>
10+
<BaseArtifactsPath Condition="'$(BaseArtifactsPath)' == ''">$(MSBuildThisFileDirectory)artifacts\$(Configuration)\</BaseArtifactsPath>
11+
12+
<!-- Put all produced packages in the same folder -->
13+
<PackageOutputPath>$(BaseArtifactsPath)\packages</PackageOutputPath>
14+
15+
<!-- Suppress spam about using a preview version of .NET -->
16+
<SuppressNETCoreSdkPreviewMessage>true</SuppressNETCoreSdkPreviewMessage>
17+
18+
<!-- Don't allow warnings -->
19+
<MSBuildTreatWarningsAsErrors>true</MSBuildTreatWarningsAsErrors>
20+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
21+
22+
<!-- Enabled the built-in analyzers -->
23+
<EnableNETAnalyzers>true</EnableNETAnalyzers>
24+
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
25+
<AnalysisMode>All</AnalysisMode>
26+
27+
<!-- Embed symbols for easier debugging -->
28+
<DebugType>embedded</DebugType>
29+
30+
<!-- Required for IDE0005 -->
31+
<GenerateDocumentationFile>true</GenerateDocumentationFile>
32+
33+
<!-- Use Directory.Packages.props to manage versions -->
34+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
35+
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
36+
37+
<!-- BuildXL packages are pre-release but this package itself is not pre-release -->
38+
<NoWarn>$(NoWarn);NU5104</NoWarn>
39+
</PropertyGroup>
40+
41+
<!-- Packaging -->
42+
<PropertyGroup>
43+
<Authors>Microsoft</Authors>
44+
<Copyright>© Microsoft Corporation. All rights reserved.</Copyright>
45+
<Description>A project cache plugin for MSBuild</Description>
46+
<PackageProjectUrl>https://github.com/microsoft/MSBuildCache</PackageProjectUrl>
47+
<RepositoryUrl>https://github.com/microsoft/MSBuildCache</RepositoryUrl>
48+
</PropertyGroup>
49+
50+
<!-- Source Link (https://github.com/dotnet/sourcelink) -->
51+
<PropertyGroup>
52+
<PublishRepositoryUrl>true</PublishRepositoryUrl>
53+
<EmbedUntrackedSources>true</EmbedUntrackedSources>
54+
</PropertyGroup>
55+
</Project>

Directory.Build.targets

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<Project>
2+
<ItemGroup>
3+
<Compile Include="$(MSBuildThisFileDirectory)build\Attributes\*.cs" Visible="false" />
4+
</ItemGroup>
5+
</Project>

Directory.Packages.props

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project>
3+
<PropertyGroup>
4+
<ArtifactsPackageVersion>19.230.34229-buildid23092045</ArtifactsPackageVersion>
5+
6+
<!-- see https://www.nuget.org/packages/Microsoft.VisualStudio.Services.PipelineCache.WebApi/19.230.34229-buildid23092045 -->
7+
<BuildXLPackageVersion>0.1.0-20230922.1</BuildXLPackageVersion>
8+
9+
<MSBuildPackageVersion>17.8.3</MSBuildPackageVersion>
10+
</PropertyGroup>
11+
<ItemGroup>
12+
<PackageVersion Include="coverlet.collector" Version="3.1.2" />
13+
<PackageVersion Include="DotNet.Glob" Version="2.0.3" />
14+
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="7.0.0" />
15+
<PackageVersion Include="Microsoft.Bcl.HashCode" Version="1.1.1" />
16+
<PackageVersion Include="Microsoft.Build" Version="$(MSBuildPackageVersion)" />
17+
<PackageVersion Include="Microsoft.Build.Framework" Version="$(MSBuildPackageVersion)" />
18+
<PackageVersion Include="Microsoft.Build.Prediction" Version="1.1.0" />
19+
<PackageVersion Include="Microsoft.Build.Utilities.Core" Version="$(MSBuildPackageVersion)" />
20+
<PackageVersion Include="Microsoft.BuildXL.Cache.Hashing" Version="$(BuildXLPackageVersion)" />
21+
<PackageVersion Include="Microsoft.BuildXL.Cache.Interfaces" Version="$(BuildXLPackageVersion)" />
22+
<PackageVersion Include="Microsoft.BuildXL.Cache.Libraries" Version="$(BuildXLPackageVersion)" />
23+
<PackageVersion Include="Microsoft.BuildXL.Native" Version="$(BuildXLPackageVersion)" />
24+
<PackageVersion Include="Microsoft.BuildXL.Processes" Version="$(BuildXLPackageVersion)" />
25+
<PackageVersion Include="Microsoft.BuildXL.Utilities" Version="$(BuildXLPackageVersion)" />
26+
<PackageVersion Include="Microsoft.BuildXL.Utilities.Core" Version="$(BuildXLPackageVersion)" />
27+
<PackageVersion Include="Microsoft.CodeAnalysis" Version="3.8.0" />
28+
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.3" />
29+
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
30+
<PackageVersion Include="Microsoft.VisualStudio.Services.BlobStore.Client" Version="$(ArtifactsPackageVersion)" />
31+
<PackageVersion Include="Microsoft.VisualStudio.Services.BlobStore.Client.Cache" Version="$(ArtifactsPackageVersion)" />
32+
<PackageVersion Include="Microsoft.VisualStudio.Services.PipelineCache.WebApi" Version="$(ArtifactsPackageVersion)" />
33+
<PackageVersion Include="MSTest.TestAdapter" Version="2.2.10" />
34+
<PackageVersion Include="MSTest.TestFramework" Version="2.2.10" />
35+
<!--
36+
An indirect dependency of BXL (Minimatch) depends on a very old and non-existing version of NETStandard.Library (>= 1.0.0-rc2-23910).
37+
This forces a good version of NETStandard.Library to mitigate.
38+
-->
39+
<PackageVersion Include="NETStandard.Library" Version="2.0.3"/>
40+
<PackageVersion Include="morelinq" Version="3.4.2" />
41+
<PackageVersion Include="System.Collections.Immutable" Version="7.0.0" />
42+
<PackageVersion Include="System.Memory" Version="4.5.5" />
43+
<PackageVersion Include="System.Reflection.Metadata" Version="7.0.0" />
44+
<PackageVersion Include="System.Runtime.CompilerServices.Unsafe" Version="6.0.0" />
45+
<PackageVersion Include="System.Text.Json" Version="7.0.3" />
46+
<PackageVersion Include="System.Threading.Channels" Version="7.0.0" />
47+
<PackageVersion Include="System.Threading.Tasks.Dataflow" Version="7.0.0" />
48+
</ItemGroup>
49+
<ItemGroup>
50+
<GlobalPackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" />
51+
<GlobalPackageReference Include="Nerdbank.GitVersioning" Version="3.5.113" />
52+
</ItemGroup>
53+
</Project>

MSBuildCache.sln

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio Version 17
4+
VisualStudioVersion = 17.0.31903.59
5+
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{EFFB5949-347C-4F28-8964-571D5C6B6209}"
7+
EndProject
8+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.MSBuildCache.Common", "src\Common\Microsoft.MSBuildCache.Common.csproj", "{33CD5B46-ECC1-47B1-B9B4-972218BFC4AC}"
9+
EndProject
10+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.MSBuildCache.Common.Tests", "src\Common.Tests\Microsoft.MSBuildCache.Common.Tests.csproj", "{41E23EB7-6313-4DD0-9F4D-39304CD030A8}"
11+
EndProject
12+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0392E290-973E-4086-A58E-F927AAA65B9A}"
13+
ProjectSection(SolutionItems) = preProject
14+
.editorconfig = .editorconfig
15+
.gitignore = .gitignore
16+
.gitmodules = .gitmodules
17+
azure-pipelines.yml = azure-pipelines.yml
18+
Directory.Build.props = Directory.Build.props
19+
Directory.Build.rsp = Directory.Build.rsp
20+
Directory.Build.targets = Directory.Build.targets
21+
Directory.Packages.props = Directory.Packages.props
22+
nuget.config = nuget.config
23+
README.md = README.md
24+
version.json = version.json
25+
EndProjectSection
26+
EndProject
27+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.MSBuildCache.SharedCompilation", "src\SharedCompilation\Microsoft.MSBuildCache.SharedCompilation.csproj", "{53A7161F-16F8-4672-807B-153603AB9A9A}"
28+
EndProject
29+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.MSBuildCache.AzureBlobStorage", "src\AzureBlobStorage\Microsoft.MSBuildCache.AzureBlobStorage.csproj", "{D0195D37-E001-4283-B51A-A0B51B1D54D1}"
30+
EndProject
31+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.MSBuildCache.AzurePipelines", "src\AzurePipelines\Microsoft.MSBuildCache.AzurePipelines.csproj", "{97357681-C75E-445D-8547-46F312D01CED}"
32+
EndProject
33+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.MSBuildCache.Local", "src\Local\Microsoft.MSBuildCache.Local.csproj", "{F6586428-E047-42C8-B0AC-048DF6DFAF18}"
34+
EndProject
35+
Global
36+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
37+
Debug|x64 = Debug|x64
38+
Release|x64 = Release|x64
39+
EndGlobalSection
40+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
41+
{33CD5B46-ECC1-47B1-B9B4-972218BFC4AC}.Debug|x64.ActiveCfg = Debug|x64
42+
{33CD5B46-ECC1-47B1-B9B4-972218BFC4AC}.Debug|x64.Build.0 = Debug|x64
43+
{33CD5B46-ECC1-47B1-B9B4-972218BFC4AC}.Release|x64.ActiveCfg = Release|x64
44+
{33CD5B46-ECC1-47B1-B9B4-972218BFC4AC}.Release|x64.Build.0 = Release|x64
45+
{41E23EB7-6313-4DD0-9F4D-39304CD030A8}.Debug|x64.ActiveCfg = Debug|x64
46+
{41E23EB7-6313-4DD0-9F4D-39304CD030A8}.Debug|x64.Build.0 = Debug|x64
47+
{41E23EB7-6313-4DD0-9F4D-39304CD030A8}.Release|x64.ActiveCfg = Release|x64
48+
{41E23EB7-6313-4DD0-9F4D-39304CD030A8}.Release|x64.Build.0 = Release|x64
49+
{53A7161F-16F8-4672-807B-153603AB9A9A}.Debug|x64.ActiveCfg = Debug|x64
50+
{53A7161F-16F8-4672-807B-153603AB9A9A}.Debug|x64.Build.0 = Debug|x64
51+
{53A7161F-16F8-4672-807B-153603AB9A9A}.Release|x64.ActiveCfg = Release|x64
52+
{53A7161F-16F8-4672-807B-153603AB9A9A}.Release|x64.Build.0 = Release|x64
53+
{D0195D37-E001-4283-B51A-A0B51B1D54D1}.Debug|x64.ActiveCfg = Debug|x64
54+
{D0195D37-E001-4283-B51A-A0B51B1D54D1}.Debug|x64.Build.0 = Debug|x64
55+
{D0195D37-E001-4283-B51A-A0B51B1D54D1}.Release|x64.ActiveCfg = Release|x64
56+
{D0195D37-E001-4283-B51A-A0B51B1D54D1}.Release|x64.Build.0 = Release|x64
57+
{97357681-C75E-445D-8547-46F312D01CED}.Debug|x64.ActiveCfg = Debug|x64
58+
{97357681-C75E-445D-8547-46F312D01CED}.Debug|x64.Build.0 = Debug|x64
59+
{97357681-C75E-445D-8547-46F312D01CED}.Release|x64.ActiveCfg = Release|x64
60+
{97357681-C75E-445D-8547-46F312D01CED}.Release|x64.Build.0 = Release|x64
61+
{F6586428-E047-42C8-B0AC-048DF6DFAF18}.Debug|x64.ActiveCfg = Debug|x64
62+
{F6586428-E047-42C8-B0AC-048DF6DFAF18}.Debug|x64.Build.0 = Debug|x64
63+
{F6586428-E047-42C8-B0AC-048DF6DFAF18}.Release|x64.ActiveCfg = Release|x64
64+
{F6586428-E047-42C8-B0AC-048DF6DFAF18}.Release|x64.Build.0 = Release|x64
65+
EndGlobalSection
66+
GlobalSection(SolutionProperties) = preSolution
67+
HideSolutionNode = FALSE
68+
EndGlobalSection
69+
GlobalSection(NestedProjects) = preSolution
70+
{33CD5B46-ECC1-47B1-B9B4-972218BFC4AC} = {EFFB5949-347C-4F28-8964-571D5C6B6209}
71+
{41E23EB7-6313-4DD0-9F4D-39304CD030A8} = {EFFB5949-347C-4F28-8964-571D5C6B6209}
72+
{53A7161F-16F8-4672-807B-153603AB9A9A} = {EFFB5949-347C-4F28-8964-571D5C6B6209}
73+
{D0195D37-E001-4283-B51A-A0B51B1D54D1} = {EFFB5949-347C-4F28-8964-571D5C6B6209}
74+
{97357681-C75E-445D-8547-46F312D01CED} = {EFFB5949-347C-4F28-8964-571D5C6B6209}
75+
{F6586428-E047-42C8-B0AC-048DF6DFAF18} = {EFFB5949-347C-4F28-8964-571D5C6B6209}
76+
EndGlobalSection
77+
GlobalSection(ExtensibilityGlobals) = postSolution
78+
SolutionGuid = {F1CDA78F-A666-431B-BF44-56DA7DF193BA}
79+
EndGlobalSection
80+
EndGlobal

azure-pipelines.yml

+117
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
variables:
2+
BuildConfiguration: Release
3+
DotNetVersion: '8.x'
4+
LogDirectory: $(Build.ArtifactStagingDirectory)\logs
5+
ArtifactsDirectory: $(Build.ArtifactStagingDirectory)\artifacts
6+
# https://github.com/microsoft/azure-pipelines-agent/pull/4077
7+
VSO_DEDUP_REDIRECT_TIMEOUT_IN_SEC: 5
8+
9+
schedules:
10+
- cron: '0 0 * * *'
11+
displayName: Daily midnight build
12+
branches:
13+
include:
14+
- main
15+
16+
trigger:
17+
batch: true
18+
branches:
19+
include:
20+
- main
21+
22+
pool:
23+
vmImage: windows-latest
24+
25+
resources:
26+
repositories:
27+
- repository: msbuild
28+
type: github
29+
endpoint: 'MSBuild Github'
30+
name: dotnet/msbuild
31+
ref: main
32+
33+
jobs:
34+
- job: BuildRelease
35+
displayName: Build using release bits
36+
variables:
37+
VsInstallDir: $(Build.ArtifactStagingDirectory)/vs
38+
steps:
39+
- checkout: self
40+
# The repo name currently doesn't match, so override.
41+
# Note: this path is relative to $(Pipeline.Workspace).
42+
path: s/MSBuildCache
43+
submodules: true
44+
# Fetch all history for versioning
45+
fetchDepth: 0
46+
47+
- task: Cache@2
48+
displayName: Cache Visual Studio
49+
inputs:
50+
key: '"vs" | "$(Agent.OS)"'
51+
path: $(VsInstallDir)
52+
53+
- script: |
54+
del %TEMP%\vs_buildtools.exe
55+
56+
curl.exe -L https://aka.ms/vs/17/pre/vs_buildtools.exe -o %TEMP%\vs_buildtools.exe
57+
58+
%TEMP%\vs_buildtools.exe ^
59+
--config "$(Build.SourcesDirectory)\.vsconfig" ^
60+
--installPath "$(VsInstallDir)" ^
61+
--passive ^
62+
--norestart ^
63+
--wait
64+
echo VS installer exit code: %ERRORLEVEL%
65+
66+
del %TEMP%\vs_buildtools.exe
67+
68+
echo Current MSBuild version:
69+
"$(VsInstallDir)\MSBuild\Current\Bin\amd64\MSBuild.exe" --version
70+
displayName: 'Install VS Preview'
71+
72+
- template: build-and-test.yml
73+
parameters:
74+
RepoRoot: $(Build.SourcesDirectory)
75+
MSBuildPath: $(VsInstallDir)\MSBuild\Current\Bin\amd64\MSBuild.exe
76+
77+
# TODO
78+
# - task: DotNetCoreCLI@2
79+
# displayName: Push packages
80+
# # Avoid pushing packages in the cron build since the package version will end up conflicting
81+
# condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'), ne(variables['Build.CronSchedule.DisplayName'], 'Daily midnight build'))
82+
# inputs:
83+
# command: 'push'
84+
# packagesToPush: '$(ArtifactsDirectory)/**/*.nupkg'
85+
# nuGetFeedType: 'internal'
86+
87+
- job: BuildLatest
88+
displayName: Build using latest MSBuild
89+
variables:
90+
# Used as an env var as well
91+
MSBuildLibraries: $(Build.SourcesDirectory)\msbuild\artifacts\bin\bootstrap\net472\MSBuild\Current\Bin\amd64
92+
steps:
93+
- checkout: self
94+
# The repo name currently doesn't match, so override.
95+
# Note: this path is relative to $(Pipeline.Workspace).
96+
path: s/MSBuildCache
97+
submodules: true
98+
# Fetch all history for versioning
99+
fetchDepth: 0
100+
- checkout: msbuild
101+
102+
- task: Cache@2
103+
displayName: Cache MSBuild
104+
inputs:
105+
key: '"msbuild" | "$(Agent.OS)" | "$(BuildConfiguration)" | ./msbuild/.git/HEAD'
106+
path: msbuild/artifacts
107+
cacheHitVar: MSBUILD_RESTORED
108+
109+
- script: |
110+
.\msbuild\build.cmd /p:CreateBootstrap=true /p:Configuration=$(BuildConfiguration)
111+
displayName: Build MSBuild
112+
condition: ne(variables.MSBUILD_RESTORED, 'true')
113+
114+
- template: build-and-test.yml
115+
parameters:
116+
RepoRoot: $(Build.SourcesDirectory)/MSBuildCache
117+
MSBuildPath: $(MSBuildLibraries)\MSBuild.exe

build-and-test.yml

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
parameters:
2+
- name: RepoRoot
3+
type: string
4+
- name: MSBuildPath
5+
type: string
6+
default: ""
7+
- name: AdditionalTestParams
8+
type: string
9+
default: ""
10+
11+
steps:
12+
- task: UseDotNet@2
13+
displayName: 'Install .NET $(DotNetVersion)'
14+
inputs:
15+
version: '$(DotNetVersion)'
16+
includePreviewVersions: true
17+
18+
- task: NuGetAuthenticate@1
19+
displayName: NuGet Authenticate
20+
21+
- task: DotNetCoreCLI@2
22+
displayName: Restore
23+
inputs:
24+
command: restore
25+
projects: ${{ parameters.RepoRoot }}/MSBuildCache.sln
26+
feedsToUse: 'config'
27+
nugetConfigPath: '${{ parameters.RepoRoot }}/nuget.config'
28+
29+
- task: DotNetCoreCLI@2
30+
displayName: Build
31+
inputs:
32+
command: build
33+
projects: ${{ parameters.RepoRoot }}/MSBuildCache.sln
34+
arguments: -restore:false --configuration $(BuildConfiguration) -BinaryLogger:$(LogDirectory)/msbuild.binlog
35+
36+
- task: DotNetCoreCLI@2
37+
displayName: Run Unit Tests
38+
inputs:
39+
command: test
40+
projects: ${{ parameters.RepoRoot }}/MSBuildCache.sln
41+
arguments: -restore:false --no-build --configuration $(BuildConfiguration)
42+
43+
- task: PowerShell@2
44+
displayName: "E2E Test: Microsoft.MSBuildCache.Local"
45+
inputs:
46+
filePath: ${{ parameters.RepoRoot }}\tests\test.ps1
47+
arguments: -MSBuildPath "${{ parameters.MSBuildPath }}" -Configuration $(BuildConfiguration) -LogDirectory "$(LogDirectory)\Tests\LocalOnly" -ArtifactsDirectory "$(ArtifactsDirectory)" -CachePackage Microsoft.MSBuildCache.Local
48+
pwsh: true
49+
50+
- task: PowerShell@2
51+
displayName: "E2E Test: Microsoft.MSBuildCache.AzurePipelines"
52+
inputs:
53+
filePath: ${{ parameters.RepoRoot }}\tests\test.ps1
54+
arguments: -MSBuildPath "${{ parameters.MSBuildPath }}" -Configuration $(BuildConfiguration) -LogDirectory "$(LogDirectory)\Tests\LocalOnly" -ArtifactsDirectory "$(ArtifactsDirectory)" -CachePackage Microsoft.MSBuildCache.AzurePipelines
55+
pwsh: true
56+
env:
57+
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
58+
59+
- task: PublishBuildArtifacts@1
60+
displayName: Publish Logs
61+
inputs:
62+
PathtoPublish: $(LogDirectory)
63+
ArtifactName: logs
64+
condition: always()
65+
66+
- task: PublishBuildArtifacts@1
67+
displayName: Publish Artifacts
68+
inputs:
69+
PathtoPublish: $(ArtifactsDirectory)
70+
ArtifactName: artifacts

0 commit comments

Comments
 (0)