|
1 | 1 | // Licensed to the .NET Foundation under one or more agreements.
|
2 | 2 | // The .NET Foundation licenses this file to you under the MIT license.
|
3 | 3 |
|
4 |
| -#nullable disable |
| 4 | +using System; |
| 5 | +using System.Linq; |
5 | 6 |
|
6 | 7 | namespace Microsoft.DotNet.Cli.Telemetry;
|
7 | 8 |
|
8 | 9 | internal class CIEnvironmentDetectorForTelemetry : ICIEnvironmentDetector
|
9 | 10 | {
|
10 |
| - // Systems that provide boolean values only, so we can simply parse and check for true |
11 |
| - private static readonly string[] _booleanVariables = [ |
12 |
| - // Azure Pipelines - https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables#system-variables-devops-services |
13 |
| - "TF_BUILD", |
14 |
| - // GitHub Actions - https://docs.github.com/en/actions/learn-github-actions/environment-variables#default-environment-variables |
15 |
| - "GITHUB_ACTIONS", |
16 |
| - // AppVeyor - https://www.appveyor.com/docs/environment-variables/ |
17 |
| - "APPVEYOR", |
18 |
| - // A general-use flag - Many of the major players support this: AzDo, GitHub, GitLab, AppVeyor, Travis CI, CircleCI. |
19 |
| - // Given this, we could potentially remove all of these other options? |
20 |
| - "CI", |
21 |
| - // Travis CI - https://docs.travis-ci.com/user/environment-variables/#default-environment-variables |
22 |
| - "TRAVIS", |
23 |
| - // CircleCI - https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables |
24 |
| - "CIRCLECI", |
25 |
| - ]; |
26 |
| - |
27 |
| - // Systems where every variable must be present and not-null before returning true |
28 |
| - private static readonly string[][] _allNotNullVariables = [ |
| 11 | + private static readonly EnvironmentDetectionRule[] _detectionRules = [ |
| 12 | + // Systems that provide boolean values only, so we can simply parse and check for true |
| 13 | + new BooleanEnvironmentRule( |
| 14 | + // Azure Pipelines - https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables#system-variables-devops-services |
| 15 | + "TF_BUILD", |
| 16 | + // GitHub Actions - https://docs.github.com/en/actions/learn-github-actions/environment-variables#default-environment-variables |
| 17 | + "GITHUB_ACTIONS", |
| 18 | + // AppVeyor - https://www.appveyor.com/docs/environment-variables/ |
| 19 | + "APPVEYOR", |
| 20 | + // A general-use flag - Many of the major players support this: AzDo, GitHub, GitLab, AppVeyor, Travis CI, CircleCI. |
| 21 | + // Given this, we could potentially remove all of these other options? |
| 22 | + "CI", |
| 23 | + // Travis CI - https://docs.travis-ci.com/user/environment-variables/#default-environment-variables |
| 24 | + "TRAVIS", |
| 25 | + // CircleCI - https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables |
| 26 | + "CIRCLECI" |
| 27 | + ), |
| 28 | + |
| 29 | + // Systems where every variable must be present and not-null before returning true |
29 | 30 | // AWS CodeBuild - https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-env-vars.html
|
30 |
| - ["CODEBUILD_BUILD_ID", "AWS_REGION"], |
| 31 | + new AllPresentEnvironmentRule("CODEBUILD_BUILD_ID", "AWS_REGION"), |
31 | 32 | // Jenkins - https://github.com/jenkinsci/jenkins/blob/master/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv.groovy
|
32 |
| - ["BUILD_ID", "BUILD_URL"], |
| 33 | + new AllPresentEnvironmentRule("BUILD_ID", "BUILD_URL"), |
33 | 34 | // Google Cloud Build - https://cloud.google.com/build/docs/configuring-builds/substitute-variable-values#using_default_substitutions
|
34 |
| - ["BUILD_ID", "PROJECT_ID"] |
35 |
| - ]; |
36 |
| - |
37 |
| - // Systems where the variable must be present and not-null |
38 |
| - private static readonly string[] _ifNonNullVariables = [ |
39 |
| - // TeamCity - https://www.jetbrains.com/help/teamcity/predefined-build-parameters.html#Predefined+Server+Build+Parameters |
40 |
| - "TEAMCITY_VERSION", |
41 |
| - // JetBrains Space - https://www.jetbrains.com/help/space/automation-environment-variables.html#general |
42 |
| - "JB_SPACE_API_URL" |
| 35 | + new AllPresentEnvironmentRule("BUILD_ID", "PROJECT_ID"), |
| 36 | + |
| 37 | + // Systems where the variable must be present and not-null |
| 38 | + new AnyPresentEnvironmentRule( |
| 39 | + // TeamCity - https://www.jetbrains.com/help/teamcity/predefined-build-parameters.html#Predefined+Server+Build+Parameters |
| 40 | + "TEAMCITY_VERSION", |
| 41 | + // JetBrains Space - https://www.jetbrains.com/help/space/automation-environment-variables.html#general |
| 42 | + "JB_SPACE_API_URL" |
| 43 | + ) |
43 | 44 | ];
|
44 | 45 |
|
45 | 46 | public bool IsCIEnvironment()
|
46 | 47 | {
|
47 |
| - foreach (var booleanVariable in _booleanVariables) |
48 |
| - { |
49 |
| - if (bool.TryParse(Environment.GetEnvironmentVariable(booleanVariable), out bool envVar) && envVar) |
50 |
| - { |
51 |
| - return true; |
52 |
| - } |
53 |
| - } |
54 |
| - |
55 |
| - foreach (var variables in _allNotNullVariables) |
56 |
| - { |
57 |
| - if (variables.All((variable) => !string.IsNullOrEmpty(Environment.GetEnvironmentVariable(variable)))) |
58 |
| - { |
59 |
| - return true; |
60 |
| - } |
61 |
| - } |
62 |
| - |
63 |
| - foreach (var variable in _ifNonNullVariables) |
64 |
| - { |
65 |
| - if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable(variable))) |
66 |
| - { |
67 |
| - return true; |
68 |
| - } |
69 |
| - } |
70 |
| - |
71 |
| - return false; |
| 48 | + return _detectionRules.Any(rule => rule.IsMatch()); |
72 | 49 | }
|
73 | 50 | }
|
0 commit comments