From 0c03802e4481bb77738e6c89b874dd88a171b8f1 Mon Sep 17 00:00:00 2001 From: liaozan <378024053@qq.com> Date: Sat, 13 May 2023 04:42:29 +0800 Subject: [PATCH] Move jenkins-plugin to standard project --- .../integration-jenkins-plugin/LICENSE | 201 ------------- .../integration-jenkins-plugin/README.md | 26 -- .../integration-jenkins-plugin/pom.xml | 65 ---- .../action/ViewBuildScriptAction.java | 61 ---- .../integration/builder/BuilderContext.java | 145 --------- .../integration/builder/FileManager.java | 44 --- .../builder/IntegrationBuilder.java | 282 ------------------ .../builder/config/BuildConfig.java | 43 --- .../builder/config/DeployToK8sConfig.java | 101 ------- .../builder/config/DockerConfig.java | 189 ------------ .../builder/config/MavenConfig.java | 57 ---- .../config/deploy/DeployStyleRadio.java | 31 -- .../deploy/DeployTemplateComponent.java | 104 ------- .../deploy/PointDeployFileComponent.java | 41 --- .../deploy/service/ServiceDeployConfig.java | 90 ------ .../builder/constants/Constants.java | 80 ----- .../builder/env/BuildEnvContributor.java | 49 --- .../integration/builder/util/FileUtils.java | 125 -------- .../integration/builder/util/Logger.java | 46 --- .../builder/util/TemplateUtils.java | 45 --- .../action/ViewBuildScriptAction/index.jelly | 10 - .../builder/IntegrationBuilder/config.jelly | 13 - .../config/DeployToK8sConfig/config.jelly | 37 --- .../builder/config/DockerConfig/config.jelly | 54 ---- .../builder/config/MavenConfig/config.jelly | 16 - .../DeployTemplateComponent/config.jelly | 32 -- .../PointDeployFileComponent/config.jelly | 12 - .../src/main/resources/index.jelly | 7 - integration/pom.xml | 1 - 29 files changed, 2007 deletions(-) delete mode 100644 integration/integration-jenkins-plugin/LICENSE delete mode 100644 integration/integration-jenkins-plugin/README.md delete mode 100644 integration/integration-jenkins-plugin/pom.xml delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/action/ViewBuildScriptAction.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/BuilderContext.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/FileManager.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/IntegrationBuilder.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/BuildConfig.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/DeployToK8sConfig.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/DockerConfig.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/MavenConfig.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/DeployStyleRadio.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/DeployTemplateComponent.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/PointDeployFileComponent.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/service/ServiceDeployConfig.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/constants/Constants.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/env/BuildEnvContributor.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/util/FileUtils.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/util/Logger.java delete mode 100644 integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/util/TemplateUtils.java delete mode 100644 integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/action/ViewBuildScriptAction/index.jelly delete mode 100644 integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/IntegrationBuilder/config.jelly delete mode 100644 integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/DeployToK8sConfig/config.jelly delete mode 100644 integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/DockerConfig/config.jelly delete mode 100644 integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/MavenConfig/config.jelly delete mode 100644 integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/DeployTemplateComponent/config.jelly delete mode 100644 integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/PointDeployFileComponent/config.jelly delete mode 100644 integration/integration-jenkins-plugin/src/main/resources/index.jelly diff --git a/integration/integration-jenkins-plugin/LICENSE b/integration/integration-jenkins-plugin/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/integration/integration-jenkins-plugin/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. diff --git a/integration/integration-jenkins-plugin/README.md b/integration/integration-jenkins-plugin/README.md deleted file mode 100644 index ef290c8..0000000 --- a/integration/integration-jenkins-plugin/README.md +++ /dev/null @@ -1,26 +0,0 @@ -### How to develop - -* add the following content to your maven settings.xml -* active jenkins profile on your ide - -```xml - - jenkins - - - repo.jenkins-ci.org - https://repo.jenkins-ci.org/public/ - - - - - repo.jenkins-ci.org - https://repo.jenkins-ci.org/public/ - - - - ``` - -### How to build - -run `mvn clean package -Dmaven.test.skip` in terminal, plugin will be stored in the target directory named `integration-jenkins-plugin.hpi`, upload it to your jenkins server diff --git a/integration/integration-jenkins-plugin/pom.xml b/integration/integration-jenkins-plugin/pom.xml deleted file mode 100644 index c9dbf55..0000000 --- a/integration/integration-jenkins-plugin/pom.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - 4.0.0 - - - org.jenkins-ci.plugins - plugin - - 4.62 - - - - com.schbrain.ci.jenkins.plugins - integration-jenkins-plugin - 1.0 - hpi - - - integration-1.0 - - - - 2.397 - true - true - true - true - - - - - org.slf4j - slf4j-api - - - org.apache.velocity - velocity-engine-core - 2.3 - - - org.apache.commons - commons-lang3 - 3.12.0 - - - org.jenkins-ci.plugins - git - 5.0.1 - - - org.jenkins-ci.tools - git-parameter - 0.9.18 - - - org.jenkins-ci.plugins - localization-zh-cn - 1.0.24 - - - - \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/action/ViewBuildScriptAction.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/action/ViewBuildScriptAction.java deleted file mode 100644 index 7c82e40..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/action/ViewBuildScriptAction.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.action; - -import hudson.FilePath; -import hudson.model.*; -import jenkins.model.RunAction2; -import org.kohsuke.stapler.StaplerRequest; -import org.kohsuke.stapler.StaplerResponse; - -import java.io.File; - -/** - * @author liaozan - * @since 2022/2/16 - */ -public class ViewBuildScriptAction implements RunAction2 { - - private final String buildScriptDir; - - private transient Run run; - - public ViewBuildScriptAction(File buildScriptDir) { - this.buildScriptDir = buildScriptDir.getAbsolutePath(); - } - - @Override - public String getIconFileName() { - return "document.png"; - } - - @Override - public String getDisplayName() { - return "构建脚本"; - } - - @Override - public String getUrlName() { - return "build-scripts"; - } - - @Override - public void onAttached(Run run) { - this.run = run; - } - - @Override - public void onLoad(Run run) { - this.run = run; - } - - public Run getRun() { - return run; - } - - @SuppressWarnings({"unused", "rawtypes"}) - public DirectoryBrowserSupport doList(StaplerRequest request, StaplerResponse response) { - AbstractBuild build = (AbstractBuild) request.findAncestor(AbstractBuild.class).getObject(); - FilePath filePath = new FilePath(new File(buildScriptDir)); - return new DirectoryBrowserSupport(build, filePath, "构建脚本", "folder.png", true); - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/BuilderContext.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/BuilderContext.java deleted file mode 100644 index 4ba413c..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/BuilderContext.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder; - -import com.schbrain.ci.jenkins.plugins.integration.builder.env.BuildEnvContributor; -import com.schbrain.ci.jenkins.plugins.integration.builder.util.Logger; -import com.schbrain.ci.jenkins.plugins.integration.builder.util.TemplateUtils; -import hudson.*; -import hudson.model.AbstractBuild; -import hudson.model.BuildListener; -import hudson.tasks.Shell; - -import java.io.IOException; -import java.util.Objects; - -/** - * @author zhangdd on 2022/1/21 - */ -public class BuilderContext { - - private final AbstractBuild build; - - private final Launcher launcher; - - private final FilePath workspace; - - private final BuildListener listener; - - private final Logger logger; - - private final EnvVars envVars; - - private boolean imageHasBeenBuilt; - - private BuilderContext(Builder builder) { - this.build = builder.build; - this.launcher = builder.launcher; - this.workspace = builder.workspace; - this.listener = builder.listener; - this.logger = builder.logger; - this.envVars = builder.envVars; - this.imageHasBeenBuilt = false; - } - - public void execute(String command) throws InterruptedException, IOException { - String resolvedCommand = TemplateUtils.evaluate(command, envVars); - if (!Objects.equals(resolvedCommand, command)) { - log("before resolve: %s", command); - command = resolvedCommand; - } - log("%s", command); - BuildEnvContributor.saveEnvVarsToDisk(this); - Shell shell = new Shell(command); - shell.perform(getBuild(), getLauncher(), getListener()); - } - - public AbstractBuild getBuild() { - return build; - } - - public Launcher getLauncher() { - return launcher; - } - - public FilePath getWorkspace() { - return workspace; - } - - public BuildListener getListener() { - return listener; - } - - public Logger getLogger() { - return logger; - } - - public EnvVars getEnvVars() { - return envVars; - } - - public boolean isImageHasBeenBuilt() { - return imageHasBeenBuilt; - } - - public void setImageHasBeenBuilt() { - this.imageHasBeenBuilt = true; - } - - public void log(String template) { - log(template, (Object) null); - } - - public void log(String template, Object... arguments) { - logger.println(template, true, arguments); - } - - public static class Builder { - - private AbstractBuild build; - - private Launcher launcher; - - private FilePath workspace; - - private BuildListener listener; - - private Logger logger; - - private EnvVars envVars; - - public Builder build(AbstractBuild build) { - this.build = build; - return this; - } - - public Builder launcher(Launcher launcher) { - this.launcher = launcher; - return this; - } - - public Builder workspace(FilePath workspace) { - this.workspace = workspace; - return this; - } - - public Builder listener(BuildListener listener) { - this.listener = listener; - return this; - } - - public Builder logger(Logger logger) { - this.logger = logger; - return this; - } - - public Builder envVars(EnvVars envVars) { - this.envVars = envVars; - return this; - } - - public BuilderContext build() { - return new BuilderContext(this); - } - - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/FileManager.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/FileManager.java deleted file mode 100644 index fb62b65..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/FileManager.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder; - -import hudson.model.AbstractBuild; - -import java.io.File; -import java.io.IOException; -import java.util.Objects; - -import static com.schbrain.ci.jenkins.plugins.integration.builder.constants.Constants.BuildConstants.*; - -/** - * @author liaozan - * @since 2022/2/8 - */ -@SuppressWarnings("ResultOfMethodCallIgnored") -public class FileManager { - - public static File getCurrentBuildDir(AbstractBuild build) { - return build.getRootDir(); - } - - public static File getWorkspaceBuildScriptDir(AbstractBuild build) { - return new File(Objects.requireNonNull(build.getWorkspace()).getRemote(), BUILD_SCRIPT_NAME); - } - - public static File getEnvVarsFile(AbstractBuild build) throws IOException { - File buildScriptDir = getBuildScriptDir(build); - File envVarsFile = new File(buildScriptDir, ENV_VARS); - if (!envVarsFile.exists()) { - envVarsFile.createNewFile(); - } - return envVarsFile; - } - - public static File getBuildScriptDir(AbstractBuild build) { - File buildDir = getCurrentBuildDir(build); - File buildScriptDir = new File(buildDir, BUILD_SCRIPT_NAME); - if (!buildScriptDir.exists()) { - buildScriptDir.mkdirs(); - } - return buildScriptDir; - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/IntegrationBuilder.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/IntegrationBuilder.java deleted file mode 100644 index 3019f89..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/IntegrationBuilder.java +++ /dev/null @@ -1,282 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder; - -import com.schbrain.ci.jenkins.plugins.integration.action.ViewBuildScriptAction; -import com.schbrain.ci.jenkins.plugins.integration.builder.config.*; -import com.schbrain.ci.jenkins.plugins.integration.builder.config.DockerConfig.PushConfig; -import com.schbrain.ci.jenkins.plugins.integration.builder.util.FileUtils; -import com.schbrain.ci.jenkins.plugins.integration.builder.util.Logger; -import edu.umd.cs.findbugs.annotations.CheckForNull; -import hudson.*; -import hudson.model.*; -import hudson.tasks.Builder; -import net.sf.json.JSONObject; -import org.apache.commons.lang.StringUtils; -import org.kohsuke.stapler.DataBoundConstructor; -import org.kohsuke.stapler.StaplerRequest; -import org.springframework.lang.Nullable; - -import java.io.IOException; -import java.util.List; -import java.util.Map; - -import static com.schbrain.ci.jenkins.plugins.integration.builder.constants.Constants.BuildConstants.*; -import static com.schbrain.ci.jenkins.plugins.integration.builder.constants.Constants.*; -import static com.schbrain.ci.jenkins.plugins.integration.builder.util.FileUtils.lookupFile; - -/** - * @author liaozan - * @since 2022/1/14 - */ -@SuppressWarnings("unused") -public class IntegrationBuilder extends Builder { - - private final MavenConfig mavenConfig; - - private final DockerConfig dockerConfig; - - private final DeployToK8sConfig deployToK8sConfig; - - @DataBoundConstructor - public IntegrationBuilder(@Nullable MavenConfig mavenConfig, - @Nullable DockerConfig dockerConfig, - @Nullable DeployToK8sConfig deployToK8sConfig) { - this.mavenConfig = mavenConfig; - this.dockerConfig = dockerConfig; - this.deployToK8sConfig = deployToK8sConfig; - } - - @Nullable - public MavenConfig getMavenConfig() { - return mavenConfig; - } - - @Nullable - public DockerConfig getDockerConfig() { - return dockerConfig; - } - - @Nullable - public DeployToK8sConfig getDeployToK8sConfig() { - return deployToK8sConfig; - } - - /** - * Builder start - */ - @Override - public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException { - build.addAction(new ViewBuildScriptAction(FileManager.getBuildScriptDir(build))); - BuilderContext builderContext = new BuilderContext.Builder() - .build(build) - .launcher(launcher) - .listener(listener) - .logger(Logger.of(listener.getLogger())) - .workspace(checkWorkspaceValid(build.getWorkspace())) - .envVars(createEnvVars(build)) - .build(); - return doPerformBuild(builderContext); - } - - @Override - public IntegrationDescriptor getDescriptor() { - return (IntegrationDescriptor) super.getDescriptor(); - } - - protected boolean doPerformBuild(BuilderContext context) throws IOException, InterruptedException { - try { - // download build scripts - downloadBuildScript(context); - // maven build - performMavenBuild(context); - // read maven build-info - readMavenBuildInfo(context); - // docker build - performDockerBuild(context); - // docker push - performDockerPush(context); - // deploy - deployToRemote(context); - } finally { - if (context.isImageHasBeenBuilt()) { - // delete the built image if possible - deleteImageAfterBuild(context); - } - // setup description - setBuildDescription(context); - // copy to buildDir - saveTheBuildScripts(context); - } - return true; - } - - private EnvVars createEnvVars(AbstractBuild build) { - EnvVars envVars = new EnvVars(); - ParametersAction parametersAction = build.getAction(ParametersAction.class); - if (parametersAction == null) { - return envVars; - } - List allParameters = parametersAction.getAllParameters(); - for (ParameterValue parameter : allParameters) { - if (parameter.getValue() == null) { - continue; - } - envVars.put(parameter.getName(), parameter.getValue().toString()); - } - return envVars; - } - - private void downloadBuildScript(BuilderContext context) throws IOException, InterruptedException { - String buildScriptUrl = DEFAULT_SCRIPT_GIT_REPO; - String buildScriptBranch = DEFAULT_SCRIPT_GIT_BRANCH; - // if buildScriptUrl and buildScriptBranch is set, will use specified value to download build-script, otherwise will use default value - if (getDockerConfig() != null) { - if (StringUtils.isNotBlank(getDockerConfig().getBuildScriptUrl())) { - buildScriptUrl = getDockerConfig().getBuildScriptUrl(); - } - if (StringUtils.isNotBlank(getDockerConfig().getBuildScriptBranch())) { - buildScriptBranch = getDockerConfig().getBuildScriptBranch(); - } - } - // git archive the build scripts - String archiveCommand = String.format("git archive -o %s --format=zip --remote=%s %s", SCRIPT_ZIP_NAME, buildScriptUrl, buildScriptBranch); - context.execute(archiveCommand); - // unzip to directory in workspace - String unzipCommand = String.format("unzip -o %s -d %s", SCRIPT_ZIP_NAME, BUILD_SCRIPT_NAME); - context.execute(unzipCommand); - } - - private void setBuildDescription(BuilderContext context) throws IOException, InterruptedException { - FilePath gitPropertiesFile = lookupFile(context, GitConstants.GIT_PROPERTIES_FILE); - if (gitPropertiesFile == null) { - return; - } - Map gitProperties = FileUtils.filePathToMap(gitPropertiesFile); - String author = gitProperties.get(GitConstants.GIT_COMMITTER); - String branch = gitProperties.get(GitConstants.GIT_BRANCH); - AbstractBuild build = context.getBuild(); - String description = String.format("author: %s, branch: %s", author, branch); - build.setDescription(description); - } - - /** - * Check workspace - */ - private FilePath checkWorkspaceValid(@CheckForNull FilePath workspace) throws IOException, InterruptedException { - if (workspace == null) { - throw new IllegalStateException("workspace is null"); - } - if (!workspace.exists()) { - throw new IllegalStateException("workspace is not exist"); - } - return workspace; - } - - private void performMavenBuild(BuilderContext context) throws IOException, InterruptedException { - MavenConfig mavenConfig = getMavenConfig(); - if (mavenConfig == null) { - context.log("maven build is not checked"); - return; - } - - mavenConfig.build(context); - } - - private void readMavenBuildInfo(BuilderContext context) throws IOException, InterruptedException { - EnvVars envVars = context.getEnvVars(); - FilePath dockerBuildInfo = lookupFile(context, DockerConstants.BUILD_INFO_FILE_NAME); - if (dockerBuildInfo == null) { - context.log("%s file not exist, skip docker build", DockerConstants.BUILD_INFO_FILE_NAME); - return; - } - // overwriting existing environment variables is not allowed - FileUtils.filePathToMap(dockerBuildInfo).forEach(envVars::putIfAbsent); - } - - private void performDockerBuild(BuilderContext context) throws IOException, InterruptedException { - DockerConfig dockerConfig = getDockerConfig(); - if (dockerConfig == null) { - context.log("docker build is not checked"); - return; - } - - dockerConfig.build(context); - } - - private void performDockerPush(BuilderContext context) throws IOException, InterruptedException { - DockerConfig dockerConfig = getDockerConfig(); - if (dockerConfig == null) { - context.log("docker build is not checked"); - return; - } - PushConfig pushConfig = dockerConfig.getPushConfig(); - if (pushConfig == null) { - context.log("docker push is not checked"); - return; - } - - pushConfig.build(context); - } - - /** - * Delete the image produced in the build - */ - private void deleteImageAfterBuild(BuilderContext context) throws InterruptedException, IOException { - DockerConfig dockerConfig = getDockerConfig(); - if (dockerConfig == null) { - context.log("docker build is not checked"); - return; - } - if (!dockerConfig.getDeleteImageAfterBuild()) { - context.log("delete built image is skip"); - return; - } - - String imageName = context.getEnvVars().get(DockerConstants.IMAGE); - if (imageName == null) { - return; - } - - String command = String.format("docker rmi -f %s", imageName); - context.execute(command); - } - - /** - * 部署镜像到远端 - */ - private void deployToRemote(BuilderContext context) throws IOException, InterruptedException { - DeployToK8sConfig k8sConfig = getDeployToK8sConfig(); - if (k8sConfig == null) { - context.log("k8s deploy is not checked"); - return; - } - - k8sConfig.build(context); - } - - private void saveTheBuildScripts(BuilderContext context) throws InterruptedException, IOException { - String copy = String.format("cp -r %s %s", BUILD_SCRIPT_NAME, FileManager.getCurrentBuildDir(context.getBuild())); - context.execute(copy); - } - - // can not move outside builder class - @Extension - public static class IntegrationDescriptor extends Descriptor { - - public IntegrationDescriptor() { - load(); - } - - @Override - public String getDisplayName() { - return "发布集成"; - } - - @Override - public boolean configure(StaplerRequest req, JSONObject formData) throws FormException { - save(); - return super.configure(req, formData); - } - - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/BuildConfig.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/BuildConfig.java deleted file mode 100644 index a266c11..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/BuildConfig.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder.config; - -import com.schbrain.ci.jenkins.plugins.integration.builder.BuilderContext; -import com.schbrain.ci.jenkins.plugins.integration.builder.util.Logger; -import hudson.*; -import hudson.model.*; - -import java.io.IOException; - -/** - * @author liaozan - * @since 2022/1/17 - */ -public abstract class BuildConfig> extends AbstractDescribableImpl { - - protected AbstractBuild build; - - protected Launcher launcher; - - protected FilePath workspace; - - protected BuildListener listener; - - protected Logger logger; - - protected EnvVars envVars; - - protected BuilderContext context; - - public void build(BuilderContext context) throws IOException, InterruptedException { - this.context = context; - this.build = context.getBuild(); - this.launcher = context.getLauncher(); - this.workspace = context.getWorkspace(); - this.listener = context.getListener(); - this.logger = context.getLogger(); - this.envVars = context.getEnvVars(); - doBuild(); - } - - protected abstract void doBuild() throws InterruptedException, IOException; - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/DeployToK8sConfig.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/DeployToK8sConfig.java deleted file mode 100644 index 6873148..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/DeployToK8sConfig.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder.config; - -import com.schbrain.ci.jenkins.plugins.integration.builder.config.deploy.DeployStyleRadio; -import com.schbrain.ci.jenkins.plugins.integration.builder.config.deploy.service.ServiceDeployConfig; -import com.schbrain.ci.jenkins.plugins.integration.builder.constants.Constants.DockerConstants; -import com.schbrain.ci.jenkins.plugins.integration.builder.util.FileUtils; -import hudson.*; -import hudson.model.Descriptor; -import jenkins.model.Jenkins; -import org.apache.commons.lang.StringUtils; -import org.kohsuke.stapler.DataBoundConstructor; - -import java.io.File; -import java.io.IOException; -import java.util.List; - -/** - * @author liaozan - * @since 2022/1/16 - */ -@SuppressWarnings("unused") -public class DeployToK8sConfig extends BuildConfig { - - private final String configLocation; - - private final DeployStyleRadio deployStyle; - - private final ServiceDeployConfig serviceDeployConfig; - - @DataBoundConstructor - public DeployToK8sConfig(String configLocation, DeployStyleRadio deployStyle, ServiceDeployConfig serviceDeployConfig) { - this.configLocation = Util.fixNull(configLocation); - this.deployStyle = deployStyle; - this.serviceDeployConfig = serviceDeployConfig; - } - - public String getConfigLocation() { - return configLocation; - } - - public DeployStyleRadio getDeployStyle() { - return deployStyle; - } - - public ServiceDeployConfig getServiceDeployConfig() { - return serviceDeployConfig; - } - - public void doBuild() throws InterruptedException, IOException { - String imageName = envVars.get(DockerConstants.IMAGE); - if (StringUtils.isBlank(imageName)) { - context.log("image name is empty ,skip deploy"); - return; - } - // make sure to build Deployment first - buildDeployment(); - buildService(); - } - - private void buildDeployment() throws IOException, InterruptedException { - DeployStyleRadio deployStyle = getDeployStyle(); - if (null == deployStyle) { - return; - } - - String deployFileLocation = deployStyle.getDeployFileLocation(context); - executeK8sCommand(deployFileLocation); - } - - private void buildService() throws IOException, InterruptedException { - if (serviceDeployConfig == null) { - return; - } - String deployFileLocation = serviceDeployConfig.getServiceDeployFileLocation(context); - executeK8sCommand(deployFileLocation); - } - - private void executeK8sCommand(String deployFileLocation) throws InterruptedException, IOException { - String configLocation = getConfigLocation(); - if (null == configLocation) { - context.log("not specified configLocation of k8s config ,will use default config ."); - } - - String deployFileRelativePath = FileUtils.toRelativePath(workspace, new FilePath(new File(deployFileLocation))); - String command = String.format("kubectl apply -f %s", deployFileRelativePath); - if (StringUtils.isNotBlank(configLocation)) { - command = command + " --kubeconfig " + configLocation; - } - context.execute(command); - } - - @Extension - public static class DescriptorImpl extends Descriptor { - - public List> getDeployStyles() { - return Jenkins.get().getDescriptorList(DeployStyleRadio.class); - } - - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/DockerConfig.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/DockerConfig.java deleted file mode 100644 index 1f67569..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/DockerConfig.java +++ /dev/null @@ -1,189 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder.config; - -import com.schbrain.ci.jenkins.plugins.integration.builder.util.FileUtils; -import com.schbrain.ci.jenkins.plugins.integration.builder.util.TemplateUtils; -import hudson.*; -import hudson.model.Descriptor; -import org.apache.commons.lang3.StringUtils; -import org.kohsuke.stapler.DataBoundConstructor; -import org.springframework.lang.Nullable; - -import java.io.IOException; -import java.nio.file.Paths; -import java.time.Instant; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; - -import static com.schbrain.ci.jenkins.plugins.integration.builder.constants.Constants.BuildConstants.BUILD_SCRIPT_NAME; -import static com.schbrain.ci.jenkins.plugins.integration.builder.constants.Constants.DockerConstants.*; -import static com.schbrain.ci.jenkins.plugins.integration.builder.util.FileUtils.lookupFile; - -/** - * @author liaozan - * @since 2022/1/16 - */ -@SuppressWarnings("unused") -public class DockerConfig extends BuildConfig { - - private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.systemDefault()); - - private final Boolean buildImage; - - private final PushConfig pushConfig; - - private final Boolean deleteImageAfterBuild; - - private final String javaOpts; - - private final String buildScriptUrl; - - private final String buildScriptBranch; - - private final Boolean disableSkywalking; - - @DataBoundConstructor - public DockerConfig(Boolean buildImage, PushConfig pushConfig, Boolean deleteImageAfterBuild, String javaOpts, - String buildScriptUrl, String buildScriptBranch, Boolean disableSkywalking) { - this.buildImage = Util.fixNull(buildImage, false); - this.pushConfig = pushConfig; - this.deleteImageAfterBuild = Util.fixNull(deleteImageAfterBuild, false); - this.javaOpts = Util.fixNull(javaOpts); - this.buildScriptUrl = buildScriptUrl; - this.buildScriptBranch = buildScriptBranch; - this.disableSkywalking = disableSkywalking; - } - - @Nullable - public PushConfig getPushConfig() { - return pushConfig; - } - - public Boolean getBuildImage() { - return buildImage; - } - - public Boolean getDeleteImageAfterBuild() { - return deleteImageAfterBuild; - } - - public String getJavaOpts() { - return javaOpts; - } - - public String getBuildScriptUrl() { - return buildScriptUrl; - } - - public String getBuildScriptBranch() { - return buildScriptBranch; - } - - public Boolean getDisableSkywalking() { - return disableSkywalking; - } - - @Override - public void doBuild() throws IOException, InterruptedException { - if (!getBuildImage()) { - context.log("docker build image is skipped"); - return; - } - - String javaOpts = this.javaOpts; - if (Boolean.TRUE.equals(getDisableSkywalking())) { - if (StringUtils.isBlank(javaOpts)) { - javaOpts = DISABLE_SKYWALKING_OPTIONS; - } else { - javaOpts = javaOpts + " " + DISABLE_SKYWALKING_OPTIONS; - } - } - envVars.put(JAVA_OPTS, javaOpts); - - String imageName = getFullImageName(); - if (imageName == null) { - return; - } - envVars.put(IMAGE, imageName); - - FilePath dockerfile = lookupFile(workspace.child(BUILD_SCRIPT_NAME), DOCKERFILE_NAME, context.getLogger()); - if (dockerfile == null) { - context.log("Dockerfile not exist, skip docker build"); - return; - } - - TemplateUtils.evaluate(Paths.get(dockerfile.getRemote()), context); - - String relativePath = FileUtils.toRelativePath(workspace, dockerfile); - String command = String.format("docker build --pull -t %s -f %s .", imageName, relativePath); - context.execute(command); - context.setImageHasBeenBuilt(); - } - - private String getFullImageName() { - String registry = null; - PushConfig pushConfig = getPushConfig(); - if (pushConfig != null) { - registry = pushConfig.getRegistry(); - } - if (StringUtils.isBlank(registry)) { - registry = envVars.get(REGISTRY); - } - if (StringUtils.isBlank(registry)) { - throw new IllegalArgumentException("REGISTRY is null or empty"); - } - - String appName = envVars.get(APP_NAME); - String version = envVars.get(VERSION); - String buildTime = DATE_TIME_FORMATTER.format(Instant.ofEpochMilli(build.getStartTimeInMillis())); - return String.format("%s/%s:%s-%s", registry, appName, version, buildTime); - } - - @Extension - public static class DescriptorImpl extends Descriptor { - - } - - public static class PushConfig extends BuildConfig { - - private final Boolean pushImage; - - private final String registry; - - @DataBoundConstructor - public PushConfig(Boolean pushImage, String registry) { - this.pushImage = pushImage; - this.registry = registry; - } - - public Boolean getPushImage() { - return pushImage; - } - - public String getRegistry() { - return registry; - } - - @Override - public void doBuild() throws IOException, InterruptedException { - if (!getPushImage()) { - logger.println("docker push image is skipped"); - return; - } - - String imageName = envVars.get(IMAGE); - if (imageName == null) { - return; - } - String command = String.format("docker push %s", imageName); - context.execute(command); - } - - @Extension - @SuppressWarnings("unused") - public static class DescriptorImpl extends Descriptor { - - } - - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/MavenConfig.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/MavenConfig.java deleted file mode 100644 index 8ea69fa..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/MavenConfig.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder.config; - -import hudson.Extension; -import hudson.Util; -import hudson.model.Descriptor; -import org.apache.commons.lang.StringUtils; -import org.kohsuke.stapler.DataBoundConstructor; - -import java.io.IOException; - -/** - * @author liaozan - * @since 2022/1/16 - */ -@SuppressWarnings("unused") -public class MavenConfig extends BuildConfig { - - private final String mvnCommand; - - private final String javaHome; - - @DataBoundConstructor - public MavenConfig(String mvnCommand, String javaHome) { - this.mvnCommand = Util.fixNull(mvnCommand); - this.javaHome = Util.fixNull(javaHome); - } - - public String getMvnCommand() { - return mvnCommand; - } - - public String getJavaHome() { - return javaHome; - } - - @Override - public void doBuild() throws IOException, InterruptedException { - String mavenCommand = getMvnCommand(); - if (StringUtils.isBlank(mavenCommand)) { - logger.println("maven command is empty, skip maven build"); - return; - } - - String javaHome = getJavaHome(); - if (StringUtils.isNotBlank(javaHome)) { - envVars.put("JAVA_HOME", javaHome); - } - - context.execute(mavenCommand); - } - - @Extension - public static class DescriptorImpl extends Descriptor { - - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/DeployStyleRadio.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/DeployStyleRadio.java deleted file mode 100644 index 7fd4be9..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/DeployStyleRadio.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder.config.deploy; - -import com.schbrain.ci.jenkins.plugins.integration.builder.BuilderContext; -import hudson.model.Describable; -import hudson.model.Descriptor; -import jenkins.model.Jenkins; - -import java.io.IOException; - -/** - * @author zhangdd on 2022/1/20 - */ -public abstract class DeployStyleRadio implements Describable { - - //--------------------------------------------------------------------- - // Abstract methods to be implemented by subclasses - //--------------------------------------------------------------------- - - public abstract String getDeployFileLocation(BuilderContext builderContext) throws IOException, InterruptedException; - - @Override - @SuppressWarnings("unchecked") - public Descriptor getDescriptor() { - return Jenkins.get().getDescriptor(getClass()); - } - - public abstract static class InventoryDescriptor extends Descriptor { - - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/DeployTemplateComponent.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/DeployTemplateComponent.java deleted file mode 100644 index fafddaa..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/DeployTemplateComponent.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder.config.deploy; - -import com.schbrain.ci.jenkins.plugins.integration.builder.BuilderContext; -import com.schbrain.ci.jenkins.plugins.integration.builder.FileManager; -import com.schbrain.ci.jenkins.plugins.integration.builder.util.TemplateUtils; -import edu.umd.cs.findbugs.annotations.NonNull; -import hudson.EnvVars; -import hudson.Extension; -import org.apache.commons.lang3.StringUtils; -import org.kohsuke.stapler.DataBoundConstructor; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; - -import static com.schbrain.ci.jenkins.plugins.integration.builder.constants.Constants.DeployConstants.*; - -/** - * @author zhangdd on 2022/1/20 - */ -@SuppressWarnings("unused") -public class DeployTemplateComponent extends DeployStyleRadio { - - private final String namespace; - - private final String replicas; - - private final String memoryRequest; - - private final String memoryLimit; - - private final String nodeTag; - - private final String port; - - @DataBoundConstructor - public DeployTemplateComponent(String namespace, String replicas, String memoryRequest, String memoryLimit, String nodeTag, String port) { - this.namespace = namespace; - this.replicas = replicas; - this.memoryRequest = memoryRequest; - this.memoryLimit = memoryLimit; - this.nodeTag = nodeTag; - this.port = port; - } - - public String getNamespace() { - return namespace; - } - - public String getReplicas() { - return replicas; - } - - public String getMemoryRequest() { - return memoryRequest; - } - - public String getMemoryLimit() { - return memoryLimit; - } - - public String getNodeTag() { - return nodeTag; - } - - public String getPort() { - return port; - } - - @Override - public String getDeployFileLocation(BuilderContext context) throws IOException, InterruptedException { - Path templateFile = getDeployTemplate(context); - contributeEnv(context.getEnvVars()); - TemplateUtils.evaluate(templateFile, context); - return templateFile.toString(); - } - - private void contributeEnv(EnvVars envVars) { - envVars.put(K8S_POD_NAMESPACE, getNamespace()); - envVars.put(K8S_POD_PORT, getPort()); - envVars.put(K8S_POD_REPLICAS, getReplicas()); - envVars.put(K8S_POD_MEMORY_REQUEST, getMemoryRequest()); - envVars.put(K8S_POD_MEMORY_LIMIT, getMemoryLimit()); - envVars.put(K8S_POD_NODE_TAG, StringUtils.isBlank(getNodeTag()) ? "app" : getNodeTag()); - } - - private Path getDeployTemplate(BuilderContext context) { - File buildScriptDir = FileManager.getWorkspaceBuildScriptDir(context.getBuild()); - return Paths.get(buildScriptDir.getPath(), DEPLOYMENT_TEMPLATE_FILE_NAME); - } - - @Extension - public static class DescriptorImpl extends InventoryDescriptor { - - @NonNull - @Override - public String getDisplayName() { - return "使用默认模版"; - } - - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/PointDeployFileComponent.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/PointDeployFileComponent.java deleted file mode 100644 index 9d5aef2..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/PointDeployFileComponent.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder.config.deploy; - -import com.schbrain.ci.jenkins.plugins.integration.builder.BuilderContext; -import edu.umd.cs.findbugs.annotations.NonNull; -import hudson.Extension; -import org.kohsuke.stapler.DataBoundConstructor; - -/** - * @author zhangdd on 2022/1/20 - */ -@SuppressWarnings("unused") -public class PointDeployFileComponent extends DeployStyleRadio { - - private final String deployFileLocation; - - @DataBoundConstructor - public PointDeployFileComponent(String deployFileLocation) { - this.deployFileLocation = deployFileLocation; - } - - public String getDeployFileLocation() { - return deployFileLocation; - } - - @Override - public String getDeployFileLocation(BuilderContext builderContext) { - return getDeployFileLocation(); - } - - @Extension - public static class DescriptorImpl extends InventoryDescriptor { - - @NonNull - @Override - public String getDisplayName() { - return "指定部署文件位置"; - } - - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/service/ServiceDeployConfig.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/service/ServiceDeployConfig.java deleted file mode 100644 index 613d952..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/service/ServiceDeployConfig.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder.config.deploy.service; - -import com.schbrain.ci.jenkins.plugins.integration.builder.BuilderContext; -import com.schbrain.ci.jenkins.plugins.integration.builder.FileManager; -import com.schbrain.ci.jenkins.plugins.integration.builder.util.TemplateUtils; -import hudson.EnvVars; -import org.kohsuke.stapler.DataBoundConstructor; -import org.springframework.util.StringUtils; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; - -import static com.schbrain.ci.jenkins.plugins.integration.builder.constants.Constants.DeployConstants.*; -import static com.schbrain.ci.jenkins.plugins.integration.builder.constants.Constants.DockerConstants.APP_NAME; - -/** - * @author liaozan - * @since 2022/3/10 - */ -public class ServiceDeployConfig { - - private final String serviceMode; - - private final String serviceNamespace; - - private final String serviceName; - - private final String servicePort; - - @DataBoundConstructor - public ServiceDeployConfig(String serviceMode, String serviceNamespace, String serviceName, String servicePort) { - this.serviceMode = serviceMode; - this.serviceNamespace = serviceNamespace; - this.serviceName = serviceName; - this.servicePort = servicePort; - } - - public String getServiceMode() { - return serviceMode; - } - - public String getServiceNamespace() { - return serviceNamespace; - } - - public String getServiceName() { - return serviceName; - } - - public String getServicePort() { - return servicePort; - } - - public String getServiceDeployFileLocation(BuilderContext context) throws IOException, InterruptedException { - Path templateFile = getServiceDeployTemplate(context); - contributeEnv(context.getEnvVars()); - TemplateUtils.evaluate(templateFile, context); - return templateFile.toString(); - } - - private void contributeEnv(EnvVars envVars) { - envVars.put(K8S_SERVICE_MODE, getServiceMode()); - - if (StringUtils.hasText(getServiceNamespace())) { - envVars.put(K8S_SERVICE_NAMESPACE, getServiceNamespace()); - } else { - envVars.put(K8S_SERVICE_NAMESPACE, envVars.get(K8S_POD_NAMESPACE)); - } - - if (StringUtils.hasText(getServiceName())) { - envVars.put(K8S_SERVICE_NAME, getServiceName()); - } else { - envVars.put(K8S_SERVICE_NAME, envVars.get(APP_NAME)); - } - - if (StringUtils.hasText(getServicePort())) { - envVars.put(K8S_SERVICE_PORT, getServicePort()); - } else { - envVars.put(K8S_SERVICE_PORT, envVars.get(K8S_POD_PORT)); - } - } - - private Path getServiceDeployTemplate(BuilderContext context) { - File buildScriptDir = FileManager.getWorkspaceBuildScriptDir(context.getBuild()); - return Paths.get(buildScriptDir.getPath(), SERVICE_TEMPLATE_FILE_NAME); - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/constants/Constants.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/constants/Constants.java deleted file mode 100644 index a47b470..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/constants/Constants.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder.constants; - -/** - * @author zhangdd on 2022/1/20 - */ -public class Constants { - - public static class BuildConstants { - - public static final String DEFAULT_SCRIPT_GIT_REPO = "git@gitlab.schbrain.com:tools/build-script.git"; - - public static final String DEFAULT_SCRIPT_GIT_BRANCH = "main"; - - public static final String SCRIPT_ZIP_NAME = "build-script.zip"; - - public static final String BUILD_SCRIPT_NAME = "build-script"; - - public static final String ENV_VARS = "envVars"; - - } - - public static class DeployConstants { - - public static final String DEPLOYMENT_TEMPLATE_FILE_NAME = "k8s-deploy-template.yaml"; - - public static final String SERVICE_TEMPLATE_FILE_NAME = "k8s-service-template.yaml"; - - public static final String K8S_POD_NAMESPACE = "NAMESPACE"; - - public static final String K8S_POD_PORT = "PORT"; - - public static final String K8S_POD_REPLICAS = "REPLICAS"; - - public static final String K8S_POD_MEMORY_LIMIT = "MEMORY_LIMIT"; - - public static final String K8S_POD_MEMORY_REQUEST = "MEMORY_REQUEST"; - - public static final String K8S_POD_NODE_TAG = "NODE_TAG"; - - public static final String K8S_SERVICE_MODE = "SERVICE_MODE"; - - public static final String K8S_SERVICE_NAMESPACE = "SERVICE_NAMESPACE"; - - public static final String K8S_SERVICE_NAME = "SERVICE_NAME"; - - public static final String K8S_SERVICE_PORT = "SERVICE_PORT"; - - } - - public static class DockerConstants { - - public static final String BUILD_INFO_FILE_NAME = "dockerBuildInfo"; - - public static final String DOCKERFILE_NAME = "Dockerfile"; - - public static final String IMAGE = "IMAGE"; - - public static final String REGISTRY = "REGISTRY"; - - public static final String APP_NAME = "APP_NAME"; - - public static final String VERSION = "VERSION"; - - public static final String JAVA_OPTS = "JAVA_OPTS"; - - public static final String DISABLE_SKYWALKING_OPTIONS = "-Dskywalking.agent.enable=false"; - - } - - public static class GitConstants { - - public static final String GIT_PROPERTIES_FILE = "git.properties"; - - public static final String GIT_BRANCH = "git.branch"; - - public static final String GIT_COMMITTER = "git.commit.user.name"; - - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/env/BuildEnvContributor.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/env/BuildEnvContributor.java deleted file mode 100644 index 2962a05..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/env/BuildEnvContributor.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder.env; - -import com.schbrain.ci.jenkins.plugins.integration.builder.BuilderContext; -import com.schbrain.ci.jenkins.plugins.integration.builder.FileManager; -import com.schbrain.ci.jenkins.plugins.integration.builder.util.FileUtils; -import hudson.EnvVars; -import hudson.Extension; -import hudson.model.AbstractBuild; -import hudson.model.BuildVariableContributor; - -import java.io.File; -import java.io.IOException; -import java.util.Map; - -/** - * @author liaozan - * @since 2022/1/17 - */ -@Extension -public class BuildEnvContributor extends BuildVariableContributor { - - private static final String DELIMITER = "="; - - public static void saveEnvVarsToDisk(BuilderContext context) throws IOException { - File envVarsFile = FileManager.getEnvVarsFile(context.getBuild()); - FileUtils.writeUtf8String("", envVarsFile); - FileUtils.writeUtf8Map(context.getEnvVars(), envVarsFile, DELIMITER); - } - - @Override - public void buildVariablesFor(AbstractBuild build, Map variables) { - File envFilePath; - try { - envFilePath = FileManager.getEnvVarsFile(build); - } catch (IOException e) { - return; - } - EnvVars envVars = new EnvVars(); - for (String line : FileUtils.readUtf8Lines(envFilePath)) { - String[] variablePair = line.split(DELIMITER); - // variables may not be split by = - if (variablePair.length != 1) { - envVars.putIfNotNull(variablePair[0], variablePair[1]); - } - } - variables.putAll(envVars); - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/util/FileUtils.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/util/FileUtils.java deleted file mode 100644 index 63a96a1..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/util/FileUtils.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder.util; - -import com.schbrain.ci.jenkins.plugins.integration.builder.BuilderContext; -import edu.umd.cs.findbugs.annotations.CheckForNull; -import hudson.FilePath; - -import java.io.*; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.nio.file.*; -import java.util.*; -import java.util.Map.Entry; - -/** - * @author liaozan - * @since 2022/1/17 - */ -public class FileUtils { - - /** - * lookup the special file - */ - @CheckForNull - public static FilePath lookupFile(BuilderContext context, String fileName) throws IOException, InterruptedException { - return lookupFile(context.getWorkspace(), fileName, context.getLogger()); - } - - /** - * lookup the special file - */ - @CheckForNull - public static FilePath lookupFile(FilePath searchLocation, String fileName, Logger logger) throws IOException, InterruptedException { - if (searchLocation == null || !searchLocation.exists()) { - logger.println("searchLocation not exist", true); - return null; - } - FilePath[] fileList = searchLocation.list("**/" + fileName); - if (fileList.length == 0) { - logger.println("could not found matched file: %s", fileName); - return null; - } - return getTheClosestFile(fileList); - } - - public static String toRelativePath(FilePath root, FilePath filePath) { - Path rootPath = Paths.get(root.getRemote()); - Path targetFilePath = Paths.get(filePath.getRemote()); - return rootPath.relativize(targetFilePath).toString(); - } - - public static FilePath getTheClosestFile(FilePath[] fileList) { - FilePath matched = fileList[0]; - if (fileList.length == 1) { - return matched; - } - - for (FilePath filePath : fileList) { - String filePathName = filePath.getRemote(); - if (filePathName.length() < matched.getRemote().length()) { - matched = filePath; - } - } - return matched; - } - - public static Map filePathToMap(FilePath lookupFile) throws IOException, InterruptedException { - Map result = new HashMap<>(); - Properties properties = new Properties(); - properties.load(new StringReader(lookupFile.readToString())); - for (String propertyName : properties.stringPropertyNames()) { - result.put(propertyName, properties.getProperty(propertyName)); - } - return result; - } - - public static void writeUtf8String(String content, File file) { - writeUtf8String(content, file.getPath()); - } - - public static void writeUtf8String(String content, String path) { - writeString(content, path, StandardCharsets.UTF_8); - } - - public static void writeString(String content, String path, Charset charset) { - try { - Path filePath = getFilePath(path); - Files.write(filePath, content.getBytes(charset)); - } catch (IOException e) { - throw new IllegalStateException(e); - } - } - - public static void writeUtf8Map(Map variables, File file, String delimiter) { - try { - Path filePath = getFilePath(file.getPath()); - BufferedWriter writer = Files.newBufferedWriter(filePath); - for (Entry entry : variables.entrySet()) { - String content = String.format("%s%s%s", entry.getKey(), delimiter, entry.getValue()); - writer.write(content); - writer.newLine(); - writer.flush(); - } - } catch (IOException e) { - throw new IllegalStateException(e); - } - } - - public static List readUtf8Lines(File file) { - try { - Path filePath = getFilePath(file.getPath()); - return Files.readAllLines(filePath); - } catch (IOException e) { - throw new IllegalStateException(e); - } - } - - private static Path getFilePath(String path) throws IOException { - Path filePath = Paths.get(path); - if (Files.notExists(filePath)) { - Files.createFile(filePath); - } - return filePath; - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/util/Logger.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/util/Logger.java deleted file mode 100644 index 97fb9bc..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/util/Logger.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder.util; - -import java.io.PrintStream; - -/** - * @author liaozan - * @since 2022/1/20 - */ -public class Logger extends PrintStream { - - private final PrintStream delegate; - - private Logger(PrintStream delegate) { - super(delegate); - this.delegate = delegate; - } - - public static Logger of(PrintStream delegate) { - return new Logger(delegate); - } - - public void println(String content, Object... args) { - println(content, true, args); - } - - public void println(String content, boolean format, Object... args) { - content = String.format(content, args); - println(content, format); - } - - public void println(String content, boolean format) { - if (format) { - String wrappedContent = "|| " + content + " ||"; - StringBuilder wrapperLine = new StringBuilder(); - wrapperLine.append("=".repeat(wrappedContent.length())); - delegate.println(); - delegate.println(wrapperLine); - delegate.println(wrappedContent); - delegate.println(wrapperLine); - delegate.println(); - } else { - delegate.println(content); - } - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/util/TemplateUtils.java b/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/util/TemplateUtils.java deleted file mode 100644 index 76f0674..0000000 --- a/integration/integration-jenkins-plugin/src/main/java/com/schbrain/ci/jenkins/plugins/integration/builder/util/TemplateUtils.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.schbrain.ci.jenkins.plugins.integration.builder.util; - -import com.schbrain.ci.jenkins.plugins.integration.builder.BuilderContext; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.Velocity; - -import java.io.IOException; -import java.io.StringWriter; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * @author liaozan - * @since 2022/1/23 - */ -public class TemplateUtils { - - public static void evaluate(Path templateFile, BuilderContext context) throws IOException, InterruptedException { - if (templateFile == null) { - return; - } - - String resolved = evaluate(Files.readString(templateFile), context.getEnvVars()); - Files.write(templateFile, resolved.getBytes(StandardCharsets.UTF_8)); - } - - public static String evaluate(String template, Map variables) { - if (null == template) { - return null; - } - if (null == variables || variables.isEmpty()) { - return template; - } - - Map params = new LinkedHashMap<>(variables); - VelocityContext velocityContext = new VelocityContext(params); - StringWriter writer = new StringWriter(); - Velocity.evaluate(velocityContext, writer, "Template Evaluate", template); - return writer.getBuffer().toString(); - } - -} \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/action/ViewBuildScriptAction/index.jelly b/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/action/ViewBuildScriptAction/index.jelly deleted file mode 100644 index 5a6876f..0000000 --- a/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/action/ViewBuildScriptAction/index.jelly +++ /dev/null @@ -1,10 +0,0 @@ - - - - -

