pulumi/pkg/util/ciutil/systems.go
Praneet Loke 0fd131fb9e
Add a new BuildNumber property to the backend metadata bag and CI vars (#3766)
* Add a new metadata property for BuildNumber. Update Travis and GitLab to set both Build ID and Build Number. Add link to env vars doc for Codefresh.

* Update changelog

* Update CI vars detection test.

* Add PR number to changelog.
2020-01-17 10:47:49 -08:00

128 lines
4.4 KiB
Go

// Copyright 2016-2018, Pulumi Corporation.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package ciutil
import (
"os"
)
// CI system constants.
const (
AppVeyor SystemName = "AppVeyor"
AWSCodeBuild SystemName = "AWS CodeBuild"
AtlassianBamboo SystemName = "Atlassian Bamboo"
AtlassianBitbucketPipelines SystemName = "Atlassian Bitbucket Pipelines"
AzurePipelines SystemName = "Azure Pipelines"
Buildkite SystemName = "Buildkite"
CircleCI SystemName = "CircleCI"
Codefresh SystemName = "Codefresh"
Codeship SystemName = "Codeship"
Drone SystemName = "Drone"
// GenericCI is used when a CI system in which the CLI is being run,
// is not recognized by it. Users can set the relevant env vars
// as a fallback so that the CLI would still pick-up the metadata related
// to their CI build.
GenericCI SystemName = "Generic CI"
GitHub SystemName = "GitHub"
GitLab SystemName = "GitLab"
GoCD SystemName = "GoCD"
Hudson SystemName = "Hudson"
Jenkins SystemName = "Jenkins"
MagnumCI SystemName = "Magnum CI"
Semaphore SystemName = "Semaphore"
TaskCluster SystemName = "TaskCluster"
TeamCity SystemName = "TeamCity"
Travis SystemName = "Travis CI"
)
// SystemName is a recognized CI system.
type SystemName string
// system represents a CI/CD system.
type system interface {
// DetectVars when called on a specific instance of a CISystem
// detects the env vars of the corresponding CI/CD system and
// returns `Vars` with those values.
DetectVars() Vars
// IsCI returns true if any of the CI systems's associated environment variables are set.
IsCI() bool
}
// Vars contains a set of metadata variables about a CI system.
type Vars struct {
// Name is a required friendly name of the CI system.
Name SystemName
// BuildID is an optional unique identifier for the current build/job.
// In some CI systems the build ID is a system-wide unique internal ID
// and the `BuildNumber` is the repo/project-specific unique ID.
BuildID string
// BuildNumber is the unique identifier of a build within a project/repository.
// This is only set for CI systems that expose both the internal ID, as well as
// a project/repo-specific ID.
BuildNumber string
// BuildType is an optional friendly type name of the build/job type.
BuildType string
// BuildURL is an optional URL for this build/job's webpage.
BuildURL string
// SHA is the SHA hash of the code repo at which this build/job is running.
SHA string
// BranchName is the name of the feature branch currently being built.
BranchName string
// CommitMessage is the full message of the Git commit being built.
CommitMessage string
// PRNumber is the pull-request ID/number in the source control system.
PRNumber string
}
// baseCI implements the `System` interface with default
// implementations.
//
// When creating a new CI System implementation, implement the
// DetectVars and any other function you wish to override.
type baseCI struct {
Name SystemName
// EnvVarsToDetect is an array of env vars to check if any of these env vars is set,
// which would indicate that the Pulumi CLI is running in that CI system's environment.
EnvVarsToDetect []string
// EnvValuesToDetect is a map of env vars and their expected values to check for,
// in order to see if the Pulumi CLI is running inside a certain CI system's environment.
EnvValuesToDetect map[string]string
}
// DetectVars in the base implementation returns a Vars
// struct with just the Name property of the CI system.
func (d baseCI) DetectVars() Vars {
return Vars{Name: d.Name}
}
// IsCI returns true if a specific env var of a CI system is set.
func (d baseCI) IsCI() bool {
for _, e := range d.EnvVarsToDetect {
if os.Getenv(e) != "" {
return true
}
}
for k, v := range d.EnvValuesToDetect {
if os.Getenv(k) == v {
return true
}
}
return false
}