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 }