cicd/internal/workflows/maven-workflows.go (183 lines of code) (raw):

/* * Copyright (C) 2022 Google LLC * * 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 workflows import ( "strconv" "github.com/GoogleCloudPlatform/DataflowTemplates/cicd/internal/op" ) const ( // mvn commands cleanInstallCmd = "clean install" cleanVerifyCmd = "clean verify" cleanTestCmd = "clean test" verifyCmd = "verify" spotlessCheckCmd = "spotless:check" checkstyleCheckCmd = "checkstyle:check" // notable files unifiedPom = "pom.xml" ) // Interface for retrieving flags that can be passed into the workflow's // `Run` method. type MavenFlags interface { IncludeDependencies() string IncludeDependents() string SkipCheckstyle() string SkipDependencyAnalysis() string SkipJib() string SkipTests() string SkipJacoco() string SkipShade() string SkipSpotlessCheck() string SkipIntegrationTests() string FailAtTheEnd() string RunIntegrationTests(bool) string RunIntegrationSmokeTests() string RunSpannerStagingIntegrationTests() string RunLoadTests() string RunLoadTestObserver() string ThreadCount(int) string IntegrationTestParallelism(int) string StaticBigtableInstance(string) string StaticSpannerInstance(string) string SpannerHost(string) string InternalMaven() string } type mvnFlags struct{} func (*mvnFlags) IncludeDependencies() string { return "-am" } func (*mvnFlags) IncludeDependents() string { return "-amd" } func (*mvnFlags) SkipCheckstyle() string { return "-Dcheckstyle.skip" } func (*mvnFlags) SkipDependencyAnalysis() string { return "-Dmdep.analyze.skip" } func (*mvnFlags) SkipJib() string { return "-Djib.skip" } func (*mvnFlags) SkipTests() string { return "-Dmaven.test.skip" } func (*mvnFlags) SkipJacoco() string { return "-Djacoco.skip" } func (*mvnFlags) SkipShade() string { return "-DskipShade" } func (*mvnFlags) SkipSpotlessCheck() string { return "-Dspotless.check.skip" } func (*mvnFlags) SkipIntegrationTests() string { return "-DskipIntegrationTests" } func (*mvnFlags) FailAtTheEnd() string { return "-fae" } func (*mvnFlags) RunIntegrationTests(skipRunnerV2 bool) string { if skipRunnerV2 { return "-PtemplatesIntegrationRunnerV2Tests" } return "-PtemplatesIntegrationTests" } func (*mvnFlags) RunIntegrationSmokeTests() string { return "-PtemplatesIntegrationSmokeTests" } func (*mvnFlags) RunSpannerStagingIntegrationTests() string { return "-PspannerStagingIntegrationTests" } func (*mvnFlags) RunLoadTests() string { return "-PtemplatesLoadTests" } func (*mvnFlags) RunLoadTestObserver() string { return "-PtemplatesLoadTestObserve" } // The number of modules Maven is going to build in parallel in a multi-module project. func (*mvnFlags) ThreadCount(count int) string { return "-T" + strconv.Itoa(count) } // The number of tests Maven Surefire plugin is going to run in parallel for each Maven build // thread. The total number of parallel tests is IntegrationTestParallelism * ThreadCount. func (*mvnFlags) IntegrationTestParallelism(count int) string { return "-DitParallelism=" + strconv.Itoa(count) } func (*mvnFlags) StaticBigtableInstance(instanceID string) string { return "-DbigtableInstanceId=" + instanceID } func (*mvnFlags) StaticSpannerInstance(instanceID string) string { return "-DspannerInstanceId=" + instanceID } func (*mvnFlags) SpannerHost(host string) string { return "-DspannerHost=" + host } func (*mvnFlags) InternalMaven() string { return "--settings=.mvn/settings.xml" } func NewMavenFlags() MavenFlags { return &mvnFlags{} } type mvnCleanInstallWorkflow struct{} func MvnCleanInstall() Workflow { return &mvnCleanInstallWorkflow{} } func (*mvnCleanInstallWorkflow) Run(args ...string) error { return RunForChangedModules(cleanInstallCmd, args...) } type mvnCleanInstallAllWorkflow struct{} func MvnCleanInstallAll() Workflow { return &mvnCleanInstallAllWorkflow{} } func (*mvnCleanInstallAllWorkflow) Run(args ...string) error { return op.RunMavenOnPom(unifiedPom, cleanInstallCmd, args...) } type mvnCleanTestWorkflow struct{} func MvnCleanTest() Workflow { return &mvnCleanTestWorkflow{} } func (*mvnCleanTestWorkflow) Run(args ...string) error { return RunForChangedModules(cleanTestCmd, args...) } type mvnCleanVerifyWorkflow struct{} func MvnCleanVerify() Workflow { return &mvnCleanVerifyWorkflow{} } func (*mvnCleanVerifyWorkflow) Run(args ...string) error { return RunForChangedModules(cleanVerifyCmd, args...) } type mvnVerifyWorkflow struct{} func MvnVerify() Workflow { return &mvnVerifyWorkflow{} } func (*mvnVerifyWorkflow) Run(args ...string) error { return RunForChangedModules(verifyCmd, args...) } func RunForChangedModules(cmd string, args ...string) error { parsedArgs := []string{} for _, arg := range args { if arg != "" { parsedArgs = append(parsedArgs, arg) } } return op.RunMavenOnModule(unifiedPom, cmd, parsedArgs...) } type spotlessCheckWorkflow struct{} func SpotlessCheck() Workflow { return &spotlessCheckWorkflow{} } func (*spotlessCheckWorkflow) Run(args ...string) error { return op.RunMavenOnPom(unifiedPom, spotlessCheckCmd, args...) } type checkstyleCheckWorkflow struct{} func CheckstyleCheck() Workflow { return &checkstyleCheckWorkflow{} } func (*checkstyleCheckWorkflow) Run(args ...string) error { return op.RunMavenOnPom(unifiedPom, checkstyleCheckCmd, args...) } // Removes root and returns results. This may reorder the input. func removeRoot(modules []string) []string { var i int for i = 0; i < len(modules); i += 1 { if modules[i] == "" { break } } if i == len(modules) { return modules } // Order doesn't matter when passing the modules l := len(modules) modules[i] = modules[l-1] return modules[:l-1] }