mirror of
https://github.com/actions/setup-dotnet.git
synced 2026-03-22 22:52:17 +08:00
Compare commits
355 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
55ec9447dd | ||
|
|
70918d1a1f | ||
|
|
a6d1e7b915 | ||
|
|
b2ace4b12f | ||
|
|
ea9897a6e5 | ||
|
|
3447fd6a9f | ||
|
|
916351aac9 | ||
|
|
1ad2e312fa | ||
|
|
e3f84b8f7a | ||
|
|
ba848a34bb | ||
|
|
aa983c550d | ||
|
|
b891376106 | ||
|
|
b05a3f26b3 | ||
|
|
5fdecd2063 | ||
|
|
38b49fb717 | ||
|
|
3cf3e230c1 | ||
|
|
83a1653fa3 | ||
|
|
898aa0ce4d | ||
|
|
2f028bc044 | ||
|
|
21cf89aa73 | ||
|
|
fefaa59d2e | ||
|
|
e8501859aa | ||
|
|
426d75d071 | ||
|
|
0f534f5829 | ||
|
|
fbdbede901 | ||
|
|
0bc43909e0 | ||
|
|
c5a57b219c | ||
|
|
6adeb768ce | ||
|
|
f425be78f5 | ||
|
|
fc8786b149 | ||
|
|
7d08dc7593 | ||
|
|
e0a32d6459 | ||
|
|
255362be61 | ||
|
|
50b46b3b1d | ||
|
|
e8ac21d503 | ||
|
|
a79ce57e6b | ||
|
|
180a15970f | ||
|
|
b72f430d36 | ||
|
|
559e47b01b | ||
|
|
7358a44590 | ||
|
|
34c30d0e81 | ||
|
|
5f570676c2 | ||
|
|
aa34a3ceaa | ||
|
|
12f70884d7 | ||
|
|
0318091611 | ||
|
|
f199d27aa1 | ||
|
|
660c25a321 | ||
|
|
4f6b2f576a | ||
|
|
920b830bd1 | ||
|
|
abdd14ee80 | ||
|
|
1d9f0dad5b | ||
|
|
2699274f6e | ||
|
|
ca579e0fb2 | ||
|
|
c82240598b | ||
|
|
926f442022 | ||
|
|
c41fd15071 | ||
|
|
0c8652569e | ||
|
|
3cf27f13bb | ||
|
|
ae8edb8fff | ||
|
|
82b2b40816 | ||
|
|
fe74f1cb7d | ||
|
|
e94d154672 | ||
|
|
fe67d2f8db | ||
|
|
023f7252a0 | ||
|
|
3f3ad54c0c | ||
|
|
e1d35446fe | ||
|
|
11aaa65761 | ||
|
|
13abe4777e | ||
|
|
aefe5b483f | ||
|
|
047f06d086 | ||
|
|
014f8c8384 | ||
|
|
80c862dc38 | ||
|
|
e21107efbd | ||
|
|
d8f1ab14a7 | ||
|
|
f05a62b1cc | ||
|
|
338d4e3bbf | ||
|
|
228eec3014 | ||
|
|
c483e03222 | ||
|
|
a35f420124 | ||
|
|
4214866121 | ||
|
|
0681939502 | ||
|
|
ba8a1f9c02 | ||
|
|
09d024bd02 | ||
|
|
8ae4c080ce | ||
|
|
c5d2f92cae | ||
|
|
069c35efca | ||
|
|
6a2cd88ae8 | ||
|
|
9984a6fa87 | ||
|
|
607fce577a | ||
|
|
501b34e8f6 | ||
|
|
b827fcce4d | ||
|
|
239baf3c5b | ||
|
|
4d4a70f4a5 | ||
|
|
70c3f4d098 | ||
|
|
9260643816 | ||
|
|
45c9f236cf | ||
|
|
6d6c7c9313 | ||
|
|
e753bbf2ff | ||
|
|
629365b26e | ||
|
|
942a0bea39 | ||
|
|
26db2473e9 | ||
|
|
467621733d | ||
|
|
bdd38d13dc | ||
|
|
1d2f8f9eaf | ||
|
|
354d280fa3 | ||
|
|
0ff311b0d0 | ||
|
|
bc65ba63d3 | ||
|
|
90642fa8c5 | ||
|
|
c7e7147fd3 | ||
|
|
cf081e76a2 | ||
|
|
4ca3c96b49 | ||
|
|
0705ef0281 | ||
|
|
a351d9ea84 | ||
|
|
cc76dfab99 | ||
|
|
857c316a9d | ||
|
|
1f2c90bb99 | ||
|
|
251997c37d | ||
|
|
bba8299c35 | ||
|
|
fd4e15fa44 | ||
|
|
95e7de77d1 | ||
|
|
52c3199a78 | ||
|
|
2d9def7067 | ||
|
|
df51eabf53 | ||
|
|
e4b2fcaa19 | ||
|
|
d45c10e6f7 | ||
|
|
4d1b6c2c63 | ||
|
|
5d7bc0454b | ||
|
|
792e988dae | ||
|
|
e5034212c9 | ||
|
|
0997db20d4 | ||
|
|
4cb4764ae2 | ||
|
|
d33e605efe | ||
|
|
f7747565a1 | ||
|
|
2f75d1de25 | ||
|
|
e6a9a96293 | ||
|
|
025aba53b2 | ||
|
|
37b00c4fc5 | ||
|
|
c2dac7f367 | ||
|
|
c5267f5e54 | ||
|
|
ba5e53c61d | ||
|
|
043fb8900f | ||
|
|
cb04ff8cb3 | ||
|
|
bac4044d91 | ||
|
|
d26ead4cf0 | ||
|
|
e81cd4d454 | ||
|
|
ee11c4faa4 | ||
|
|
8bf1fb6084 | ||
|
|
c0d4ad69d8 | ||
|
|
afe2daba1f | ||
|
|
fb09b12527 | ||
|
|
5cc895510b | ||
|
|
158737d5b1 | ||
|
|
fcf565ec50 | ||
|
|
f078482971 | ||
|
|
0fb87b12d2 | ||
|
|
4fe7a196b5 | ||
|
|
9283a8cf7a | ||
|
|
53d632b5c0 | ||
|
|
9211491ffb | ||
|
|
edfd7b3266 | ||
|
|
9744af7b74 | ||
|
|
7016f85f93 | ||
|
|
d292011f5d | ||
|
|
608ee757cf | ||
|
|
e54e706650 | ||
|
|
c20f59e04a | ||
|
|
13b852df87 | ||
|
|
f85bcda870 | ||
|
|
499789684c | ||
|
|
76ddd67c90 | ||
|
|
550702114f | ||
|
|
e3ce4164b3 | ||
|
|
463326422f | ||
|
|
547d075822 | ||
|
|
fc9265379f | ||
|
|
32c76e2669 | ||
|
|
8ca0cf75a1 | ||
|
|
7f88dbf08f | ||
|
|
af0ed6536b | ||
|
|
9dd9d27e57 | ||
|
|
44530e8569 | ||
|
|
5a3fa01c67 | ||
|
|
f2da928c08 | ||
|
|
fb9fd97b03 | ||
|
|
f0b9e4cf3f | ||
|
|
b66058b059 | ||
|
|
7323c4e7cb | ||
|
|
6eab455d72 | ||
|
|
b2cf6c7cd4 | ||
|
|
ff5b78971e | ||
|
|
e26fc623bc | ||
|
|
e974974b42 | ||
|
|
9969bca445 | ||
|
|
deee0f6246 | ||
|
|
33fad1d142 | ||
|
|
2c3efd1f04 | ||
|
|
f3822c3b02 | ||
|
|
5e45b4b591 | ||
|
|
b7b99f337e | ||
|
|
f92687c910 | ||
|
|
0067f023d2 | ||
|
|
9480036ff9 | ||
|
|
6b8ad2e725 | ||
|
|
078f7c4a73 | ||
|
|
13fd5bf191 | ||
|
|
26be14c4e1 | ||
|
|
8309d4ee7e | ||
|
|
bab14f40fd | ||
|
|
4b337272b7 | ||
|
|
d62c876481 | ||
|
|
5306333434 | ||
|
|
5070486392 | ||
|
|
9647326bcf | ||
|
|
f720d14d91 | ||
|
|
7f3ad75595 | ||
|
|
634914df32 | ||
|
|
4fc55d8fdb | ||
|
|
c98cd238db | ||
|
|
b25fa305a3 | ||
|
|
181f10df92 | ||
|
|
c65a26fe6d | ||
|
|
dd9ada314c | ||
|
|
12194cb2cd | ||
|
|
b8ab602c41 | ||
|
|
95f03216f8 | ||
|
|
5529ce4143 | ||
|
|
5b0ff19756 | ||
|
|
bf3c3eb1fd | ||
|
|
450b569534 | ||
|
|
e1cf912aaf | ||
|
|
03d6eb5402 | ||
|
|
effa3e26d2 | ||
|
|
a71d1eb2c8 | ||
|
|
b50d70502b | ||
|
|
d8cff32ae5 | ||
|
|
7b2009794e | ||
|
|
53d6483af8 | ||
|
|
34c59b7d0b | ||
|
|
bd485b6bd1 | ||
|
|
0cfae9b3a5 | ||
|
|
23fa2c1473 | ||
|
|
291588df6a | ||
|
|
87189a16c7 | ||
|
|
cde58ab948 | ||
|
|
20e68089c2 | ||
|
|
7790315509 | ||
|
|
c47e26f841 | ||
|
|
3edf2e9363 | ||
|
|
a8c97016ef | ||
|
|
07b4a80293 | ||
|
|
d08d2193f9 | ||
|
|
632ccbdfb9 | ||
|
|
b81836a248 | ||
|
|
3b539379a8 | ||
|
|
596753d72c | ||
|
|
f9d7f16c00 | ||
|
|
56d96e897e | ||
|
|
5a201f5e82 | ||
|
|
13ccc115f4 | ||
|
|
f2eb44dadd | ||
|
|
8dcf1ee9bc | ||
|
|
3707a44789 | ||
|
|
385512c5e5 | ||
|
|
083d63a2ff | ||
|
|
6930747f7f | ||
|
|
20afff9c90 | ||
|
|
36fa9877a9 | ||
|
|
77a48bbb85 | ||
|
|
4f71fcfa81 | ||
|
|
768b4eb7db | ||
|
|
ba7e1e2155 | ||
|
|
6803d4b94d | ||
|
|
3c80e97cbd | ||
|
|
8d30c127da | ||
|
|
2d101adc9f | ||
|
|
c8b60fb6bf | ||
|
|
bea420f2fd | ||
|
|
3a3dbe976e | ||
|
|
ce38f90a9a | ||
|
|
c32ed2108b | ||
|
|
d99c06115d | ||
|
|
f311b6d978 | ||
|
|
9427b17c42 | ||
|
|
f39691d155 | ||
|
|
19e6ad3fe0 | ||
|
|
efeb86e5ce | ||
|
|
8e5c71c8f8 | ||
|
|
c0d7255256 | ||
|
|
c1ca14bb7b | ||
|
|
e1655545c1 | ||
|
|
2a58294d0c | ||
|
|
92ffa484b1 | ||
|
|
3698118d95 | ||
|
|
cfb7e25be1 | ||
|
|
5865234247 | ||
|
|
0cb99b2a12 | ||
|
|
4a01d86a5b | ||
|
|
1c7be1087d | ||
|
|
ac1baccba4 | ||
|
|
92451e3d46 | ||
|
|
a841c568fd | ||
|
|
5d1a72cb19 | ||
|
|
8889c6748f | ||
|
|
f4159a6d20 | ||
|
|
7164f75e01 | ||
|
|
44b8627225 | ||
|
|
054db1cac2 | ||
|
|
1317beb53a | ||
|
|
fabe7d52fe | ||
|
|
993f819e3d | ||
|
|
831e0d4070 | ||
|
|
bb2233aaa5 | ||
|
|
24ed2d0102 | ||
|
|
059f1aa99b | ||
|
|
5c5ac76dc6 | ||
|
|
a0f70ab98c | ||
|
|
5dcd27b0bc | ||
|
|
79735df611 | ||
|
|
a1105722ad | ||
|
|
131ac602dc | ||
|
|
c8cb48ba8b | ||
|
|
7bbfec324f | ||
|
|
6b7d951977 | ||
|
|
c7eaa2ec00 | ||
|
|
8807004b20 | ||
|
|
2d640ec739 | ||
|
|
53b5bae1f6 | ||
|
|
45c0959fcd | ||
|
|
d33a835564 | ||
|
|
347456b934 | ||
|
|
76a91b1af8 | ||
|
|
9d49fb8e98 | ||
|
|
10ad86dc12 | ||
|
|
71f0d4bd07 | ||
|
|
7669e56997 | ||
|
|
c8cf369c29 | ||
|
|
6ade6c061b | ||
|
|
843b5197ce | ||
|
|
a3d47e556c | ||
|
|
7261940ea5 | ||
|
|
8ada5b5558 | ||
|
|
62230c5409 | ||
|
|
51b6fb2610 | ||
|
|
c47b497cff | ||
|
|
975b958e4c | ||
|
|
13bccd131e | ||
|
|
daad66578a | ||
|
|
29c0c6cee8 | ||
|
|
5551aab1c3 | ||
|
|
9a46dbb681 | ||
|
|
9fdd50a4bb | ||
|
|
8336fd394b | ||
|
|
51f68377c1 | ||
|
|
7a98346f51 | ||
|
|
8aad93f856 |
6
.eslintignore
Normal file
6
.eslintignore
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Ignore list
|
||||||
|
/*
|
||||||
|
|
||||||
|
# Do not ignore these folders:
|
||||||
|
!__tests__/
|
||||||
|
!src/
|
||||||
51
.eslintrc.js
Normal file
51
.eslintrc.js
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
// This is a reusable configuration file copied from https://github.com/actions/reusable-workflows/tree/main/reusable-configurations. Please don't make changes to this file as it's the subject of an automatic update.
|
||||||
|
module.exports = {
|
||||||
|
extends: [
|
||||||
|
'eslint:recommended',
|
||||||
|
'plugin:@typescript-eslint/recommended',
|
||||||
|
'plugin:eslint-plugin-jest/recommended',
|
||||||
|
'eslint-config-prettier'
|
||||||
|
],
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
plugins: ['@typescript-eslint', 'eslint-plugin-node', 'eslint-plugin-jest'],
|
||||||
|
rules: {
|
||||||
|
'@typescript-eslint/no-require-imports': 'error',
|
||||||
|
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||||
|
'@typescript-eslint/no-explicit-any': 'off',
|
||||||
|
'@typescript-eslint/no-empty-function': 'off',
|
||||||
|
'@typescript-eslint/ban-ts-comment': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
'ts-ignore': 'allow-with-description'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'no-console': 'error',
|
||||||
|
'yoda': 'error',
|
||||||
|
'prefer-const': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
destructuring: 'all'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'no-control-regex': 'off',
|
||||||
|
'no-constant-condition': ['error', {checkLoops: false}],
|
||||||
|
'node/no-extraneous-import': 'error'
|
||||||
|
},
|
||||||
|
overrides: [
|
||||||
|
{
|
||||||
|
files: ['**/*{test,spec}.ts'],
|
||||||
|
rules: {
|
||||||
|
'@typescript-eslint/no-unused-vars': 'off',
|
||||||
|
'jest/no-standalone-expect': 'off',
|
||||||
|
'jest/no-conditional-expect': 'off',
|
||||||
|
'no-console': 'off',
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
env: {
|
||||||
|
node: true,
|
||||||
|
es6: true,
|
||||||
|
'jest/globals': true
|
||||||
|
}
|
||||||
|
};
|
||||||
3
.gitattributes
vendored
3
.gitattributes
vendored
@@ -1 +1,2 @@
|
|||||||
.licenses/** -diff linguist-generated=true
|
* text=auto eol=lf
|
||||||
|
.licenses/** -diff linguist-generated=true
|
||||||
|
|||||||
1
.github/CODEOWNERS
vendored
Normal file
1
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
* @actions/setup-actions-team
|
||||||
33
.github/ISSUE_TEMPLATE/bug_report.md
vendored
33
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -2,22 +2,31 @@
|
|||||||
name: Bug report
|
name: Bug report
|
||||||
about: Create a bug report
|
about: Create a bug report
|
||||||
title: ''
|
title: ''
|
||||||
labels: ''
|
labels: bug, needs triage
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Description
|
**Description:**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
<!--
|
**Task version:**
|
||||||
* Please share short description of the problem
|
Specify the task version
|
||||||
-->
|
|
||||||
|
|
||||||
### Details
|
**Platform:**
|
||||||
|
- [ ] Ubuntu
|
||||||
|
- [ ] macOS
|
||||||
|
- [ ] Windows
|
||||||
|
|
||||||
<!--
|
**Runner type:**
|
||||||
* Include the relevant yaml, platform, and dotnet versions in use
|
- [ ] Hosted
|
||||||
* If an error occurred on a public action, please share a link
|
- [ ] Self-hosted
|
||||||
* Include any error messages received in text (search does not work for images)
|
|
||||||
* Was this a regression from previous behavior?
|
**Repro steps:**
|
||||||
-->
|
A description with steps to reproduce the issue. If your have a public example or repo to share, please provide the link.
|
||||||
|
|
||||||
|
**Expected behavior:**
|
||||||
|
A description of what you expected to happen.
|
||||||
|
|
||||||
|
**Actual behavior:**
|
||||||
|
A description of what is actually happening.
|
||||||
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
blank_issues_enabled: true
|
blank_issues_enabled: false
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: .NET issues
|
- name: .NET issues
|
||||||
url: https://github.com/dotnet/runtime#filing-issues
|
url: https://github.com/dotnet/runtime#filing-issues
|
||||||
|
|||||||
16
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
16
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: feature request, needs triage
|
||||||
|
assignees: ''
|
||||||
|
---
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Describe your proposal.
|
||||||
|
|
||||||
|
**Justification:**
|
||||||
|
Justification or a use case for your proposal.
|
||||||
|
|
||||||
|
**Are you willing to submit a PR?**
|
||||||
|
<!--- We accept contributions! -->
|
||||||
9
.github/pull_request_template.md
vendored
Normal file
9
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
**Description:**
|
||||||
|
Describe your changes.
|
||||||
|
|
||||||
|
**Related issue:**
|
||||||
|
Add link to the related issue.
|
||||||
|
|
||||||
|
**Check list:**
|
||||||
|
- [ ] Mark if documentation changes are required.
|
||||||
|
- [ ] Mark if tests were added or updated to cover the changes.
|
||||||
17
.github/workflows/basic-validation.yml
vendored
Normal file
17
.github/workflows/basic-validation.yml
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
name: Basic validation
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths-ignore:
|
||||||
|
- '**.md'
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- releases/*
|
||||||
|
paths-ignore:
|
||||||
|
- '**.md'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
call-basic-validation:
|
||||||
|
name: Basic validation
|
||||||
|
uses: actions/reusable-workflows/.github/workflows/basic-validation.yml@main
|
||||||
17
.github/workflows/check-dist.yml
vendored
Normal file
17
.github/workflows/check-dist.yml
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
name: Check dist/
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths-ignore:
|
||||||
|
- '**.md'
|
||||||
|
pull_request:
|
||||||
|
paths-ignore:
|
||||||
|
- '**.md'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
call-check-dist:
|
||||||
|
name: Check dist/
|
||||||
|
uses: actions/reusable-workflows/.github/workflows/check-dist.yml@main
|
||||||
14
.github/workflows/codeql-analysis.yml
vendored
Normal file
14
.github/workflows/codeql-analysis.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
name: CodeQL analysis
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
pull_request:
|
||||||
|
branches: [main]
|
||||||
|
schedule:
|
||||||
|
- cron: '0 3 * * 0'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
call-codeQL-analysis:
|
||||||
|
name: CodeQL analysis
|
||||||
|
uses: actions/reusable-workflows/.github/workflows/codeql-analysis.yml@main
|
||||||
428
.github/workflows/e2e-tests.yml
vendored
Normal file
428
.github/workflows/e2e-tests.yml
vendored
Normal file
@@ -0,0 +1,428 @@
|
|||||||
|
name: e2e tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths-ignore:
|
||||||
|
- '**.md'
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- releases/*
|
||||||
|
paths-ignore:
|
||||||
|
- '**.md'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-setup-multiple-versions:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
- name: Setup dotnet 2.2.402, 3.1.404 and 3.0.x
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: |
|
||||||
|
2.2.402
|
||||||
|
3.1.404
|
||||||
|
3.0.x
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^2.2.402$", "^3.1.404$", "^3.0"
|
||||||
|
|
||||||
|
test-setup-full-version:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-22.04, windows-latest, macos-13]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
# Side-by-side install of 2.2 and 3.1 used for the test project
|
||||||
|
- name: Setup dotnet 2.2.402
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: 2.2.402
|
||||||
|
- name: Setup dotnet 3.1.201
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: 3.1.201
|
||||||
|
# We are including this variable to force the generation of the nuget config file to verify that it is created in the correct place
|
||||||
|
source-url: https://api.nuget.org/v3/index.json
|
||||||
|
env:
|
||||||
|
NUGET_AUTH_TOKEN: NOTATOKEN
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^3.1.201$", "^2.2.402$" -CheckNugetConfig
|
||||||
|
|
||||||
|
test-setup-without-patch-version:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
# 2.0, 3.0, 5.0 needs to be in single quotes to interpret as a string instead of as an integer
|
||||||
|
- name: Setup dotnet '3.1'
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: '3.1'
|
||||||
|
- name: Setup dotnet '2.2'
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: '2.2'
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^3.1", "^2.2"
|
||||||
|
|
||||||
|
test-setup-prerelease-version:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-22.04, windows-latest, macos-13]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
- name: Setup dotnet '3.1.100-preview1-014459'
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: '3.1.100-preview1-014459'
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "3.1.100-preview1-014459"
|
||||||
|
|
||||||
|
test-setup-latest-patch-version:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
- name: Setup dotnet 3.1.x
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: 3.1.x
|
||||||
|
- name: Setup dotnet 2.2.X
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: 2.2.X
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^2.2", "^3.1"
|
||||||
|
|
||||||
|
test-ABCxx-syntax:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
|
||||||
|
- name: Setup dotnet 6.0.4xx
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: '6.0.4xx'
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^6\.0\.4\d{2}"
|
||||||
|
|
||||||
|
test-setup-with-wildcard:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
- name: Setup dotnet 3.1.*
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: 3.1.*
|
||||||
|
- name: Setup dotnet 2.2.*
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: 2.2.*
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^3.1", "^2.2"
|
||||||
|
|
||||||
|
test-setup-global-json-specified-and-version:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
- name: Write global.json
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir subdirectory
|
||||||
|
echo '{"sdk":{"version": "2.2.207","rollForward": "latestFeature"}}' > ./subdirectory/global.json
|
||||||
|
- name: Setup dotnet
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: 3.1
|
||||||
|
global-json-file: ./subdirectory/global.json
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^2.2", "^3.1"
|
||||||
|
|
||||||
|
test-setup-global-json-only:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
- name: Write global.json
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir subdirectory
|
||||||
|
echo '{"sdk":{"version": "2.2.207","rollForward": "latestFeature"}}' > ./subdirectory/global.json
|
||||||
|
- name: Setup dotnet
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
global-json-file: ./subdirectory/global.json
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^2.2"
|
||||||
|
|
||||||
|
test-setup-with-dotnet-quality:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
|
||||||
|
- name: Setup dotnet 7.0 with preview quality
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: '7.0'
|
||||||
|
dotnet-quality: 'preview'
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^7\.0\.\d+-"
|
||||||
|
|
||||||
|
test-setup-with-cache:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-22.04, windows-latest, macos-latest]
|
||||||
|
env:
|
||||||
|
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
- name: Copy NuGet lock file to root
|
||||||
|
shell: bash
|
||||||
|
run: cp ./__tests__/e2e-test-csproj/packages.lock.json ./packages.lock.json
|
||||||
|
- name: Setup .NET Core 3.1
|
||||||
|
id: setup-dotnet
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: 3.1
|
||||||
|
cache: true
|
||||||
|
- name: Verify Cache
|
||||||
|
if: steps.setup-dotnet.outputs.cache-hit == 'true'
|
||||||
|
shell: bash
|
||||||
|
run: if [[ -e ${NUGET_PACKAGES} ]]; then exit 0; else exit 1; fi
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^3.1"
|
||||||
|
|
||||||
|
test-setup-with-cache-dependency-path:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-22.04, windows-latest, macos-latest]
|
||||||
|
env:
|
||||||
|
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
- name: Setup .NET Core 3.1
|
||||||
|
id: setup-dotnet
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: 3.1
|
||||||
|
cache: true
|
||||||
|
cache-dependency-path: './__tests__/e2e-test-csproj/packages.lock.json'
|
||||||
|
- name: Verify Cache
|
||||||
|
if: steps.setup-dotnet.outputs.cache-hit == 'true'
|
||||||
|
shell: bash
|
||||||
|
run: if [[ -e ${NUGET_PACKAGES} ]]; then exit 0; else exit 1; fi
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^3.1"
|
||||||
|
|
||||||
|
test-dotnet-version-output-during-single-version-installation:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
|
||||||
|
- name: Setup dotnet 6.0.401
|
||||||
|
uses: ./
|
||||||
|
id: step1
|
||||||
|
with:
|
||||||
|
dotnet-version: '6.0.401'
|
||||||
|
|
||||||
|
- name: Verify value of the dotnet-version output
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$version = & dotnet --version
|
||||||
|
Write-Host "Installed version: $version"
|
||||||
|
if (-not ($version -eq '${{steps.step1.outputs.dotnet-version}}')) { throw "Unexpected output value" }
|
||||||
|
|
||||||
|
test-dotnet-version-output-during-multiple-version-installation:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
|
||||||
|
- name: Setup dotnet 6.0.401, 5.0.408, 7.0.100-rc.1.22431.12
|
||||||
|
uses: ./
|
||||||
|
id: step2
|
||||||
|
with:
|
||||||
|
dotnet-version: |
|
||||||
|
7.0.100-rc.1.22431.12
|
||||||
|
6.0.401
|
||||||
|
5.0.408
|
||||||
|
|
||||||
|
- name: Verify value of the dotnet-version output
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$version = "7.0.100-rc.1.22431.12"
|
||||||
|
if (-not ($version -eq '${{steps.step2.outputs.dotnet-version}}')) { throw "Unexpected output value" }
|
||||||
|
|
||||||
|
test-proxy:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
container:
|
||||||
|
image: ubuntu:latest
|
||||||
|
options: --dns 127.0.0.1
|
||||||
|
services:
|
||||||
|
squid-proxy:
|
||||||
|
image: ubuntu/squid:latest
|
||||||
|
ports:
|
||||||
|
- 3128:3128
|
||||||
|
env:
|
||||||
|
https_proxy: http://squid-proxy:3128
|
||||||
|
http_proxy: http://squid-proxy:3128
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Install Powershell
|
||||||
|
run: |
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y wget apt-transport-https software-properties-common
|
||||||
|
wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb"
|
||||||
|
dpkg -i packages-microsoft-prod.deb
|
||||||
|
rm packages-microsoft-prod.deb
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y powershell
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
- name: Setup dotnet 6.0
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: 6.0
|
||||||
|
source-url: https://api.nuget.org/v3/index.json
|
||||||
|
env:
|
||||||
|
NUGET_AUTH_TOKEN: NOTATOKEN
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
__tests__/verify-dotnet.ps1 -Patterns "^6.0" -CheckNugetConfig
|
||||||
|
|
||||||
|
test-bypass-proxy:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
env:
|
||||||
|
https_proxy: http://no-such-proxy:3128
|
||||||
|
no_proxy: github.com,download.visualstudio.microsoft.com,api.nuget.org,builds.dotnet.microsoft.com,ci.dot.net
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
- name: Setup dotnet 3.1.201
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: 3.1.201
|
||||||
|
source-url: https://api.nuget.org/v3/index.json
|
||||||
|
env:
|
||||||
|
NUGET_AUTH_TOKEN: NOTATOKEN
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^3.1.201$" -CheckNugetConfig
|
||||||
25
.github/workflows/licensed.yml
vendored
25
.github/workflows/licensed.yml
vendored
@@ -1,20 +1,15 @@
|
|||||||
name: Licensed
|
name: Licensed
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push: {branches: main}
|
push:
|
||||||
pull_request: {branches: main}
|
branches:
|
||||||
|
- main
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
call-licensed:
|
||||||
runs-on: ubuntu-latest
|
name: Licensed
|
||||||
name: Check licenses
|
uses: actions/reusable-workflows/.github/workflows/licensed.yml@main
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- run: npm ci
|
|
||||||
- name: Install licensed
|
|
||||||
run: |
|
|
||||||
cd $RUNNER_TEMP
|
|
||||||
curl -Lfs -o licensed.tar.gz https://github.com/github/licensed/releases/download/2.12.2/licensed-2.12.2-linux-x64.tar.gz
|
|
||||||
sudo tar -xzf licensed.tar.gz
|
|
||||||
sudo mv licensed /usr/local/bin/licensed
|
|
||||||
- run: licensed status
|
|
||||||
|
|||||||
20
.github/workflows/publish-immutable-action.yml
vendored
Normal file
20
.github/workflows/publish-immutable-action.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
name: 'Publish Immutable Action Version'
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
packages: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checking out
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Publish
|
||||||
|
id: publish
|
||||||
|
uses: actions/publish-immutable-action@v0.0.4
|
||||||
20
.github/workflows/publish-immutable-actions.yml
vendored
Normal file
20
.github/workflows/publish-immutable-actions.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
name: 'Publish Immutable Action Version'
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
packages: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checking out
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Publish
|
||||||
|
id: publish
|
||||||
|
uses: actions/publish-immutable-action@v0.0.4
|
||||||
29
.github/workflows/release-new-action-version.yml
vendored
Normal file
29
.github/workflows/release-new-action-version.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
name: Release new action version
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [released]
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
TAG_NAME:
|
||||||
|
description: 'Tag name that the major tag will point to'
|
||||||
|
required: true
|
||||||
|
|
||||||
|
env:
|
||||||
|
TAG_NAME: ${{ github.event.inputs.TAG_NAME || github.event.release.tag_name }}
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update_tag:
|
||||||
|
name: Update the major tag to include the ${{ github.event.inputs.TAG_NAME || github.event.release.tag_name }} changes
|
||||||
|
environment:
|
||||||
|
name: releaseNewActionVersion
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Update the ${{ env.TAG_NAME }} tag
|
||||||
|
id: update-major-tag
|
||||||
|
uses: actions/publish-action@v0.2.2
|
||||||
|
with:
|
||||||
|
source-tag: ${{ env.TAG_NAME }}
|
||||||
|
slack-webhook: ${{ secrets.SLACK_WEBHOOK }}
|
||||||
35
.github/workflows/test-dotnet.yml
vendored
Normal file
35
.github/workflows/test-dotnet.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
name: Validate dotnet
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths-ignore:
|
||||||
|
- '**.md'
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- releases/*
|
||||||
|
paths-ignore:
|
||||||
|
- '**.md'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
setup-version:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
|
dotnet-version: ['2.1', '2.2', '3.0', '3.1', '5.0', '6.0', '7.0', '8.0']
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
- name: Setup dotnet ${{ matrix.dotnet-version }}
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: ${{ matrix.dotnet-version }}
|
||||||
|
- name: Verify installed version
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
__tests__/verify-dotnet.ps1 -Patterns "^${{ matrix.dotnet-version }}"
|
||||||
11
.github/workflows/update-config-files.yml
vendored
Normal file
11
.github/workflows/update-config-files.yml
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
name: Update configuration files
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 3 * * 0'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
call-update-configuration-files:
|
||||||
|
name: Update configuration files
|
||||||
|
uses: actions/reusable-workflows/.github/workflows/update-config-files.yml@main
|
||||||
130
.github/workflows/workflow.yml
vendored
130
.github/workflows/workflow.yml
vendored
@@ -1,130 +0,0 @@
|
|||||||
name: Main workflow
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
- releases/*
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ${{ matrix.operating-system }}
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
operating-system: [ubuntu-latest, windows-latest, macOS-latest]
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
- name: Set Node.js 12
|
|
||||||
uses: actions/setup-node@v1
|
|
||||||
with:
|
|
||||||
node-version: 12.x
|
|
||||||
- run: npm ci
|
|
||||||
- run: npm run build
|
|
||||||
- run: npm run format-check
|
|
||||||
- run: npm test
|
|
||||||
- name: Verify no unstaged changes
|
|
||||||
if: runner.os != 'windows'
|
|
||||||
run: __tests__/verify-no-unstaged-changes.sh
|
|
||||||
|
|
||||||
test:
|
|
||||||
runs-on: ${{ matrix.operating-system }}
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
operating-system: [ubuntu-latest, windows-latest, macOS-latest]
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
- name: Clear tool cache (macOS)
|
|
||||||
if: runner.os == 'macos'
|
|
||||||
run: |
|
|
||||||
echo $PATH
|
|
||||||
dotnet --info
|
|
||||||
rm -rf "/Users/runner/.dotnet"
|
|
||||||
- name: Clear tool cache (Ubuntu)
|
|
||||||
if: runner.os == 'linux'
|
|
||||||
run: |
|
|
||||||
echo $PATH
|
|
||||||
dotnet --info
|
|
||||||
rm -rf "/usr/share/dotnet"
|
|
||||||
- name: Clear tool cache (Windows)
|
|
||||||
if: runner.os == 'windows'
|
|
||||||
run: |
|
|
||||||
echo $env:PATH
|
|
||||||
dotnet --info
|
|
||||||
Remove-Item $env:LocalAppData\Microsoft\dotnet/* -Recurse -Force -ErrorAction SilentlyContinue
|
|
||||||
Remove-Item "$env:ProgramFiles\dotnet/*" -Recurse -Force -ErrorAction SilentlyContinue
|
|
||||||
# Side-by-side install of 2.2 and 3.1 used for the test project
|
|
||||||
- name: Setup dotnet 2.2.402
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
dotnet-version: 2.2.402
|
|
||||||
- name: Setup dotnet 3.1.201
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
dotnet-version: 3.1.201
|
|
||||||
# We are including this veriable to force the generation of the nuget config file to verify that it is created in the correct place
|
|
||||||
source-url: https://api.nuget.org/v3/index.json
|
|
||||||
env:
|
|
||||||
NUGET_AUTH_TOKEN: NOTATOKEN
|
|
||||||
- name: Verify dotnet
|
|
||||||
if: runner.os != 'windows'
|
|
||||||
run: __tests__/verify-dotnet.sh 3.1.201 2.2.402
|
|
||||||
- name: Verify dotnet (Windows)
|
|
||||||
if: runner.os == 'windows'
|
|
||||||
run: __tests__/verify-dotnet.ps1 3.1.201
|
|
||||||
|
|
||||||
test-proxy:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container:
|
|
||||||
image: mcr.microsoft.com/dotnet/core/runtime-deps:3.0-bionic
|
|
||||||
options: --dns 127.0.0.1
|
|
||||||
services:
|
|
||||||
squid-proxy:
|
|
||||||
image: datadog/squid:latest
|
|
||||||
ports:
|
|
||||||
- 3128:3128
|
|
||||||
env:
|
|
||||||
https_proxy: http://squid-proxy:3128
|
|
||||||
http_proxy: http://squid-proxy:3128
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
- name: Clear tool cache
|
|
||||||
run: rm -rf "/usr/share/dotnet"
|
|
||||||
- name: Install curl
|
|
||||||
run: |
|
|
||||||
apt update
|
|
||||||
apt -y install curl
|
|
||||||
- name: Setup dotnet 3.1.201
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
dotnet-version: 3.1.201
|
|
||||||
source-url: https://api.nuget.org/v3/index.json
|
|
||||||
env:
|
|
||||||
NUGET_AUTH_TOKEN: NOTATOKEN
|
|
||||||
- name: Verify dotnet
|
|
||||||
run: __tests__/verify-dotnet.sh 3.1.201
|
|
||||||
|
|
||||||
test-bypass-proxy:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
https_proxy: http://no-such-proxy:3128
|
|
||||||
no_proxy: github.com,dotnetcli.blob.core.windows.net,download.visualstudio.microsoft.com,api.nuget.org,dotnetcli.azureedge.net
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
- name: Clear tool cache
|
|
||||||
run: rm -rf "/usr/share/dotnet"
|
|
||||||
- name: Setup dotnet 3.1.201
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
dotnet-version: 3.1.201
|
|
||||||
source-url: https://api.nuget.org/v3/index.json
|
|
||||||
env:
|
|
||||||
NUGET_AUTH_TOKEN: NOTATOKEN
|
|
||||||
- name: Verify dotnet
|
|
||||||
run: __tests__/verify-dotnet.sh 3.1.201
|
|
||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -3,8 +3,8 @@ global.json
|
|||||||
lib/
|
lib/
|
||||||
node_modules/
|
node_modules/
|
||||||
__tests__/runner/*
|
__tests__/runner/*
|
||||||
__tests__/sample-csproj/bin/
|
__tests__/e2e-test-csproj/bin/
|
||||||
__tests__/sample-csproj/obj/
|
__tests__/e2e-test-csproj/obj/
|
||||||
|
|
||||||
# Rest of the file pulled from https://github.com/github/gitignore/blob/master/Node.gitignore
|
# Rest of the file pulled from https://github.com/github/gitignore/blob/master/Node.gitignore
|
||||||
# Logs
|
# Logs
|
||||||
|
|||||||
5
.husky/pre-commit
Executable file
5
.husky/pre-commit
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
. "$(dirname -- "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
npm run format
|
||||||
|
npm run lint:fix
|
||||||
6
.husky/pre-push
Executable file
6
.husky/pre-push
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
. "$(dirname -- "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
# Tests are not run at push time since they can take 2-4 minutes to complete
|
||||||
|
npm run format-check
|
||||||
|
npm run lint
|
||||||
@@ -3,6 +3,7 @@ sources:
|
|||||||
|
|
||||||
allowed:
|
allowed:
|
||||||
- apache-2.0
|
- apache-2.0
|
||||||
|
- 0bsd
|
||||||
- bsd-2-clause
|
- bsd-2-clause
|
||||||
- bsd-3-clause
|
- bsd-3-clause
|
||||||
- isc
|
- isc
|
||||||
@@ -11,4 +12,5 @@ allowed:
|
|||||||
- unlicense
|
- unlicense
|
||||||
|
|
||||||
reviewed:
|
reviewed:
|
||||||
npm:
|
npm:
|
||||||
|
- sax # ISC + MIT
|
||||||
|
|||||||
BIN
.licenses/npm/@actions/cache.dep.yml
generated
Normal file
BIN
.licenses/npm/@actions/cache.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@actions/core.dep.yml
generated
BIN
.licenses/npm/@actions/core.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/exec.dep.yml
generated
BIN
.licenses/npm/@actions/exec.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/glob-0.1.2.dep.yml
generated
Normal file
BIN
.licenses/npm/@actions/glob-0.1.2.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@actions/glob-0.3.0.dep.yml
generated
Normal file
BIN
.licenses/npm/@actions/glob-0.3.0.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@actions/http-client.dep.yml
generated
BIN
.licenses/npm/@actions/http-client.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/io.dep.yml
generated
BIN
.licenses/npm/@actions/io.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@azure/abort-controller.dep.yml
generated
Normal file
BIN
.licenses/npm/@azure/abort-controller.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@azure/core-auth.dep.yml
generated
Normal file
BIN
.licenses/npm/@azure/core-auth.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@azure/core-http.dep.yml
generated
Normal file
BIN
.licenses/npm/@azure/core-http.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@azure/core-lro.dep.yml
generated
Normal file
BIN
.licenses/npm/@azure/core-lro.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@azure/core-paging.dep.yml
generated
Normal file
BIN
.licenses/npm/@azure/core-paging.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@azure/core-tracing.dep.yml
generated
Normal file
BIN
.licenses/npm/@azure/core-tracing.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@azure/core-util.dep.yml
generated
Normal file
BIN
.licenses/npm/@azure/core-util.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@azure/logger.dep.yml
generated
Normal file
BIN
.licenses/npm/@azure/logger.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@azure/ms-rest-js.dep.yml
generated
Normal file
BIN
.licenses/npm/@azure/ms-rest-js.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@azure/storage-blob.dep.yml
generated
Normal file
BIN
.licenses/npm/@azure/storage-blob.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@fastify/busboy.dep.yml
generated
Normal file
BIN
.licenses/npm/@fastify/busboy.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@opentelemetry/api.dep.yml
generated
Normal file
BIN
.licenses/npm/@opentelemetry/api.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@protobuf-ts/plugin-framework.dep.yml
generated
Normal file
BIN
.licenses/npm/@protobuf-ts/plugin-framework.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@protobuf-ts/plugin.dep.yml
generated
Normal file
BIN
.licenses/npm/@protobuf-ts/plugin.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@protobuf-ts/protoc.dep.yml
generated
Normal file
BIN
.licenses/npm/@protobuf-ts/protoc.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@protobuf-ts/runtime-rpc.dep.yml
generated
Normal file
BIN
.licenses/npm/@protobuf-ts/runtime-rpc.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@protobuf-ts/runtime.dep.yml
generated
Normal file
BIN
.licenses/npm/@protobuf-ts/runtime.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@types/node-fetch.dep.yml
generated
Normal file
BIN
.licenses/npm/@types/node-fetch.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@types/node.dep.yml
generated
Normal file
BIN
.licenses/npm/@types/node.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@types/tunnel.dep.yml
generated
Normal file
BIN
.licenses/npm/@types/tunnel.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/abort-controller.dep.yml
generated
Normal file
BIN
.licenses/npm/abort-controller.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/asynckit.dep.yml
generated
Normal file
BIN
.licenses/npm/asynckit.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/balanced-match.dep.yml
generated
Normal file
BIN
.licenses/npm/balanced-match.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/brace-expansion.dep.yml
generated
Normal file
BIN
.licenses/npm/brace-expansion.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/combined-stream.dep.yml
generated
Normal file
BIN
.licenses/npm/combined-stream.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/concat-map.dep.yml
generated
Normal file
BIN
.licenses/npm/concat-map.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/delayed-stream.dep.yml
generated
Normal file
BIN
.licenses/npm/delayed-stream.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/event-target-shim.dep.yml
generated
Normal file
BIN
.licenses/npm/event-target-shim.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/events.dep.yml
generated
Normal file
BIN
.licenses/npm/events.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/fast-xml-parser.dep.yml
generated
BIN
.licenses/npm/fast-xml-parser.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/form-data-2.5.1.dep.yml
generated
Normal file
BIN
.licenses/npm/form-data-2.5.1.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/form-data-3.0.1.dep.yml
generated
Normal file
BIN
.licenses/npm/form-data-3.0.1.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/form-data-4.0.0.dep.yml
generated
Normal file
BIN
.licenses/npm/form-data-4.0.0.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/ip-regex.dep.yml
generated
Normal file
BIN
.licenses/npm/ip-regex.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/mime-db.dep.yml
generated
Normal file
BIN
.licenses/npm/mime-db.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/mime-types.dep.yml
generated
Normal file
BIN
.licenses/npm/mime-types.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/minimatch.dep.yml
generated
Normal file
BIN
.licenses/npm/minimatch.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/node-fetch.dep.yml
generated
BIN
.licenses/npm/node-fetch.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/process.dep.yml
generated
Normal file
BIN
.licenses/npm/process.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/psl.dep.yml
generated
Normal file
BIN
.licenses/npm/psl.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/punycode.dep.yml
generated
Normal file
BIN
.licenses/npm/punycode.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/sax.dep.yml
generated
Normal file
BIN
.licenses/npm/sax.dep.yml
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/signal-exit.dep.yml
generated
BIN
.licenses/npm/signal-exit.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/strnum.dep.yml
generated
Normal file
BIN
.licenses/npm/strnum.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/tough-cookie.dep.yml
generated
Normal file
BIN
.licenses/npm/tough-cookie.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/tr46.dep.yml
generated
Normal file
BIN
.licenses/npm/tr46.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/tslib-1.14.1.dep.yml
generated
Normal file
BIN
.licenses/npm/tslib-1.14.1.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/tslib-2.5.0.dep.yml
generated
Normal file
BIN
.licenses/npm/tslib-2.5.0.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/typescript.dep.yml
generated
Normal file
BIN
.licenses/npm/typescript.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/undici.dep.yml
generated
Normal file
BIN
.licenses/npm/undici.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/universal-user-agent-4.0.0.dep.yml
generated
BIN
.licenses/npm/universal-user-agent-4.0.0.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/uuid.dep.yml
generated
Normal file
BIN
.licenses/npm/uuid.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/webidl-conversions.dep.yml
generated
Normal file
BIN
.licenses/npm/webidl-conversions.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/whatwg-url.dep.yml
generated
Normal file
BIN
.licenses/npm/whatwg-url.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/xml2js.dep.yml
generated
Normal file
BIN
.licenses/npm/xml2js.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/xmlbuilder.dep.yml
generated
BIN
.licenses/npm/xmlbuilder.dep.yml
generated
Binary file not shown.
7
.prettierignore
Normal file
7
.prettierignore
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# Ignore list
|
||||||
|
/*
|
||||||
|
|
||||||
|
# Do not ignore these folders:
|
||||||
|
!__tests__/
|
||||||
|
!.github/
|
||||||
|
!src/
|
||||||
11
.prettierrc.js
Normal file
11
.prettierrc.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
// This is a reusable configuration file copied from https://github.com/actions/reusable-workflows/tree/main/reusable-configurations. Please don't make changes to this file as it's the subject of an automatic update.
|
||||||
|
module.exports = {
|
||||||
|
printWidth: 80,
|
||||||
|
tabWidth: 2,
|
||||||
|
useTabs: false,
|
||||||
|
semi: true,
|
||||||
|
singleQuote: true,
|
||||||
|
trailingComma: 'none',
|
||||||
|
bracketSpacing: false,
|
||||||
|
arrowParens: 'avoid'
|
||||||
|
};
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"printWidth": 80,
|
|
||||||
"tabWidth": 2,
|
|
||||||
"useTabs": false,
|
|
||||||
"semi": true,
|
|
||||||
"singleQuote": true,
|
|
||||||
"trailingComma": "none",
|
|
||||||
"bracketSpacing": false,
|
|
||||||
"arrowParens": "avoid",
|
|
||||||
"parser": "typescript"
|
|
||||||
}
|
|
||||||
76
CODE_OF_CONDUCT.md
Normal file
76
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to make participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, sex characteristics, gender identity and expression,
|
||||||
|
level of experience, education, socio-economic status, nationality, personal
|
||||||
|
appearance, race, religion, or sexual identity and orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies within all project spaces, and it also applies when
|
||||||
|
an individual is representing the project or its community in public spaces.
|
||||||
|
Examples of representing a project or community include using an official
|
||||||
|
project e-mail address, posting via an official social media account, or acting
|
||||||
|
as an appointed representative at an online or offline event. Representation of
|
||||||
|
a project may be further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at opensource+actions/setup-dotnet@github.com. All
|
||||||
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
||||||
|
|
||||||
|
For answers to common questions about this code of conduct, see
|
||||||
|
https://www.contributor-covenant.org/faq
|
||||||
294
README.md
294
README.md
@@ -1,92 +1,208 @@
|
|||||||
# setup-dotnet
|
# setup-dotnet
|
||||||
|
|
||||||
<p align="left">
|
[](https://github.com/actions/setup-dotnet/actions/workflows/basic-validation.yml)
|
||||||
<a href="https://github.com/actions/setup-dotnet"><img alt="GitHub Actions status" src="https://github.com/actions/setup-dotnet/workflows/Main%20workflow/badge.svg"></a>
|
[](https://github.com/actions/setup-dotnet/actions/workflows/e2e-tests.yml)
|
||||||
</p>
|
|
||||||
|
|
||||||
This action sets up a [dotnet core cli](https://github.com/dotnet/cli) environment for use in actions by:
|
This action sets up a [.NET CLI](https://github.com/dotnet/sdk) environment for use in actions by:
|
||||||
|
|
||||||
- optionally downloading and caching a version of dotnet by SDK version and adding to PATH
|
- optionally downloading and caching a version(s) of dotnet by SDK version(s) and adding to PATH
|
||||||
- registering problem matchers for error output
|
- registering problem matchers for error output
|
||||||
- setting up authentication to private package sources like GitHub Packages
|
- setting up authentication to private package sources like GitHub Packages
|
||||||
|
|
||||||
Please Note: GitHub hosted runners have some versions of the .NET SDK
|
> **Note**: GitHub hosted runners have some versions of the .NET SDK
|
||||||
preinstalled. Installed versions are subject to change. Please refer to the
|
preinstalled. Installed versions are subject to change. Please refer to the
|
||||||
documentation
|
documentation:
|
||||||
[software installed on github hosted runners](https://help.github.com/en/actions/reference/software-installed-on-github-hosted-runners)
|
[Software installed on github hosted runners](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software)
|
||||||
for .NET SDK versions that are currently available.
|
for .NET SDK versions that are currently available.
|
||||||
|
|
||||||
# Usage
|
## Usage
|
||||||
|
|
||||||
See [action.yml](action.yml)
|
See [action.yml](action.yml)
|
||||||
|
|
||||||
Basic:
|
**Basic**:
|
||||||
```yaml
|
```yaml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@main
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-dotnet@v1
|
- uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
dotnet-version: '3.1.x' # SDK Version to use; x will use the latest version of the 3.1 channel
|
dotnet-version: '3.1.x'
|
||||||
|
- run: dotnet build <my project>
|
||||||
|
```
|
||||||
|
> **Warning**: Unless a concrete version is specified in the [`global.json`](https://learn.microsoft.com/en-us/dotnet/core/tools/global-json) file, **_the latest .NET version installed on the runner (including preinstalled versions) will be used [by default](https://learn.microsoft.com/en-us/dotnet/core/versions/selection#the-sdk-uses-the-latest-installed-version)_**. Please refer to the [documentation](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software) for the currently preinstalled .NET SDK versions.
|
||||||
|
|
||||||
|
**Multiple version installation**:
|
||||||
|
```yml
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Setup dotnet
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: |
|
||||||
|
3.1.x
|
||||||
|
5.0.x
|
||||||
|
- run: dotnet build <my project>
|
||||||
|
```
|
||||||
|
## Supported version syntax
|
||||||
|
|
||||||
|
The `dotnet-version` input supports following syntax:
|
||||||
|
|
||||||
|
- **A.B.C** (e.g 6.0.400, 7.0.100-preview.7.22377.5) - installs exact version of .NET SDK
|
||||||
|
- **A.B** or **A.B.x** (e.g. 3.1, 3.1.x) - installs the latest patch version of .NET SDK on the channel `3.1`, including prerelease versions (preview, rc)
|
||||||
|
- **A** or **A.x** (e.g. 3, 3.x) - installs the latest minor version of the specified major tag, including prerelease versions (preview, rc)
|
||||||
|
- **A.B.Cxx** (e.g. 6.0.4xx) - available since `.NET 5.0` release. Installs the latest version of the specific SDK release, including prerelease versions (preview, rc).
|
||||||
|
|
||||||
|
|
||||||
|
## Using the `dotnet-quality` input
|
||||||
|
This input sets up the action to install the latest build of the specified quality in the channel. The possible values of `dotnet-quality` are: **daily**, **signed**, **validated**, **preview**, **ga**.
|
||||||
|
|
||||||
|
> **Note**: `dotnet-quality` input can be used only with .NET SDK version in 'A.B', 'A.B.x', 'A', 'A.x' and 'A.B.Cxx' formats where the major version is higher than 5. In other cases, `dotnet-quality` input will be ignored.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: '6.0.x'
|
||||||
|
dotnet-quality: 'preview'
|
||||||
- run: dotnet build <my project>
|
- run: dotnet build <my project>
|
||||||
```
|
```
|
||||||
|
|
||||||
Matrix Testing:
|
## Using the `global-json-file` input
|
||||||
|
`setup-dotnet` action can read .NET SDK version from a `global.json` file. Input `global-json-file` is used for specifying the path to the `global.json`. If the file that was supplied to `global-json-file` input doesn't exist, the action will fail with error.
|
||||||
|
|
||||||
|
>**Note**: In case both `dotnet-version` and `global-json-file` inputs are used, versions from both inputs will be installed.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
global-json-file: csharp/global.json
|
||||||
|
- run: dotnet build <my project>
|
||||||
|
working-directory: csharp
|
||||||
|
```
|
||||||
|
|
||||||
|
## Caching NuGet Packages
|
||||||
|
The action has a built-in functionality for caching and restoring dependencies. It uses [toolkit/cache](https://github.com/actions/toolkit/tree/main/packages/cache) under the hood for caching global packages data but requires less configuration settings. The `cache` input is optional, and caching is turned off by default.
|
||||||
|
|
||||||
|
The action searches for [NuGet Lock files](https://learn.microsoft.com/nuget/consume-packages/package-references-in-project-files#locking-dependencies) (`packages.lock.json`) in the repository root, calculates their hash and uses it as a part of the cache key. If lock file does not exist, this action throws error. Use `cache-dependency-path` for cases when multiple dependency files are used, or they are located in different subdirectories.
|
||||||
|
|
||||||
|
> **Warning**: Caching NuGet packages is available since .NET SDK 2.1.500 and 2.2.100 as the NuGet lock file [is available](https://learn.microsoft.com/nuget/consume-packages/package-references-in-project-files#locking-dependencies) only for NuGet 4.9 and above.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 6.x
|
||||||
|
cache: true
|
||||||
|
- run: dotnet restore --locked-mode
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note**: This action will only restore `global-packages` folder, so you will probably get the [NU1403](https://learn.microsoft.com/nuget/reference/errors-and-warnings/nu1403) error when running `dotnet restore`.
|
||||||
|
> To avoid this, you can use [`DisableImplicitNuGetFallbackFolder`](https://github.com/dotnet/reproducible-builds/blob/abfe986832aa28597d3340b92469d1a702013d23/Documentation/Reproducible-MSBuild/Techniques/DisableImplicitNuGetFallbackFolder.md) option.
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<PropertyGroup>
|
||||||
|
<DisableImplicitNuGetFallbackFolder>true</DisableImplicitNuGetFallbackFolder>
|
||||||
|
</PropertyGroup>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Reduce caching size
|
||||||
|
|
||||||
|
> **Note**: Use [`NUGET_PACKAGES`](https://learn.microsoft.com/nuget/reference/cli-reference/cli-ref-environment-variables) environment variable if available. Some action runners already has huge libraries. (ex. Xamarin)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
env:
|
||||||
|
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 6.x
|
||||||
|
cache: true
|
||||||
|
- run: dotnet restore --locked-mode
|
||||||
|
```
|
||||||
|
|
||||||
|
### Caching NuGet packages in monorepos
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
env:
|
||||||
|
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 6.x
|
||||||
|
cache: true
|
||||||
|
cache-dependency-path: subdir/packages.lock.json
|
||||||
|
- run: dotnet restore --locked-mode
|
||||||
|
```
|
||||||
|
|
||||||
|
## Matrix Testing
|
||||||
|
Using `setup-dotnet` it's possible to use [matrix syntax](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix) to install several versions of .NET SDK:
|
||||||
|
```yml
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
dotnet: [ '2.2.103', '3.0', '3.1.x' ]
|
dotnet: [ '2.1.x', '3.1.x', '5.0.x' ]
|
||||||
name: Dotnet ${{ matrix.dotnet }} sample
|
name: Dotnet ${{ matrix.dotnet }} sample
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- name: Setup dotnet
|
- name: Setup dotnet
|
||||||
uses: actions/setup-dotnet@v1
|
uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
dotnet-version: ${{ matrix.dotnet }}
|
dotnet-version: ${{ matrix.dotnet }}
|
||||||
- run: dotnet build <my project>
|
- name: Execute dotnet
|
||||||
|
run: dotnet build <my project>
|
||||||
```
|
```
|
||||||
|
>**Note**: Unless a concrete version is specified in the [`global.json`](https://learn.microsoft.com/en-us/dotnet/core/tools/global-json) file, the latest .NET version installed on the runner (including preinstalled versions) will be used [by default](https://learn.microsoft.com/en-us/dotnet/core/versions/selection#the-sdk-uses-the-latest-installed-version). To control this behavior you may want to use temporary `global.json` files:
|
||||||
|
|
||||||
Side by Side Testing:
|
**Matrix testing with temporary global.json creation**
|
||||||
```yaml
|
```yml
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: Dotnet Side by Side testing sample
|
strategy:
|
||||||
|
matrix:
|
||||||
|
dotnet: [ '2.1.x', '3.1.x', '5.0.x' ]
|
||||||
|
name: Dotnet ${{ matrix.dotnet }} sample
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- name: Setup dotnet
|
- name: Setup dotnet
|
||||||
uses: actions/setup-dotnet@v1
|
uses: actions/setup-dotnet@v3
|
||||||
|
id: stepid
|
||||||
with:
|
with:
|
||||||
dotnet-version: '2.2.103'
|
dotnet-version: ${{ matrix.dotnet }}
|
||||||
- name: Setup dotnet
|
- name: Create temporary global.json
|
||||||
uses: actions/setup-dotnet@v1
|
run: echo '{"sdk":{"version": "${{ steps.stepid.outputs.dotnet-version }}"}}' > ./global.json
|
||||||
with:
|
- name: Execute dotnet
|
||||||
dotnet-version: '3.1.x'
|
run: dotnet build <my project>
|
||||||
- run: dotnet build <my project>
|
|
||||||
- run: dotnet test <my project>
|
|
||||||
```
|
```
|
||||||
|
## Setting up authentication for nuget feeds
|
||||||
|
|
||||||
Authentication for nuget feeds:
|
### Github Package Registry (GPR)
|
||||||
```yaml
|
```yml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
# Authenticates packages to push to GPR
|
- uses: actions/setup-dotnet@v3
|
||||||
- uses: actions/setup-dotnet@v1
|
|
||||||
with:
|
with:
|
||||||
dotnet-version: '3.1.x' # SDK Version to use.
|
dotnet-version: '3.1.x'
|
||||||
source-url: https://nuget.pkg.github.com/<owner>/index.json
|
source-url: https://nuget.pkg.github.com/<owner>/index.json
|
||||||
env:
|
env:
|
||||||
NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||||
- run: dotnet build <my project>
|
- run: dotnet build <my project>
|
||||||
- name: Create the package
|
- name: Create the package
|
||||||
run: dotnet pack --configuration Release <my project>
|
run: dotnet pack --configuration Release <my project>
|
||||||
- name: Publish the package to GPR
|
- name: Publish the package to GPR
|
||||||
run: dotnet nuget push <my project>/bin/Release/*.nupkg
|
run: dotnet nuget push <my project>/bin/Release/*.nupkg
|
||||||
|
```
|
||||||
|
|
||||||
# Authticates packages to push to Azure Artifacts
|
### Azure Artifacts
|
||||||
- uses: actions/setup-dotnet@v1
|
```yml
|
||||||
|
- uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
source-url: https://pkgs.dev.azure.com/<your-organization>/_packaging/<your-feed-name>/nuget/v3/index.json
|
source-url: https://pkgs.dev.azure.com/<your-organization>/_packaging/<your-feed-name>/nuget/v3/index.json
|
||||||
env:
|
env:
|
||||||
@@ -95,31 +211,107 @@ steps:
|
|||||||
run: dotnet nuget push <my project>/bin/Release/*.nupkg
|
run: dotnet nuget push <my project>/bin/Release/*.nupkg
|
||||||
```
|
```
|
||||||
|
|
||||||
## Environment Variables to use with dotnet
|
### nuget.org
|
||||||
|
```yml
|
||||||
|
- uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 3.1.x
|
||||||
|
- name: Publish the package to nuget.org
|
||||||
|
run: dotnet nuget push */bin/Release/*.nupkg -k $NUGET_AUTH_TOKEN -s https://api.nuget.org/v3/index.json
|
||||||
|
env:
|
||||||
|
NUGET_AUTH_TOKEN: ${{ secrets.NUGET_TOKEN }}
|
||||||
|
```
|
||||||
|
> **Note**: It's the only way to push a package to nuget.org feed for macOS/Linux machines due to API key config store limitations.
|
||||||
|
|
||||||
Some environment variables may be necessary for your particular case or to improve logging. Some examples are listed below, but the full list with complete details can be found here: https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet#environment-variables
|
# Outputs and environment variables
|
||||||
|
|
||||||
- DOTNET_NOLOGO - removes logo and telemetry message from first run of dotnet cli (default: false)
|
## Outputs
|
||||||
- DOTNET_CLI_TELEMETRY_OPTOUT - opt-out of telemetry being sent to Microsoft (default: false)
|
|
||||||
- DOTNET_MULTILEVEL_LOOKUP - configures whether the global install location is used as a fall-back (default: true)
|
### `dotnet-version`
|
||||||
|
|
||||||
|
Using the **dotnet-version** output it's possible to get the installed by the action .NET SDK version.
|
||||||
|
|
||||||
|
**Single version installation**
|
||||||
|
|
||||||
|
In case of a single version installation, the `dotnet-version` output contains the version that is installed by the action.
|
||||||
|
|
||||||
Example usage:
|
|
||||||
```yaml
|
```yaml
|
||||||
|
- uses: actions/setup-dotnet@v3
|
||||||
|
id: stepid
|
||||||
|
with:
|
||||||
|
dotnet-version: 3.1.422
|
||||||
|
- run: echo '${{ steps.stepid.outputs.dotnet-version }}' # outputs 3.1.422
|
||||||
|
```
|
||||||
|
|
||||||
|
**Multiple version installation**
|
||||||
|
|
||||||
|
In case of a multiple version installation, the `dotnet-version` output contains the latest version that is installed by the action.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: actions/setup-dotnet@v3
|
||||||
|
id: stepid
|
||||||
|
with:
|
||||||
|
dotnet-version: |
|
||||||
|
3.1.422
|
||||||
|
5.0.408
|
||||||
|
- run: echo '${{ steps.stepid.outputs.dotnet-version }}' # outputs 5.0.408
|
||||||
|
```
|
||||||
|
**Installation from global.json**
|
||||||
|
|
||||||
|
When the `dotnet-version` input is used along with the `global-json-file` input, the `dotnet-version` output contains the version resolved from the `global.json`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: actions/setup-dotnet@v3
|
||||||
|
id: stepid
|
||||||
|
with:
|
||||||
|
dotnet-version: |
|
||||||
|
3.1.422
|
||||||
|
5.0.408
|
||||||
|
global-json-file: "./global.json" # contains version 2.2.207
|
||||||
|
- run: echo '${{ steps.stepid.outputs.dotnet-version }}' # outputs 2.2.207
|
||||||
|
```
|
||||||
|
|
||||||
|
### `cache-hit`
|
||||||
|
A boolean value to indicate an exact match was found for the cache key (follows [actions/cache](https://github.com/actions/cache#outputs))
|
||||||
|
|
||||||
|
## Environment variables
|
||||||
|
|
||||||
|
Some environment variables may be necessary for your particular case or to improve logging. Some examples are listed below, but the full list with complete details can be found here: https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-environment-variables
|
||||||
|
|
||||||
|
| **Env.variable** | **Description** | **Default value** |
|
||||||
|
| ----------- | ----------- | ----------- |
|
||||||
|
| DOTNET_INSTALL_DIR |Specifies a directory where .NET SDKs should be installed by the action.|*default value for each OS* |
|
||||||
|
| DOTNET_NOLOGO |Removes logo and telemetry message from first run of dotnet cli|*false*|
|
||||||
|
| DOTNET_CLI_TELEMETRY_OPTOUT |Opt-out of telemetry being sent to Microsoft|*false*|
|
||||||
|
| DOTNET_MULTILEVEL_LOOKUP |Configures whether the global install location is used as a fall-back|*true*|
|
||||||
|
| NUGET_PACKAGES |Configures a path to the [NuGet `global-packages` folder](https://learn.microsoft.com/nuget/consume-packages/managing-the-global-packages-and-cache-folders)|*default value for each OS* |
|
||||||
|
|
||||||
|
The default values of the `DOTNET_INSTALL_DIR` and `NUGET_PACKAGES` environment variables depend on the operation system which is used on a runner:
|
||||||
|
| **Operation system** | `DOTNET_INSTALL_DIR` | `NUGET_PACKAGES` |
|
||||||
|
| ----------- | ----------- | ----------- |
|
||||||
|
| **Windows** | `C:\Program Files\dotnet` | `%userprofile%\.nuget\packages` |
|
||||||
|
| **Ubuntu** | `/usr/share/dotnet` | `~/.nuget/packages` |
|
||||||
|
| **macOS** | `/Users/runner/.dotnet` | `~/.nuget/packages` |
|
||||||
|
|
||||||
|
**Example usage of environment variable**:
|
||||||
|
```yml
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
DOTNET_NOLOGO: true
|
DOTNET_INSTALL_DIR: "path/to/directory"
|
||||||
|
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@main
|
- uses: actions/checkout@main
|
||||||
- uses: actions/setup-dotnet@v1
|
- uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
dotnet-version: '3.1.100' # SDK Version to use.
|
dotnet-version: '3.1.x'
|
||||||
|
cache: true
|
||||||
```
|
```
|
||||||
|
|
||||||
# License
|
## License
|
||||||
|
|
||||||
The scripts and documentation in this project are released under the [MIT License](LICENSE)
|
The scripts and documentation in this project are released under the [MIT License](LICENSE)
|
||||||
|
|
||||||
# Contributions
|
## Contributions
|
||||||
|
|
||||||
Contributions are welcome! See [Contributor's Guide](docs/contributors.md)
|
Contributions are welcome! See [Contributor's Guide](docs/contributors.md)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
exports[`authutil tests Existing config not in repo root, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config not in repo root, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version=\\"1.0\\"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
@@ -15,7 +15,7 @@ exports[`authutil tests Existing config not in repo root, sets up a partial NuGe
|
|||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests Existing config w/ Azure Artifacts source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config w/ Azure Artifacts source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version=\\"1.0\\"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
@@ -30,7 +30,7 @@ exports[`authutil tests Existing config w/ Azure Artifacts source and NuGet.org,
|
|||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests Existing config w/ GPR source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config w/ GPR source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version=\\"1.0\\"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
@@ -45,7 +45,7 @@ exports[`authutil tests Existing config w/ GPR source and NuGet.org, sets up a p
|
|||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests Existing config w/ no GPR sources, sets up a full NuGet.config with URL and user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config w/ no GPR sources, sets up a full NuGet.config with URL and user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version=\\"1.0\\"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
@@ -63,7 +63,7 @@ exports[`authutil tests Existing config w/ no GPR sources, sets up a full NuGet.
|
|||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests Existing config w/ no sources, sets up a full NuGet.config with URL and user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config w/ no sources, sets up a full NuGet.config with URL and user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version=\\"1.0\\"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
@@ -81,7 +81,7 @@ exports[`authutil tests Existing config w/ no sources, sets up a full NuGet.conf
|
|||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests Existing config w/ only Azure Artifacts source, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config w/ only Azure Artifacts source, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version=\\"1.0\\"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
@@ -96,7 +96,7 @@ exports[`authutil tests Existing config w/ only Azure Artifacts source, sets up
|
|||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests Existing config w/ only GPR source, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config w/ only GPR source, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version=\\"1.0\\"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
@@ -111,7 +111,7 @@ exports[`authutil tests Existing config w/ only GPR source, sets up a partial Nu
|
|||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests Existing config w/ two GPR sources, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config w/ two GPR sources, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version=\\"1.0\\"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
@@ -130,7 +130,7 @@ exports[`authutil tests Existing config w/ two GPR sources, sets up a partial Nu
|
|||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests No existing config, sets up a full NuGet.config with URL and other owner/PAT for GPR 1`] = `
|
exports[`authutil tests no existing config, sets up a full NuGet.config with URL and other owner/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version=\\"1.0\\"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
@@ -148,7 +148,7 @@ exports[`authutil tests No existing config, sets up a full NuGet.config with URL
|
|||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests No existing config, sets up a full NuGet.config with URL and token for other source 1`] = `
|
exports[`authutil tests no existing config, sets up a full NuGet.config with URL and token for other source 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version=\\"1.0\\"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
@@ -166,7 +166,7 @@ exports[`authutil tests No existing config, sets up a full NuGet.config with URL
|
|||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests No existing config, sets up a full NuGet.config with URL and user/PAT for GPR 1`] = `
|
exports[`authutil tests no existing config, sets up a full NuGet.config with URL and user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version=\\"1.0\\"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
|
|||||||
@@ -1,340 +1,336 @@
|
|||||||
import io = require('@actions/io');
|
import * as io from '@actions/io';
|
||||||
import fs = require('fs');
|
import fs from 'fs';
|
||||||
import path = require('path');
|
import path from 'path';
|
||||||
|
|
||||||
const fakeSourcesDirForTesting = path.join(
|
const fakeSourcesDirForTesting = path.join(
|
||||||
__dirname,
|
__dirname,
|
||||||
'runner',
|
'runner',
|
||||||
path.join(
|
path.join(Math.random().toString(36).substring(7)),
|
||||||
Math.random()
|
's'
|
||||||
.toString(36)
|
);
|
||||||
.substring(7)
|
|
||||||
),
|
const invalidNuGetConfig = `<?xml version="1.0" encoding="utf-8"?>`;
|
||||||
's'
|
|
||||||
);
|
const emptyNuGetConfig = `<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
const invalidNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?>`;
|
</configuration>`;
|
||||||
|
|
||||||
const emptyNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?>
|
const nugetorgNuGetConfig = `<?xml version="1.0" encoding="utf-8"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
</configuration>`;
|
<packageSources>
|
||||||
|
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
|
||||||
const nugetorgNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?>
|
</packageSources>
|
||||||
<configuration>
|
</configuration>`;
|
||||||
<packageSources>
|
|
||||||
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
|
const gprnugetorgNuGetConfig = `<?xml version="1.0" encoding="utf-8"?>
|
||||||
</packageSources>
|
<configuration>
|
||||||
</configuration>`;
|
<packageSources>
|
||||||
|
<add key="GPR" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" />
|
||||||
const gprnugetorgNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?>
|
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
|
||||||
<configuration>
|
</packageSources>
|
||||||
<packageSources>
|
</configuration>`;
|
||||||
<add key="GPR" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" />
|
|
||||||
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
|
const gprNuGetConfig = `<?xml version="1.0" encoding="utf-8"?>
|
||||||
</packageSources>
|
<configuration>
|
||||||
</configuration>`;
|
<packageSources>
|
||||||
|
<add key="GPR" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" />
|
||||||
const gprNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?>
|
</packageSources>
|
||||||
<configuration>
|
</configuration>`;
|
||||||
<packageSources>
|
|
||||||
<add key="GPR" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" />
|
const twogprNuGetConfig = `<?xml version="1.0" encoding="utf-8"?>
|
||||||
</packageSources>
|
<configuration>
|
||||||
</configuration>`;
|
<packageSources>
|
||||||
|
<add key="GPR-GitHub" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" />
|
||||||
const twogprNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?>
|
<add key="GPR-Actions" value="https://nuget.pkg.github.com/actions/index.json" protocolVersion="3" />
|
||||||
<configuration>
|
</packageSources>
|
||||||
<packageSources>
|
</configuration>`;
|
||||||
<add key="GPR-GitHub" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" />
|
|
||||||
<add key="GPR-Actions" value="https://nuget.pkg.github.com/actions/index.json" protocolVersion="3" />
|
const spaceNuGetConfig = `<?xml version="1.0" encoding="utf-8"?>
|
||||||
</packageSources>
|
<configuration>
|
||||||
</configuration>`;
|
<packageSources>
|
||||||
|
<add key="GPR GitHub" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" />
|
||||||
const spaceNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?>
|
</packageSources>
|
||||||
<configuration>
|
</configuration>`;
|
||||||
<packageSources>
|
|
||||||
<add key="GPR GitHub" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" />
|
const azureartifactsNuGetConfig = `<?xml version="1.0" encoding="utf-8"?>
|
||||||
</packageSources>
|
<configuration>
|
||||||
</configuration>`;
|
<packageSources>
|
||||||
|
<add key="AzureArtifacts" value="https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json" protocolVersion="3" />
|
||||||
const azureartifactsNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?>
|
</packageSources>
|
||||||
<configuration>
|
</configuration>`;
|
||||||
<packageSources>
|
|
||||||
<add key="AzureArtifacts" value="https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json" protocolVersion="3" />
|
const azureartifactsnugetorgNuGetConfig = `<?xml version="1.0" encoding="utf-8"?>
|
||||||
</packageSources>
|
<configuration>
|
||||||
</configuration>`;
|
<packageSources>
|
||||||
|
<add key="AzureArtifacts" value="https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json" protocolVersion="3" />
|
||||||
const azureartifactsnugetorgNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?>
|
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
|
||||||
<configuration>
|
</packageSources>
|
||||||
<packageSources>
|
</configuration>`;
|
||||||
<add key="AzureArtifacts" value="https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json" protocolVersion="3" />
|
|
||||||
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
|
// We want a NuGet.config one level above the sources directory, so it doesn't trample a user's NuGet.config but is still picked up by NuGet/dotnet.
|
||||||
</packageSources>
|
const nugetConfigFile = path.join(fakeSourcesDirForTesting, '../nuget.config');
|
||||||
</configuration>`;
|
|
||||||
|
process.env['GITHUB_REPOSITORY'] = 'OwnerName/repo';
|
||||||
// We want a NuGet.config one level above the sources directory, so it doesn't trample a user's NuGet.config but is still picked up by NuGet/dotnet.
|
import * as auth from '../src/authutil';
|
||||||
const nugetConfigFile = path.join(fakeSourcesDirForTesting, '../nuget.config');
|
|
||||||
|
describe('authutil tests', () => {
|
||||||
process.env['GITHUB_REPOSITORY'] = 'OwnerName/repo';
|
beforeEach(async () => {
|
||||||
import * as auth from '../src/authutil';
|
await io.rmRF(fakeSourcesDirForTesting);
|
||||||
|
await io.mkdirP(fakeSourcesDirForTesting);
|
||||||
describe('authutil tests', () => {
|
}, 30000);
|
||||||
beforeEach(async () => {
|
|
||||||
await io.rmRF(fakeSourcesDirForTesting);
|
afterAll(async () => {
|
||||||
await io.mkdirP(fakeSourcesDirForTesting);
|
await io.rmRF(fakeSourcesDirForTesting);
|
||||||
}, 30000);
|
}, 30000);
|
||||||
|
|
||||||
afterAll(async () => {
|
beforeEach(() => {
|
||||||
await io.rmRF(fakeSourcesDirForTesting);
|
if (fs.existsSync(nugetConfigFile)) {
|
||||||
}, 30000);
|
fs.unlinkSync(nugetConfigFile);
|
||||||
|
}
|
||||||
beforeEach(() => {
|
process.env['INPUT_OWNER'] = '';
|
||||||
if (fs.existsSync(nugetConfigFile)) {
|
process.env['NUGET_AUTH_TOKEN'] = '';
|
||||||
fs.unlinkSync(nugetConfigFile);
|
});
|
||||||
}
|
|
||||||
process.env['INPUT_OWNER'] = '';
|
it('no existing config, sets up a full NuGet.config with URL and user/PAT for GPR', async () => {
|
||||||
process.env['NUGET_AUTH_TOKEN'] = '';
|
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
||||||
});
|
auth.configAuthentication(
|
||||||
|
'https://nuget.pkg.github.com/OwnerName/index.json',
|
||||||
it('No existing config, sets up a full NuGet.config with URL and user/PAT for GPR', async () => {
|
'',
|
||||||
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
fakeSourcesDirForTesting
|
||||||
await auth.configAuthentication(
|
);
|
||||||
'https://nuget.pkg.github.com/OwnerName/index.json',
|
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
||||||
'',
|
expect(
|
||||||
fakeSourcesDirForTesting
|
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
||||||
);
|
).toMatchSnapshot();
|
||||||
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
});
|
||||||
expect(
|
|
||||||
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
it('no existing config, auth token environment variable not provided, throws', async () => {
|
||||||
).toMatchSnapshot();
|
let thrown = false;
|
||||||
});
|
try {
|
||||||
|
auth.configAuthentication(
|
||||||
it('No existing config, auth token environment variable not provided, throws', async () => {
|
'https://nuget.pkg.github.com/OwnerName/index.json',
|
||||||
let thrown = false;
|
'',
|
||||||
try {
|
fakeSourcesDirForTesting
|
||||||
await auth.configAuthentication(
|
);
|
||||||
'https://nuget.pkg.github.com/OwnerName/index.json',
|
} catch {
|
||||||
'',
|
thrown = true;
|
||||||
fakeSourcesDirForTesting
|
}
|
||||||
);
|
expect(thrown).toBe(true);
|
||||||
} catch {
|
});
|
||||||
thrown = true;
|
|
||||||
}
|
it('no existing config, sets up a full NuGet.config with URL and other owner/PAT for GPR', async () => {
|
||||||
expect(thrown).toBe(true);
|
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
||||||
});
|
process.env['INPUT_OWNER'] = 'otherorg';
|
||||||
|
auth.configAuthentication(
|
||||||
it('No existing config, sets up a full NuGet.config with URL and other owner/PAT for GPR', async () => {
|
'https://nuget.pkg.github.com/otherorg/index.json',
|
||||||
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
'',
|
||||||
process.env['INPUT_OWNER'] = 'otherorg';
|
fakeSourcesDirForTesting
|
||||||
await auth.configAuthentication(
|
);
|
||||||
'https://nuget.pkg.github.com/otherorg/index.json',
|
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
||||||
'',
|
expect(
|
||||||
fakeSourcesDirForTesting
|
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
||||||
);
|
).toMatchSnapshot();
|
||||||
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
});
|
||||||
expect(
|
|
||||||
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
it('existing config (invalid), tries to parse an invalid NuGet.config and throws', async () => {
|
||||||
).toMatchSnapshot();
|
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
||||||
});
|
const inputNuGetConfigPath: string = path.join(
|
||||||
|
fakeSourcesDirForTesting,
|
||||||
it('Existing config (invalid), tries to parse an invalid NuGet.config and throws', async () => {
|
'nuget.config'
|
||||||
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
);
|
||||||
const inputNuGetConfigPath: string = path.join(
|
fs.writeFileSync(inputNuGetConfigPath, invalidNuGetConfig);
|
||||||
fakeSourcesDirForTesting,
|
let thrown = false;
|
||||||
'nuget.config'
|
try {
|
||||||
);
|
auth.configAuthentication(
|
||||||
fs.writeFileSync(inputNuGetConfigPath, invalidNuGetConfig);
|
'https://nuget.pkg.github.com/OwnerName/index.json',
|
||||||
let thrown = false;
|
'',
|
||||||
try {
|
fakeSourcesDirForTesting
|
||||||
await auth.configAuthentication(
|
);
|
||||||
'https://nuget.pkg.github.com/OwnerName/index.json',
|
} catch {
|
||||||
'',
|
thrown = true;
|
||||||
fakeSourcesDirForTesting
|
}
|
||||||
);
|
expect(thrown).toBe(true);
|
||||||
} catch {
|
});
|
||||||
thrown = true;
|
|
||||||
}
|
it('existing config w/ no sources, sets up a full NuGet.config with URL and user/PAT for GPR', async () => {
|
||||||
expect(thrown).toBe(true);
|
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
||||||
});
|
const inputNuGetConfigPath: string = path.join(
|
||||||
|
fakeSourcesDirForTesting,
|
||||||
it('Existing config w/ no sources, sets up a full NuGet.config with URL and user/PAT for GPR', async () => {
|
'nuget.config'
|
||||||
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
);
|
||||||
const inputNuGetConfigPath: string = path.join(
|
fs.writeFileSync(inputNuGetConfigPath, emptyNuGetConfig);
|
||||||
fakeSourcesDirForTesting,
|
auth.configAuthentication(
|
||||||
'nuget.config'
|
'https://nuget.pkg.github.com/OwnerName/index.json',
|
||||||
);
|
'',
|
||||||
fs.writeFileSync(inputNuGetConfigPath, emptyNuGetConfig);
|
fakeSourcesDirForTesting
|
||||||
await auth.configAuthentication(
|
);
|
||||||
'https://nuget.pkg.github.com/OwnerName/index.json',
|
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
||||||
'',
|
expect(
|
||||||
fakeSourcesDirForTesting
|
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
||||||
);
|
).toMatchSnapshot();
|
||||||
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
});
|
||||||
expect(
|
|
||||||
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
it('existing config w/ no GPR sources, sets up a full NuGet.config with URL and user/PAT for GPR', async () => {
|
||||||
).toMatchSnapshot();
|
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
||||||
});
|
const inputNuGetConfigPath: string = path.join(
|
||||||
|
fakeSourcesDirForTesting,
|
||||||
it('Existing config w/ no GPR sources, sets up a full NuGet.config with URL and user/PAT for GPR', async () => {
|
'nuget.config'
|
||||||
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
);
|
||||||
const inputNuGetConfigPath: string = path.join(
|
fs.writeFileSync(inputNuGetConfigPath, nugetorgNuGetConfig);
|
||||||
fakeSourcesDirForTesting,
|
auth.configAuthentication(
|
||||||
'nuget.config'
|
'https://nuget.pkg.github.com/OwnerName/index.json',
|
||||||
);
|
'',
|
||||||
fs.writeFileSync(inputNuGetConfigPath, nugetorgNuGetConfig);
|
fakeSourcesDirForTesting
|
||||||
await auth.configAuthentication(
|
);
|
||||||
'https://nuget.pkg.github.com/OwnerName/index.json',
|
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
||||||
'',
|
expect(
|
||||||
fakeSourcesDirForTesting
|
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
||||||
);
|
).toMatchSnapshot();
|
||||||
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
});
|
||||||
expect(
|
|
||||||
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
it('existing config w/ only GPR source, sets up a partial NuGet.config user/PAT for GPR', async () => {
|
||||||
).toMatchSnapshot();
|
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
||||||
});
|
const inputNuGetConfigPath: string = path.join(
|
||||||
|
fakeSourcesDirForTesting,
|
||||||
it('Existing config w/ only GPR source, sets up a partial NuGet.config user/PAT for GPR', async () => {
|
'nuget.config'
|
||||||
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
);
|
||||||
const inputNuGetConfigPath: string = path.join(
|
fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig);
|
||||||
fakeSourcesDirForTesting,
|
auth.configAuthentication(
|
||||||
'nuget.config'
|
'https://nuget.pkg.github.com/OwnerName/index.json',
|
||||||
);
|
'',
|
||||||
fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig);
|
fakeSourcesDirForTesting
|
||||||
await auth.configAuthentication(
|
);
|
||||||
'https://nuget.pkg.github.com/OwnerName/index.json',
|
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
||||||
'',
|
expect(
|
||||||
fakeSourcesDirForTesting
|
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
||||||
);
|
).toMatchSnapshot();
|
||||||
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
});
|
||||||
expect(
|
|
||||||
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
it('existing config w/ GPR source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR', async () => {
|
||||||
).toMatchSnapshot();
|
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
||||||
});
|
const inputNuGetConfigPath: string = path.join(
|
||||||
|
fakeSourcesDirForTesting,
|
||||||
it('Existing config w/ GPR source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR', async () => {
|
'nuget.config'
|
||||||
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
);
|
||||||
const inputNuGetConfigPath: string = path.join(
|
fs.writeFileSync(inputNuGetConfigPath, gprnugetorgNuGetConfig);
|
||||||
fakeSourcesDirForTesting,
|
auth.configAuthentication(
|
||||||
'nuget.config'
|
'https://nuget.pkg.github.com/OwnerName/index.json',
|
||||||
);
|
'',
|
||||||
fs.writeFileSync(inputNuGetConfigPath, gprnugetorgNuGetConfig);
|
fakeSourcesDirForTesting
|
||||||
await auth.configAuthentication(
|
);
|
||||||
'https://nuget.pkg.github.com/OwnerName/index.json',
|
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
||||||
'',
|
expect(
|
||||||
fakeSourcesDirForTesting
|
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
||||||
);
|
).toMatchSnapshot();
|
||||||
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
});
|
||||||
expect(
|
|
||||||
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
it('existing config w/ two GPR sources, sets up a partial NuGet.config user/PAT for GPR', async () => {
|
||||||
).toMatchSnapshot();
|
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
||||||
});
|
const inputNuGetConfigPath: string = path.join(
|
||||||
|
fakeSourcesDirForTesting,
|
||||||
it('Existing config w/ two GPR sources, sets up a partial NuGet.config user/PAT for GPR', async () => {
|
'nuget.config'
|
||||||
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
);
|
||||||
const inputNuGetConfigPath: string = path.join(
|
fs.writeFileSync(inputNuGetConfigPath, twogprNuGetConfig);
|
||||||
fakeSourcesDirForTesting,
|
auth.configAuthentication(
|
||||||
'nuget.config'
|
'https://nuget.pkg.github.com',
|
||||||
);
|
'',
|
||||||
fs.writeFileSync(inputNuGetConfigPath, twogprNuGetConfig);
|
fakeSourcesDirForTesting
|
||||||
await auth.configAuthentication(
|
);
|
||||||
'https://nuget.pkg.github.com',
|
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
||||||
'',
|
expect(
|
||||||
fakeSourcesDirForTesting
|
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
||||||
);
|
).toMatchSnapshot();
|
||||||
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
});
|
||||||
expect(
|
|
||||||
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
it('existing config w/ spaces in key, throws for now', async () => {
|
||||||
).toMatchSnapshot();
|
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
||||||
});
|
const inputNuGetConfigPath: string = path.join(
|
||||||
|
fakeSourcesDirForTesting,
|
||||||
it('Existing config w/ spaces in key, throws for now', async () => {
|
'nuget.config'
|
||||||
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
);
|
||||||
const inputNuGetConfigPath: string = path.join(
|
fs.writeFileSync(inputNuGetConfigPath, spaceNuGetConfig);
|
||||||
fakeSourcesDirForTesting,
|
let thrown = false;
|
||||||
'nuget.config'
|
try {
|
||||||
);
|
auth.configAuthentication(
|
||||||
fs.writeFileSync(inputNuGetConfigPath, spaceNuGetConfig);
|
'https://nuget.pkg.github.com/OwnerName/index.json',
|
||||||
let thrown = false;
|
'',
|
||||||
try {
|
fakeSourcesDirForTesting
|
||||||
await auth.configAuthentication(
|
);
|
||||||
'https://nuget.pkg.github.com/OwnerName/index.json',
|
} catch {
|
||||||
'',
|
thrown = true;
|
||||||
fakeSourcesDirForTesting
|
}
|
||||||
);
|
expect(thrown).toBe(true);
|
||||||
} catch {
|
});
|
||||||
thrown = true;
|
|
||||||
}
|
it('existing config not in repo root, sets up a partial NuGet.config user/PAT for GPR', async () => {
|
||||||
expect(thrown).toBe(true);
|
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
||||||
});
|
const inputNuGetConfigDirectory: string = path.join(
|
||||||
|
fakeSourcesDirForTesting,
|
||||||
it('Existing config not in repo root, sets up a partial NuGet.config user/PAT for GPR', async () => {
|
'subfolder'
|
||||||
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
);
|
||||||
const inputNuGetConfigDirectory: string = path.join(
|
const inputNuGetConfigPath: string = path.join(
|
||||||
fakeSourcesDirForTesting,
|
inputNuGetConfigDirectory,
|
||||||
'subfolder'
|
'nuget.config'
|
||||||
);
|
);
|
||||||
const inputNuGetConfigPath: string = path.join(
|
fs.mkdirSync(inputNuGetConfigDirectory, {recursive: true});
|
||||||
inputNuGetConfigDirectory,
|
fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig);
|
||||||
'nuget.config'
|
auth.configAuthentication(
|
||||||
);
|
'https://nuget.pkg.github.com/OwnerName/index.json',
|
||||||
fs.mkdirSync(inputNuGetConfigDirectory, {recursive: true});
|
'subfolder/nuget.config',
|
||||||
fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig);
|
fakeSourcesDirForTesting
|
||||||
await auth.configAuthentication(
|
);
|
||||||
'https://nuget.pkg.github.com/OwnerName/index.json',
|
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
||||||
'subfolder/nuget.config',
|
expect(
|
||||||
fakeSourcesDirForTesting
|
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
||||||
);
|
).toMatchSnapshot();
|
||||||
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
});
|
||||||
expect(
|
|
||||||
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
it('existing config w/ only Azure Artifacts source, sets up a partial NuGet.config user/PAT for GPR', async () => {
|
||||||
).toMatchSnapshot();
|
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
||||||
});
|
const inputNuGetConfigPath: string = path.join(
|
||||||
|
fakeSourcesDirForTesting,
|
||||||
it('Existing config w/ only Azure Artifacts source, sets up a partial NuGet.config user/PAT for GPR', async () => {
|
'nuget.config'
|
||||||
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
);
|
||||||
const inputNuGetConfigPath: string = path.join(
|
fs.writeFileSync(inputNuGetConfigPath, azureartifactsNuGetConfig);
|
||||||
fakeSourcesDirForTesting,
|
auth.configAuthentication(
|
||||||
'nuget.config'
|
'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json',
|
||||||
);
|
'',
|
||||||
fs.writeFileSync(inputNuGetConfigPath, azureartifactsNuGetConfig);
|
fakeSourcesDirForTesting
|
||||||
await auth.configAuthentication(
|
);
|
||||||
'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json',
|
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
||||||
'',
|
expect(
|
||||||
fakeSourcesDirForTesting
|
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
||||||
);
|
).toMatchSnapshot();
|
||||||
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
});
|
||||||
expect(
|
|
||||||
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
it('existing config w/ Azure Artifacts source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR', async () => {
|
||||||
).toMatchSnapshot();
|
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
||||||
});
|
const inputNuGetConfigPath: string = path.join(
|
||||||
|
fakeSourcesDirForTesting,
|
||||||
it('Existing config w/ Azure Artifacts source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR', async () => {
|
'nuget.config'
|
||||||
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
);
|
||||||
const inputNuGetConfigPath: string = path.join(
|
fs.writeFileSync(inputNuGetConfigPath, azureartifactsnugetorgNuGetConfig);
|
||||||
fakeSourcesDirForTesting,
|
auth.configAuthentication(
|
||||||
'nuget.config'
|
'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json',
|
||||||
);
|
'',
|
||||||
fs.writeFileSync(inputNuGetConfigPath, azureartifactsnugetorgNuGetConfig);
|
fakeSourcesDirForTesting
|
||||||
await auth.configAuthentication(
|
);
|
||||||
'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json',
|
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
||||||
'',
|
expect(
|
||||||
fakeSourcesDirForTesting
|
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
||||||
);
|
).toMatchSnapshot();
|
||||||
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
});
|
||||||
expect(
|
|
||||||
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
it('no existing config, sets up a full NuGet.config with URL and token for other source', async () => {
|
||||||
).toMatchSnapshot();
|
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
||||||
});
|
auth.configAuthentication(
|
||||||
|
'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json',
|
||||||
it('No existing config, sets up a full NuGet.config with URL and token for other source', async () => {
|
'',
|
||||||
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
|
fakeSourcesDirForTesting
|
||||||
await auth.configAuthentication(
|
);
|
||||||
'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json',
|
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
||||||
'',
|
expect(
|
||||||
fakeSourcesDirForTesting
|
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
||||||
);
|
).toMatchSnapshot();
|
||||||
expect(fs.existsSync(nugetConfigFile)).toBe(true);
|
});
|
||||||
expect(
|
});
|
||||||
fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
|
|
||||||
).toMatchSnapshot();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|||||||
101
__tests__/cache-restore.test.ts
Normal file
101
__tests__/cache-restore.test.ts
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
import {readdir} from 'node:fs/promises';
|
||||||
|
import * as cache from '@actions/cache';
|
||||||
|
import * as core from '@actions/core';
|
||||||
|
import * as glob from '@actions/glob';
|
||||||
|
import {restoreCache} from '../src/cache-restore';
|
||||||
|
import {getNuGetFolderPath} from '../src/cache-utils';
|
||||||
|
import {lockFilePatterns} from '../src/constants';
|
||||||
|
|
||||||
|
jest.mock('node:fs/promises');
|
||||||
|
jest.mock('@actions/cache');
|
||||||
|
jest.mock('@actions/core');
|
||||||
|
jest.mock('@actions/glob');
|
||||||
|
jest.mock('../src/cache-utils');
|
||||||
|
|
||||||
|
describe('cache-restore tests', () => {
|
||||||
|
describe.each(lockFilePatterns)('restoreCache("%s")', lockFilePattern => {
|
||||||
|
/** Store original process.env.GITHUB_WORKSPACE */
|
||||||
|
let githubWorkspace: string | undefined;
|
||||||
|
beforeAll(() => {
|
||||||
|
githubWorkspace = process.env.GITHUB_WORKSPACE;
|
||||||
|
jest.mocked(getNuGetFolderPath).mockResolvedValue({
|
||||||
|
'global-packages': 'global-packages',
|
||||||
|
'http-cache': 'http-cache',
|
||||||
|
temp: 'temp',
|
||||||
|
'plugins-cache': 'plugins-cache'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
beforeEach(() => {
|
||||||
|
process.env.GITHUB_WORKSPACE = './';
|
||||||
|
jest.mocked(glob.hashFiles).mockClear();
|
||||||
|
jest.mocked(core.saveState).mockClear();
|
||||||
|
jest.mocked(core.setOutput).mockClear();
|
||||||
|
jest.mocked(cache.restoreCache).mockClear();
|
||||||
|
});
|
||||||
|
afterEach(() => (process.env.GITHUB_WORKSPACE = githubWorkspace));
|
||||||
|
|
||||||
|
it('throws error when lock file is not found', async () => {
|
||||||
|
jest.mocked(glob.hashFiles).mockResolvedValue('');
|
||||||
|
|
||||||
|
await expect(restoreCache(lockFilePattern)).rejects.toThrow();
|
||||||
|
|
||||||
|
expect(jest.mocked(core.saveState)).not.toHaveBeenCalled();
|
||||||
|
expect(jest.mocked(core.setOutput)).not.toHaveBeenCalled();
|
||||||
|
expect(jest.mocked(cache.restoreCache)).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not call core.saveState("CACHE_RESULT") when cache.restoreCache() returns falsy', async () => {
|
||||||
|
jest.mocked(glob.hashFiles).mockResolvedValue('hash');
|
||||||
|
jest.mocked(cache.restoreCache).mockResolvedValue(undefined);
|
||||||
|
|
||||||
|
await restoreCache(lockFilePattern);
|
||||||
|
|
||||||
|
const expectedKey = `dotnet-cache-${process.env.RUNNER_OS}-hash`;
|
||||||
|
expect(jest.mocked(core.saveState)).toHaveBeenCalledWith(
|
||||||
|
'CACHE_KEY',
|
||||||
|
expectedKey
|
||||||
|
);
|
||||||
|
expect(jest.mocked(core.saveState)).not.toHaveBeenCalledWith(
|
||||||
|
'CACHE_RESULT',
|
||||||
|
expectedKey
|
||||||
|
);
|
||||||
|
expect(jest.mocked(core.setOutput)).toHaveBeenCalledWith(
|
||||||
|
'cache-hit',
|
||||||
|
false
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('calls core.saveState("CACHE_RESULT") when cache.restoreCache() returns key', async () => {
|
||||||
|
const expectedKey = `dotnet-cache-${process.env.RUNNER_OS}-hash`;
|
||||||
|
jest.mocked(glob.hashFiles).mockResolvedValue('hash');
|
||||||
|
jest.mocked(cache.restoreCache).mockResolvedValue(expectedKey);
|
||||||
|
|
||||||
|
await restoreCache(lockFilePattern);
|
||||||
|
|
||||||
|
expect(jest.mocked(core.saveState)).toHaveBeenCalledWith(
|
||||||
|
'CACHE_KEY',
|
||||||
|
expectedKey
|
||||||
|
);
|
||||||
|
expect(jest.mocked(core.saveState)).toHaveBeenCalledWith(
|
||||||
|
'CACHE_RESULT',
|
||||||
|
expectedKey
|
||||||
|
);
|
||||||
|
expect(jest.mocked(core.setOutput)).toHaveBeenCalledWith(
|
||||||
|
'cache-hit',
|
||||||
|
true
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('calls glob.hashFiles("/packages.lock.json") if cacheDependencyPath is falsy', async () => {
|
||||||
|
const expectedKey = `dotnet-cache-${process.env.RUNNER_OS}-hash`;
|
||||||
|
jest.mocked(glob.hashFiles).mockResolvedValue('hash');
|
||||||
|
jest.mocked(cache.restoreCache).mockResolvedValue(expectedKey);
|
||||||
|
jest.mocked(readdir).mockResolvedValue([lockFilePattern] as any);
|
||||||
|
|
||||||
|
await restoreCache('');
|
||||||
|
|
||||||
|
expect(jest.mocked(glob.hashFiles)).not.toHaveBeenCalledWith('');
|
||||||
|
expect(jest.mocked(glob.hashFiles)).toHaveBeenCalledWith(lockFilePattern);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
87
__tests__/cache-save.test.ts
Normal file
87
__tests__/cache-save.test.ts
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
import * as cache from '@actions/cache';
|
||||||
|
import * as core from '@actions/core';
|
||||||
|
import fs from 'node:fs';
|
||||||
|
import {run} from '../src/cache-save';
|
||||||
|
import {getNuGetFolderPath} from '../src/cache-utils';
|
||||||
|
|
||||||
|
jest.mock('@actions/cache');
|
||||||
|
jest.mock('@actions/core');
|
||||||
|
jest.mock('node:fs');
|
||||||
|
jest.mock('../src/cache-utils');
|
||||||
|
|
||||||
|
describe('cache-save tests', () => {
|
||||||
|
beforeAll(() => {
|
||||||
|
jest.mocked(getNuGetFolderPath).mockResolvedValue({
|
||||||
|
'global-packages': 'global-packages',
|
||||||
|
'http-cache': 'http-cache',
|
||||||
|
temp: 'temp',
|
||||||
|
'plugins-cache': 'plugins-cache'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
beforeEach(() => {
|
||||||
|
jest.mocked(core.setFailed).mockClear();
|
||||||
|
jest.mocked(core.getState).mockClear();
|
||||||
|
jest.mocked(core.setOutput).mockClear();
|
||||||
|
jest.mocked(cache.saveCache).mockClear();
|
||||||
|
jest.mocked(fs.existsSync).mockClear();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not save cache when inputs:cache === false', async () => {
|
||||||
|
jest.mocked(core.getBooleanInput).mockReturnValue(false);
|
||||||
|
|
||||||
|
await run();
|
||||||
|
|
||||||
|
expect(jest.mocked(core.setFailed)).not.toHaveBeenCalled();
|
||||||
|
expect(jest.mocked(core.getState)).not.toHaveBeenCalled();
|
||||||
|
expect(jest.mocked(fs.existsSync)).not.toHaveBeenCalled();
|
||||||
|
expect(jest.mocked(cache.saveCache)).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not save cache when core.getState("CACHE_KEY") returns ""', async () => {
|
||||||
|
jest.mocked(core.getBooleanInput).mockReturnValue(true);
|
||||||
|
jest.mocked(core.getState).mockReturnValue('');
|
||||||
|
|
||||||
|
await run();
|
||||||
|
|
||||||
|
expect(jest.mocked(core.setFailed)).not.toHaveBeenCalled();
|
||||||
|
expect(jest.mocked(core.getState)).toHaveBeenCalledTimes(2);
|
||||||
|
expect(jest.mocked(fs.existsSync)).not.toHaveBeenCalled();
|
||||||
|
expect(jest.mocked(cache.saveCache)).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws Error when cachePath not exists', async () => {
|
||||||
|
jest.mocked(core.getBooleanInput).mockReturnValue(true);
|
||||||
|
jest.mocked(core.getState).mockReturnValue('cache-key');
|
||||||
|
jest.mocked(fs.existsSync).mockReturnValue(false);
|
||||||
|
|
||||||
|
await run();
|
||||||
|
|
||||||
|
expect(jest.mocked(core.setFailed)).toHaveBeenCalled();
|
||||||
|
expect(jest.mocked(core.getState)).toHaveBeenCalledTimes(2);
|
||||||
|
expect(jest.mocked(cache.saveCache)).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not save cache when state.CACHE_KEY === state.CACHE_RESULT', async () => {
|
||||||
|
jest.mocked(core.getBooleanInput).mockReturnValue(true);
|
||||||
|
jest.mocked(core.getState).mockReturnValue('cache-key');
|
||||||
|
jest.mocked(fs.existsSync).mockReturnValue(true);
|
||||||
|
|
||||||
|
await run();
|
||||||
|
|
||||||
|
expect(jest.mocked(core.setFailed)).not.toHaveBeenCalled();
|
||||||
|
expect(jest.mocked(core.getState)).toHaveBeenCalledTimes(2);
|
||||||
|
expect(jest.mocked(cache.saveCache)).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('saves cache when state.CACHE_KEY !== state.CACHE_RESULT', async () => {
|
||||||
|
jest.mocked(core.getBooleanInput).mockReturnValue(true);
|
||||||
|
jest.mocked(core.getState).mockImplementation(s => s);
|
||||||
|
jest.mocked(fs.existsSync).mockReturnValue(true);
|
||||||
|
|
||||||
|
await run();
|
||||||
|
|
||||||
|
expect(jest.mocked(core.setFailed)).not.toHaveBeenCalled();
|
||||||
|
expect(jest.mocked(core.getState)).toHaveBeenCalledTimes(2);
|
||||||
|
expect(jest.mocked(cache.saveCache)).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
122
__tests__/cache-utils.test.ts
Normal file
122
__tests__/cache-utils.test.ts
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
import * as cache from '@actions/cache';
|
||||||
|
import * as exec from '@actions/exec';
|
||||||
|
|
||||||
|
import {getNuGetFolderPath, isCacheFeatureAvailable} from '../src/cache-utils';
|
||||||
|
|
||||||
|
jest.mock('@actions/cache');
|
||||||
|
jest.mock('@actions/core');
|
||||||
|
jest.mock('@actions/exec');
|
||||||
|
|
||||||
|
describe('cache-utils tests', () => {
|
||||||
|
describe('getNuGetFolderPath()', () => {
|
||||||
|
it.each([
|
||||||
|
[
|
||||||
|
`
|
||||||
|
http-cache: /home/codespace/.local/share/NuGet/v3-cache
|
||||||
|
global-packages: /var/nuget
|
||||||
|
temp: /tmp/NuGetScratch
|
||||||
|
plugins-cache: /home/codespace/.local/share/NuGet/plugins-cache
|
||||||
|
`,
|
||||||
|
{
|
||||||
|
'http-cache': '/home/codespace/.local/share/NuGet/v3-cache',
|
||||||
|
'global-packages': '/var/nuget',
|
||||||
|
temp: '/tmp/NuGetScratch',
|
||||||
|
'plugins-cache': '/home/codespace/.local/share/NuGet/plugins-cache'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
`
|
||||||
|
http-cache: /home/codespace/.local/share/NuGet/v3-cache
|
||||||
|
global-packages: /var/nuget
|
||||||
|
temp: /tmp/NuGetScratch
|
||||||
|
plugins-cache: /home/codespace/.local/share/NuGet/plugins-cache
|
||||||
|
`,
|
||||||
|
{
|
||||||
|
'http-cache': '/home/codespace/.local/share/NuGet/v3-cache',
|
||||||
|
'global-packages': '/var/nuget',
|
||||||
|
temp: '/tmp/NuGetScratch',
|
||||||
|
'plugins-cache': '/home/codespace/.local/share/NuGet/plugins-cache'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
`
|
||||||
|
http-cache: C:\\Users\\user\\AppData\\Local\\NuGet\\v3-cache
|
||||||
|
global-packages: C:\\Users\\user\\.nuget\\packages\\
|
||||||
|
temp: C:\\Users\\user\\AppData\\Local\\Temp\\NuGetScratch
|
||||||
|
plugins-cache: C:\\Users\\user\\AppData\\Local\\NuGet\\plugins-cache
|
||||||
|
`,
|
||||||
|
{
|
||||||
|
'http-cache': 'C:\\Users\\user\\AppData\\Local\\NuGet\\v3-cache',
|
||||||
|
'global-packages': 'C:\\Users\\user\\.nuget\\packages\\',
|
||||||
|
temp: 'C:\\Users\\user\\AppData\\Local\\Temp\\NuGetScratch',
|
||||||
|
'plugins-cache':
|
||||||
|
'C:\\Users\\user\\AppData\\Local\\NuGet\\plugins-cache'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
`
|
||||||
|
http-cache: C:\\Users\\user\\AppData\\Local\\NuGet\\v3-cache
|
||||||
|
global-packages: C:\\Users\\user\\.nuget\\packages\\
|
||||||
|
temp: C:\\Users\\user\\AppData\\Local\\Temp\\NuGetScratch
|
||||||
|
plugins-cache: C:\\Users\\user\\AppData\\Local\\NuGet\\plugins-cache
|
||||||
|
`,
|
||||||
|
{
|
||||||
|
'http-cache': 'C:\\Users\\user\\AppData\\Local\\NuGet\\v3-cache',
|
||||||
|
'global-packages': 'C:\\Users\\user\\.nuget\\packages\\',
|
||||||
|
temp: 'C:\\Users\\user\\AppData\\Local\\Temp\\NuGetScratch',
|
||||||
|
'plugins-cache':
|
||||||
|
'C:\\Users\\user\\AppData\\Local\\NuGet\\plugins-cache'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
])('(stdout: "%s") returns %p', async (stdout, expected) => {
|
||||||
|
jest
|
||||||
|
.mocked(exec.getExecOutput)
|
||||||
|
.mockResolvedValue({stdout, stderr: '', exitCode: 0});
|
||||||
|
const pathes = await getNuGetFolderPath();
|
||||||
|
expect(pathes).toStrictEqual(expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
it.each([
|
||||||
|
`
|
||||||
|
error: An invalid local resource name was provided. Provide one of the following values: http-cache, temp, global-packages, all.
|
||||||
|
Usage: dotnet nuget locals [arguments] [options]
|
||||||
|
Arguments:
|
||||||
|
Cache Location(s) Specifies the cache location(s) to list or clear.
|
||||||
|
<all | http-cache | global-packages | temp>
|
||||||
|
Options:
|
||||||
|
-h|--help Show help information
|
||||||
|
--force-english-output Forces the application to run using an invariant, English-based culture.
|
||||||
|
-c|--clear Clear the selected local resources or cache location(s).
|
||||||
|
-l|--list List the selected local resources or cache location(s).
|
||||||
|
`,
|
||||||
|
'bash: dotnet: command not found',
|
||||||
|
''
|
||||||
|
])('(stderr: "%s", exitCode: 1) throws Error', async stderr => {
|
||||||
|
jest
|
||||||
|
.mocked(exec.getExecOutput)
|
||||||
|
.mockResolvedValue({stdout: '', stderr, exitCode: 1});
|
||||||
|
await expect(getNuGetFolderPath()).rejects.toThrow();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe.each(['', 'https://github.com/', 'https://example.com/'])(
|
||||||
|
'isCacheFeatureAvailable()',
|
||||||
|
url => {
|
||||||
|
// Save & Restore env
|
||||||
|
let serverUrlEnv: string | undefined;
|
||||||
|
beforeAll(() => (serverUrlEnv = process.env['GITHUB_SERVER_URL']));
|
||||||
|
beforeEach(() => (process.env['GITHUB_SERVER_URL'] = url));
|
||||||
|
afterEach(() => (process.env['GITHUB_SERVER_URL'] = serverUrlEnv));
|
||||||
|
|
||||||
|
it('returns true when cache.isFeatureAvailable() === true', () => {
|
||||||
|
jest.mocked(cache.isFeatureAvailable).mockReturnValue(true);
|
||||||
|
expect(isCacheFeatureAvailable()).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns false when cache.isFeatureAvailable() === false', () => {
|
||||||
|
jest.mocked(cache.isFeatureAvailable).mockReturnValue(false);
|
||||||
|
expect(isCacheFeatureAvailable()).toBe(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
13
__tests__/clear-toolcache.ps1
Normal file
13
__tests__/clear-toolcache.ps1
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
$dotnetPaths = @{
|
||||||
|
Linux = "/usr/share/dotnet"
|
||||||
|
macOS = "$env:HOME/.dotnet"
|
||||||
|
Windows = "$env:ProgramFiles\dotnet", "$env:LocalAppData\Microsoft\dotnet"
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($srcPath in $dotnetPaths[$args[0]]) {
|
||||||
|
if (Test-Path $srcPath) {
|
||||||
|
Write-Host "Move $srcPath path"
|
||||||
|
$dstPath = Join-Path ([IO.Path]::GetTempPath()) ([IO.Path]::GetRandomFileName())
|
||||||
|
Move-Item -Path $srcPath -Destination $dstPath
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,23 +1,45 @@
|
|||||||
import fs = require('fs');
|
import cscFile from '../.github/csc.json';
|
||||||
|
|
||||||
describe('csc tests', () => {
|
describe('csc tests', () => {
|
||||||
it('Valid regular expression', async () => {
|
test('regular expression in csc.json is valid', async () => {
|
||||||
var cscFile = require('../.github/csc.json');
|
const regexPattern = cscFile['problemMatcher'][0]['pattern'][0]['regexp'];
|
||||||
var regex = cscFile['problemMatcher'][0]['pattern'][0]['regexp'];
|
const regexResultsMap = cscFile['problemMatcher'][0]['pattern'][0];
|
||||||
|
|
||||||
console.log(regex);
|
const regex = new RegExp(regexPattern);
|
||||||
var re = new RegExp(regex);
|
|
||||||
|
|
||||||
// Ideally we would verify that this
|
const stringsToMatch = [
|
||||||
var stringsToMatch = [
|
|
||||||
'Program.cs(10,79): error CS1002: ; expected [/Users/zacharyeisinger/Documents/repo/setup-dotnet/__tests__/sample-broken-csproj/sample.csproj]',
|
'Program.cs(10,79): error CS1002: ; expected [/Users/zacharyeisinger/Documents/repo/setup-dotnet/__tests__/sample-broken-csproj/sample.csproj]',
|
||||||
"S:\\Msbuild\\src\\Build\\Evaluation\\ExpressionShredder.cs(33,7): error CS1003: Syntax error, ',' expected [S:\\msbuild\\src\\Build\\Microsoft.Build.csproj > Properties:prop]"
|
"S:\\Msbuild\\src\\Build\\Evaluation\\ExpressionShredder.cs(33,7): error CS1003: Syntax error, ',' expected [S:\\msbuild\\src\\Build\\Microsoft.Build.csproj > Properties:prop]"
|
||||||
];
|
];
|
||||||
|
// Expected results are calculated according to the csc matcher located in csc.json file
|
||||||
|
const expectedResults = [
|
||||||
|
{
|
||||||
|
file: 'Program.cs',
|
||||||
|
line: '10',
|
||||||
|
severity: 'error',
|
||||||
|
code: 'CS1002',
|
||||||
|
message: '; expected',
|
||||||
|
fromPath:
|
||||||
|
'/Users/zacharyeisinger/Documents/repo/setup-dotnet/__tests__/sample-broken-csproj/sample.csproj'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
file: 'S:\\Msbuild\\src\\Build\\Evaluation\\ExpressionShredder.cs',
|
||||||
|
line: '33',
|
||||||
|
severity: 'error',
|
||||||
|
code: 'CS1003',
|
||||||
|
message: "Syntax error, ',' expected",
|
||||||
|
fromPath:
|
||||||
|
'S:\\msbuild\\src\\Build\\Microsoft.Build.csproj > Properties:prop'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
stringsToMatch.forEach(string => {
|
stringsToMatch.map((string, index) => {
|
||||||
var matchStr = string.match(re);
|
const matchedResultsArray = string.match(regex);
|
||||||
console.log(matchStr);
|
for (const propName in expectedResults[index]) {
|
||||||
expect(matchStr).toEqual(expect.anything());
|
const propertyIndex = regexResultsMap[propName];
|
||||||
|
const expectedPropValue = expectedResults[index][propName];
|
||||||
|
const matchedPropValue = matchedResultsArray![propertyIndex];
|
||||||
|
expect(matchedPropValue).toEqual(expectedPropValue);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}, 10000);
|
}, 10000);
|
||||||
});
|
});
|
||||||
|
|||||||
18
__tests__/e2e-test-csproj/Test.cs
Normal file
18
__tests__/e2e-test-csproj/Test.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace test_csproj
|
||||||
|
{
|
||||||
|
[TestClass]
|
||||||
|
public class Test
|
||||||
|
{
|
||||||
|
[TestMethod]
|
||||||
|
public void TestMethod()
|
||||||
|
{
|
||||||
|
Console.WriteLine("TestMethod");
|
||||||
|
int calculatedResult = 1000 / 25;
|
||||||
|
int expectedResult = 40;
|
||||||
|
Assert.AreEqual(calculatedResult, expectedResult);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user