github.com/hashicorp/packer@v1.14.3/internal/hcp/registry/metadata/cicd.go (about)

     1  package metadata
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  )
     7  
     8  type GithubActions struct{}
     9  
    10  func (g *GithubActions) Detect() error {
    11  	_, ok := os.LookupEnv("GITHUB_ACTIONS")
    12  	if !ok {
    13  		return fmt.Errorf("GITHUB_ACTIONS environment variable not found")
    14  	}
    15  	return nil
    16  }
    17  
    18  func (g *GithubActions) Details() map[string]interface{} {
    19  	env := make(map[string]interface{})
    20  	keys := []string{
    21  		"GITHUB_REPOSITORY",
    22  		"GITHUB_REPOSITORY_ID",
    23  		"GITHUB_WORKFLOW_URL",
    24  		"GITHUB_SHA",
    25  		"GITHUB_REF",
    26  		"GITHUB_ACTOR",
    27  		"GITHUB_ACTOR_ID",
    28  		"GITHUB_TRIGGERING_ACTOR",
    29  		"GITHUB_EVENT_NAME",
    30  		"GITHUB_JOB",
    31  	}
    32  
    33  	for _, key := range keys {
    34  		if value, ok := os.LookupEnv(key); ok {
    35  			env[key] = value
    36  		}
    37  	}
    38  
    39  	env["GITHUB_WORKFLOW_URL"] = fmt.Sprintf("%s/%s/actions/runs/%s", os.Getenv("GITHUB_SERVER_URL"), os.Getenv("GITHUB_REPOSITORY"), os.Getenv("GITHUB_RUN_ID"))
    40  	return env
    41  }
    42  
    43  func (g *GithubActions) Type() string {
    44  	return "github"
    45  }
    46  
    47  type GitlabCI struct{}
    48  
    49  func (g *GitlabCI) Detect() error {
    50  	_, ok := os.LookupEnv("GITLAB_CI")
    51  	if !ok {
    52  		return fmt.Errorf("GITLAB_CI environment variable not found")
    53  	}
    54  	return nil
    55  }
    56  
    57  func (g *GitlabCI) Details() map[string]interface{} {
    58  	env := make(map[string]interface{})
    59  	keys := []string{
    60  		"CI_PROJECT_NAME",
    61  		"CI_PROJECT_ID",
    62  		"CI_PROJECT_URL",
    63  		"CI_COMMIT_SHA",
    64  		"CI_COMMIT_REF_NAME",
    65  		"GITLAB_USER_NAME",
    66  		"GITLAB_USER_ID",
    67  		"CI_PIPELINE_SOURCE",
    68  		"CI_PIPELINE_URL",
    69  		"CI_JOB_URL",
    70  		"CI_SERVER_NAME",
    71  		"CI_REGISTRY_IMAGE",
    72  	}
    73  
    74  	for _, key := range keys {
    75  		if value, ok := os.LookupEnv(key); ok {
    76  			env[key] = value
    77  		}
    78  	}
    79  
    80  	return env
    81  }
    82  
    83  func (g *GitlabCI) Type() string {
    84  	return "gitlab"
    85  }
    86  
    87  type BitbucketPipelines struct{}
    88  
    89  func (b *BitbucketPipelines) Detect() error {
    90  	_, ok := os.LookupEnv("BITBUCKET_BUILD_NUMBER")
    91  	if !ok {
    92  		return fmt.Errorf("BITBUCKET_BUILD_NUMBER environment variable not found")
    93  	}
    94  	return nil
    95  }
    96  
    97  func (b *BitbucketPipelines) Details() map[string]interface{} {
    98  	env := make(map[string]interface{})
    99  	keys := []string{
   100  		"BITBUCKET_REPO_FULL_NAME",
   101  		"BITBUCKET_REPO_UUID",
   102  		"BITBUCKET_WORKSPACE",
   103  		"BITBUCKET_COMMIT",
   104  		"BITBUCKET_BRANCH",
   105  		"BITBUCKET_TAG",
   106  		"BITBUCKET_BUILD_NUMBER",
   107  		"BITBUCKET_PIPELINE_UUID",
   108  		"BITBUCKET_STEP_UUID",
   109  		"BITBUCKET_DEPLOYMENT_ENVIRONMENT",
   110  		"BITBUCKET_PR_ID",
   111  		"BITBUCKET_PR_DESTINATION_BRANCH",
   112  		"BITBUCKET_PROJECT_KEY",
   113  		"BITBUCKET_PROJECT_UUID",
   114  	}
   115  
   116  	for _, key := range keys {
   117  		if value, ok := os.LookupEnv(key); ok {
   118  			env[key] = value
   119  		}
   120  	}
   121  
   122  	return env
   123  }
   124  
   125  func (b *BitbucketPipelines) Type() string {
   126  	return "bitbucket"
   127  }
   128  
   129  type JenkinsCI struct{}
   130  
   131  func (g *JenkinsCI) Detect() error {
   132  	_, ok := os.LookupEnv("JENKINS_URL")
   133  	if !ok {
   134  		return fmt.Errorf("JENKINS_URL environment variable not found")
   135  	}
   136  	return nil
   137  }
   138  
   139  func (g *JenkinsCI) Details() map[string]interface{} {
   140  	env := make(map[string]interface{})
   141  	keys := []string{
   142  		"JENKINS_URL",
   143  		"BUILD_URL",
   144  		"NODE_NAME",
   145  		"JOB_NAME",
   146  		"JOB_URL",
   147  		"BUILD_NUMBER",
   148  		"BUILD_ID",
   149  		"BUILD_TAG",
   150  		"WORKSPACE",
   151  		"BUILD_CAUSE",
   152  		"GIT_COMMIT",
   153  		"GIT_BRANCH",
   154  		"GIT_URL",
   155  		"GIT_AUTHOR_NAME",
   156  		"GIT_COMMITTER_EMAIL",
   157  		"GIT_PREVIOUS_SUCCESSFUL_COMMIT",
   158  	}
   159  
   160  	for _, key := range keys {
   161  		if value, ok := os.LookupEnv(key); ok {
   162  			env[key] = value
   163  		}
   164  	}
   165  
   166  	return env
   167  }
   168  
   169  func (g *JenkinsCI) Type() string {
   170  	return "jenkins"
   171  }
   172  
   173  func GetCicdMetadata() map[string]interface{} {
   174  	cicd := []MetadataProvider{
   175  		&JenkinsCI{},
   176  		&GithubActions{},
   177  		&GitlabCI{},
   178  		&BitbucketPipelines{},
   179  	}
   180  
   181  	for _, c := range cicd {
   182  		err := c.Detect()
   183  		if err == nil {
   184  			return map[string]interface{}{
   185  				"type":    c.Type(),
   186  				"details": c.Details(),
   187  			}
   188  		}
   189  	}
   190  
   191  	return nil
   192  }