构建脚本

- - -
-
-
\ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/IntegrationBuilder/config.jelly b/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/IntegrationBuilder/config.jelly deleted file mode 100644 index d41ae2e..0000000 --- a/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/IntegrationBuilder/config.jelly +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/DeployToK8sConfig/config.jelly b/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/DeployToK8sConfig/config.jelly deleted file mode 100644 index 768d761..0000000 --- a/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/DeployToK8sConfig/config.jelly +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/DockerConfig/config.jelly b/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/DockerConfig/config.jelly deleted file mode 100644 index a956479..0000000 --- a/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/DockerConfig/config.jelly +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/MavenConfig/config.jelly b/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/MavenConfig/config.jelly deleted file mode 100644 index fe4f143..0000000 --- a/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/MavenConfig/config.jelly +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/DeployTemplateComponent/config.jelly b/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/DeployTemplateComponent/config.jelly deleted file mode 100644 index 8572ee5..0000000 --- a/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/DeployTemplateComponent/config.jelly +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/PointDeployFileComponent/config.jelly b/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/PointDeployFileComponent/config.jelly deleted file mode 100644 index 087d414..0000000 --- a/integration/integration-jenkins-plugin/src/main/resources/com/schbrain/ci/jenkins/plugins/integration/builder/config/deploy/PointDeployFileComponent/config.jelly +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/integration/integration-jenkins-plugin/src/main/resources/index.jelly b/integration/integration-jenkins-plugin/src/main/resources/index.jelly deleted file mode 100644 index ce68056..0000000 --- a/integration/integration-jenkins-plugin/src/main/resources/index.jelly +++ /dev/null @@ -1,7 +0,0 @@ - - -
- This plugin provider integration with Kubernetes. -
\ No newline at end of file diff --git a/integration/pom.xml b/integration/pom.xml index 7cc1b42..8abb4dd 100644 --- a/integration/pom.xml +++ b/integration/pom.xml @@ -16,7 +16,6 @@ integration-maven-plugin - integration-jenkins-plugin \ No newline at end of file -- GitLab