package buildjob; import com.atlassian.bamboo.specs.api.BambooSpec; import com.atlassian.bamboo.specs.api.builders.BambooKey; import com.atlassian.bamboo.specs.api.builders.docker.DockerConfiguration; import com.atlassian.bamboo.specs.api.builders.permission.PermissionType; import com.atlassian.bamboo.specs.api.builders.permission.Permissions; import com.atlassian.bamboo.specs.api.builders.permission.PlanPermissions; import com.atlassian.bamboo.specs.api.builders.plan.Job; import com.atlassian.bamboo.specs.api.builders.plan.Plan; import com.atlassian.bamboo.specs.api.builders.plan.PlanIdentifier; import com.atlassian.bamboo.specs.api.builders.plan.Stage; import com.atlassian.bamboo.specs.api.builders.plan.artifact.Artifact; import com.atlassian.bamboo.specs.api.builders.plan.branches.BranchCleanup; import com.atlassian.bamboo.specs.api.builders.plan.branches.PlanBranchManagement; import com.atlassian.bamboo.specs.api.builders.project.Project; import com.atlassian.bamboo.specs.builders.task.CheckoutItem; import com.atlassian.bamboo.specs.builders.task.ScriptTask; import com.atlassian.bamboo.specs.builders.task.TestParserTask; import com.atlassian.bamboo.specs.builders.task.VcsCheckoutTask; import com.atlassian.bamboo.specs.builders.task.VcsCommitTask; import com.atlassian.bamboo.specs.builders.trigger.BitbucketServerTrigger; import com.atlassian.bamboo.specs.util.BambooServer; /** * Plan configuration for Bamboo. * Learn more on: https://confluence.atlassian.com/display/BAMBOO/Bamboo+Specs */ @BambooSpec public class PlanSpec { /** * Run main to publish plan on Bamboo */ public static void main(final String[] args) throws Exception { //By default credentials are read from the '.credentials' file. BambooServer bambooServer = new BambooServer("http://localhost:8085"); Plan buildPlan = new PlanSpec().createDockerBuildPlan(); bambooServer.publish(buildPlan); PlanPermissions buildPlanPermissions = new PlanSpec().createPlanPermission(buildPlan.getIdentifier()); bambooServer.publish(buildPlanPermissions); } private PlanPermissions createPlanPermission(PlanIdentifier planIdentifier) { Permissions permission = new Permissions() .userPermissions("atlbamboo", PermissionType.EDIT, PermissionType.VIEW, PermissionType.ADMIN, PermissionType.CLONE, PermissionType.BUILD) .userPermissions("tbejan", PermissionType.ADMIN, PermissionType.EDIT, PermissionType.VIEW, PermissionType.CLONE, PermissionType.BUILD) .userPermissions("dbarbu", PermissionType.VIEW, PermissionType.CLONE, PermissionType.BUILD) .loggedInUserPermissions(PermissionType.VIEW).anonymousUserPermissionView(); return new PlanPermissions(planIdentifier.getProjectKey(), planIdentifier.getPlanKey()).permissions(permission); } private Project project() { return new Project().name("RED").key(new BambooKey("RED")); } public Plan createDockerBuildPlan() { return new Plan(project(), "Redaction UI", new BambooKey("REDUI")) .description("Docker build for Redaction UI.").stages( new Stage("Build Stage").jobs(creatGinCloudPlatformImagesJob("weaver")) .jobs(creatGinCloudPlatformImagesJob("database-modeler")) .jobs(creatGinCloudPlatformImagesJob("landing-page")) .jobs(creatGinCloudPlatformBrowserExtentionImagesJob("browser-extension"))) .stages(new Stage("Upstream Push Stage").jobs(creatGinCloudPlatformUpstreamJob())) .linkedRepositories("RED / ui").triggers(new BitbucketServerTrigger()).planBranchManagement( new PlanBranchManagement().createForVcsBranch() .delete(new BranchCleanup().whenInactiveInRepositoryAfterDays(30)).notificationForCommitters()); } public Job creatGinCloudPlatformImagesJob(String project) { return new Job("Build Job: " + project, new BambooKey(project.toUpperCase().replaceAll("-", ""))).tasks( new VcsCheckoutTask().description("Checkout Default Repository") .checkoutItems(new CheckoutItem().defaultRepository()), new ScriptTask().description("Build") .inlineBody( "#!/bin/bash\n" + "set -e\n" + "imageName=\"nexus.iqser.com:5001/gin5/gcp-" + project + "\"\n" + "dockerfileLocation=\"build/docker/" + project + "/Dockerfile\"\n" + "docker build -t ${imageName}:latest -f ${dockerfileLocation} .\n" + "if [[ \"${bamboo.planRepository.branchName}\" == \"master\" ]]\n" + "then\n" + " ./versions.sh patch\n" + " version=$(cat package.json | jq -r '.version')\n" + " echo \"Publishing Images with version $version\"\n" + " echo ${bamboo.bamboo_download_pass} | docker login -u ${bamboo.bamboo_download_user} --password-stdin nexus.iqser.com:5001\n" + " docker push ${imageName}:latest\n" + " docker tag ${imageName}:latest ${imageName}:${version}\n" + " docker push ${imageName}:${version}\n" + "fi\n")).dockerConfiguration( new DockerConfiguration().image("nexus.iqser.com:5001/infra/release_build:2.9.1") .volume("/var/run/docker.sock", "/var/run/docker.sock")); } public Job creatGinCloudPlatformBrowserExtentionImagesJob(String project) { return new Job("Build Job: " + project, new BambooKey(project.toUpperCase().replaceAll("-", ""))).tasks( new VcsCheckoutTask().description("Checkout Default Repository") .checkoutItems(new CheckoutItem().defaultRepository()), new ScriptTask().description("Build") .inlineBody( "#!/bin/bash\n" + "set -e\n" + "imageName=\"nexus.iqser.com:5001/gin5/gcp-" + project + "\"\n" + "dockerfileLocation=\"build/docker/" + project + "/Dockerfile\"\n" + "docker build -t ${imageName}:latest -f ${dockerfileLocation} .\n" + "mkdir -p dist\n" + "docker rm -fv extension-build || true \n" + "docker create -ti --name extension-build ${imageName}:latest bash\n" + "docker cp extension-build:/instantli-extension-chrome.zip instantli-extension-chrome.zip\n" + "docker cp extension-build:/instantli-extension-firefox.zip instantli-extension-firefox.zip\n" + "docker cp extension-build:/instantli-ext-source-code.zip instantli-ext-source-code.zip\n")) .dockerConfiguration(new DockerConfiguration().image("nexus.iqser.com:5001/infra/release_build:2.9.1") .volume("/var/run/docker.sock", "/var/run/docker.sock")).artifacts( new Artifact("instantli-extension-chrome.zip").location(".") .copyPattern("instantli-extension-chrome.zip").shared(true), new Artifact("instantli-extension-firefox.zip").location(".") .copyPattern("instantli-extension-firefox.zip").shared(true), new Artifact("instantli-ext-source-code.zip").location(".") .copyPattern("instantli-ext-source-code.zip").shared(true)); } public Job creatGinCloudPlatformUpstreamJob() { return new Job("Upstream Push", new BambooKey("USPSH")).tasks( new VcsCheckoutTask().description("Checkout Default Repository") .checkoutItems(new CheckoutItem().defaultRepository()), new ScriptTask().description("Build") .inlineBody( "#!/bin/bash\n" + "set -e\n" + "if [[ \"${bamboo.planRepository.branchName}\" == \"master\" ]]\n" + "then\n" + " ./versions.sh patch\n" + "fi\n"), new VcsCommitTask().commitMessage("chore(release)").repository("RED / ui")).dockerConfiguration( new DockerConfiguration().image("nexus.iqser.com:5001/infra/release_build:2.9.1") .volume("/var/run/docker.sock", "/var/run/docker.sock")); } }