├── .gitignore ├── LICENSE ├── README.md ├── check_wenhook.sh ├── pom.xml └── src └── main ├── java └── com │ └── xjtushilei │ └── webhooks │ ├── WebhooksApplication.java │ ├── controller │ └── Exec.java │ ├── entity │ └── CommandInfo.java │ ├── repository │ └── CommandInfoRepository.java │ └── utils │ └── Cmd.java └── resources ├── application-dev.properties ├── application-prod.properties └── application.properties /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | 12 | ### IntelliJ IDEA ### 13 | .idea/ 14 | *.iws 15 | *.iml 16 | *.ipr 17 | 18 | ### NetBeans ### 19 | nbproject/private/ 20 | build/ 21 | nbbuild/ 22 | dist/ 23 | nbdist/ 24 | .nb-gradle/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Webhooks 2 | 3 | java执行预设命令,通过http调用,兼容linux和windows。 4 | 5 | 我通过该项目进行博客,和别人另一个项目的部署更新,只需要提交到git,自动触发webhooks,来post访问我的api,则网站自动更新,不失为一种高效的自动化部署方案。 6 | 7 | ## 使用方法 8 | 9 | ## 前期准备 10 | 11 | 1. 准备数据库 mysql 5.x以上,创建一个数据库 `commond` 12 | 2. 数据库配置文件位置`src/main/resources/application-prod.properties` 13 | 根据情况修改 14 | ``` 15 | spring.datasource.url=jdbc:mysql://localhost:3306/command?useUnicode=true&characterEncoding=utf-8 16 | spring.datasource.username=command 17 | spring.datasource.password=command 18 | ``` 19 | 3. application.properties 中修改端口号,默认8081 20 | 21 | ## 编译安装 22 | 23 | 1. 服务器安装mvn3.x,java1.8 ,不需要tomcat(内嵌了tomcat) 24 | 2. `mvn package`执行编译打包,运行 target 目录下的jar包注意logs是否报错 25 | 3. target目录下运行:`java -jar webhooks.jar`,如果在linux下,可以后台运行`nohup java -jar webhooks.jar &` 26 | 27 | 28 | 29 | ## 使用 30 | 31 | 1. 在之前的数据库里,看到一张表,然后打开它,创建 指令 name 和 指令command,如name:“mvn” command:“mvn -v” 32 | 2. 远程调用: 33 | - linux下 post 访问:`http://ip:port/execLinux/{name}`会自动触发该指令。 见下面例子。 34 | - windows下 post 访问:`http://ip:port/execWin/{name}`会自动触发该指令。 见下面例子。 35 | 36 | 37 | ## 举例 38 | 39 | 远程调用: 40 | ``` 41 | http://ip:port/execLinux/mvn 42 | ``` 43 | 44 | 且数据库里存了“mvn”命令对应的是“mvn -v”,则执行得到的结果是: 45 | 46 | ``` 47 | Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00) 48 | Maven home: /home/ubuntu/apache-maven-3.3.9 49 | Java version: 1.8.0_131, vendor: Oracle Corporation 50 | Java home: /home/ubuntu/jdk1.8.0_131/jre 51 | Default locale: en_US, platform encoding: ANSI_X3.4-1968 52 | OS name: "linux", version: "4.4.0-53-generic", arch: "amd64", family: "unix" 53 | ``` 54 | 55 | -------------------------------------------------------------------------------- /check_wenhook.sh: -------------------------------------------------------------------------------- 1 | PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin 2 | . /etc/profile 3 | export LANG=en_US.utf-8 4 | exist=`ps aux | grep -w 'java -jar webhooks.jar'| grep -v 'grep' | awk '{print $2}'` 5 | if [ -z "$exist" ] ; 6 | then 7 | echo 1 8 | nowtime=`date +"%Y-%m-%d %H:%M:%S"` 9 | echo $nowtime"webhooks.jar can not find" 10 | cd /home/ubuntu/project/Webhooks/target 11 | nohup java -jar webhooks.jar & 12 | fi 13 | 14 | # 在crontab中添加 */3 * * * * sh /home/ubuntu/crontab/check_wenhook.sh >> /home/ubuntu/crontab/logs/check_wenhook.log & 15 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.xjtushilei 7 | webhooks 8 | 0.0.1-SNAPSHOT 9 | jar 10 | 11 | webhooks 12 | Demo project for Spring Boot 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.5.7.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | UTF-8 24 | 1.8 25 | 26 | 27 | 28 | 29 | org.springframework.boot 30 | spring-boot-starter-data-jpa 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-starter-web 35 | 36 | 37 | 38 | mysql 39 | mysql-connector-java 40 | runtime 41 | 42 | 43 | org.springframework.boot 44 | spring-boot-starter-test 45 | test 46 | 47 | 48 | 49 | 50 | webhooks 51 | 52 | 53 | org.springframework.boot 54 | spring-boot-maven-plugin 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /src/main/java/com/xjtushilei/webhooks/WebhooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.xjtushilei.webhooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.boot.builder.SpringApplicationBuilder; 6 | import org.springframework.boot.web.support.SpringBootServletInitializer; 7 | 8 | @SpringBootApplication 9 | public class WebhooksApplication extends SpringBootServletInitializer { 10 | 11 | @Override 12 | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 13 | return application.sources(WebhooksApplication.class); 14 | } 15 | 16 | public static void main(String[] args) { 17 | SpringApplication.run(WebhooksApplication.class, args); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/xjtushilei/webhooks/controller/Exec.java: -------------------------------------------------------------------------------- 1 | package com.xjtushilei.webhooks.controller; 2 | 3 | import com.xjtushilei.webhooks.entity.CommandInfo; 4 | import com.xjtushilei.webhooks.repository.CommandInfoRepository; 5 | import com.xjtushilei.webhooks.utils.Cmd; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.web.bind.annotation.*; 8 | 9 | /** 10 | * @author shilei 11 | * @Date 2017/9/29. 12 | */ 13 | @RestController 14 | public class Exec { 15 | @Autowired 16 | private CommandInfoRepository commandInfoRepository; 17 | 18 | @RequestMapping(value = "/execLinux/{name}", method = RequestMethod.POST) 19 | public String execLinuxCommand(@PathVariable String name) { 20 | 21 | CommandInfo command = commandInfoRepository.findByName(name); 22 | String result =Cmd.execLinuxCmd(command.getCommand()); 23 | return result; 24 | } 25 | 26 | @RequestMapping(value = "/execWin/{name}", method = RequestMethod.POST) 27 | public String execWinCommand(@PathVariable String name) { 28 | 29 | CommandInfo command = commandInfoRepository.findByName(name); 30 | String result =Cmd.execWindowsCmd(command.getCommand()); 31 | return result; 32 | } 33 | 34 | @RequestMapping(value = "/test") 35 | public String test(@RequestParam(value = "hi", defaultValue = "nihao") String hi) { 36 | 37 | return "test(@RequestParam(value = \"hi\", defaultValue = \"nihao\"):"+hi; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/xjtushilei/webhooks/entity/CommandInfo.java: -------------------------------------------------------------------------------- 1 | package com.xjtushilei.webhooks.entity; 2 | 3 | import javax.persistence.Entity; 4 | import javax.persistence.GeneratedValue; 5 | import javax.persistence.Id; 6 | import java.util.Date; 7 | 8 | /** 9 | * @author shilei 10 | * @Date 2017/9/29. 11 | */ 12 | @Entity 13 | public class CommandInfo { 14 | 15 | @Id 16 | @GeneratedValue 17 | private Long id; 18 | 19 | private String name; 20 | 21 | private String command; 22 | 23 | public CommandInfo() { 24 | } 25 | 26 | public CommandInfo(String name, String command) { 27 | this.name = name; 28 | this.command = command; 29 | } 30 | 31 | public Long getId() { 32 | return id; 33 | } 34 | 35 | public void setId(Long id) { 36 | this.id = id; 37 | } 38 | 39 | public String getName() { 40 | return name; 41 | } 42 | 43 | public void setName(String name) { 44 | this.name = name; 45 | } 46 | 47 | public String getCommand() { 48 | return command; 49 | } 50 | 51 | public void setCommand(String command) { 52 | this.command = command; 53 | } 54 | } 55 | 56 | -------------------------------------------------------------------------------- /src/main/java/com/xjtushilei/webhooks/repository/CommandInfoRepository.java: -------------------------------------------------------------------------------- 1 | package com.xjtushilei.webhooks.repository; 2 | 3 | import com.xjtushilei.webhooks.entity.CommandInfo; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | 7 | public interface CommandInfoRepository extends JpaRepository { 8 | 9 | CommandInfo findByName(String name); 10 | 11 | } -------------------------------------------------------------------------------- /src/main/java/com/xjtushilei/webhooks/utils/Cmd.java: -------------------------------------------------------------------------------- 1 | package com.xjtushilei.webhooks.utils; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.InputStream; 5 | import java.io.InputStreamReader; 6 | import java.io.LineNumberReader; 7 | 8 | /** 9 | * @author shilei 10 | * @Date 2017/9/29. 11 | */ 12 | public class Cmd { 13 | 14 | public static String execWindowsCmd(String cmd) { 15 | int exitValue = -1; 16 | InputStream ins = null; 17 | String[] command = new String[] { "Cmd.exe", "/c", cmd }; // 命令 18 | try { 19 | Process process = Runtime.getRuntime().exec(command); 20 | ins = process.getInputStream(); // 获取执行cmd命令后的信息 21 | BufferedReader reader = new BufferedReader(new InputStreamReader(ins)); 22 | 23 | StringBuffer sb = new StringBuffer(); 24 | String line; 25 | while ((line = reader.readLine()) != null) { 26 | // System.out.println(line); // 输出 27 | sb.append(line).append("\n"); 28 | } 29 | // exitValue = process.waitFor(); 30 | // System.out.println("返回值:" + exitValue); 31 | ins.close(); 32 | process.getOutputStream().close(); // 不要忘记了一定要关 33 | return sb.toString(); 34 | } catch (Exception e) { 35 | e.printStackTrace(); 36 | } 37 | return null; 38 | } 39 | 40 | 41 | public static String execLinuxCmd(String cmd) { 42 | try { 43 | String[] cmdA = {"/bin/sh", "-c", cmd}; 44 | Process process = Runtime.getRuntime().exec(cmdA); 45 | LineNumberReader br = new LineNumberReader(new InputStreamReader( 46 | process.getInputStream())); 47 | StringBuffer sb = new StringBuffer(); 48 | String line; 49 | while ((line = br.readLine()) != null) { 50 | sb.append(line).append("\n"); 51 | } 52 | br.close(); 53 | process.getOutputStream().close(); // 不要忘记了一定要关 54 | return sb.toString(); 55 | } catch (Exception e) { 56 | e.printStackTrace(); 57 | } 58 | return null; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/resources/application-dev.properties: -------------------------------------------------------------------------------- 1 | ###################################################################################### 2 | # 如果你的mysql设置了更小的,会已mysql为主 3 | spring.http.multipart.maxFileSize=100MB 4 | spring.http.multipart.maxRequestSize=1000MB 5 | ###################################################################################### 6 | # Specify the DBMS 7 | spring.jpa.database=MYSQL 8 | # Show or not log for each sql query 9 | #spring.jpa.show-sql=true 10 | spring.jpa.hibernate.ddl-auto=update 11 | spring.datasource.url=jdbc:mysql://localhost:3306/command?useUnicode=true&characterEncoding=utf-8 12 | spring.datasource.username=root 13 | spring.datasource.password=root 14 | spring.datasource.driver-class-name=com.mysql.jdbc.Driver 15 | ################################################################ 16 | # 开发的时候请将此项设置为false 17 | spring.thymeleaf.cache=false 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/main/resources/application-prod.properties: -------------------------------------------------------------------------------- 1 | ###################################################################################### 2 | # 如果你的mysql设置了更小的,会已mysql为主 3 | spring.http.multipart.maxFileSize=100MB 4 | spring.http.multipart.maxRequestSize=1000MB 5 | ###################################################################################### 6 | # Specify the DBMS 7 | spring.jpa.database=MYSQL 8 | # Show or not log for each sql query 9 | #spring.jpa.show-sql=true 10 | spring.jpa.hibernate.ddl-auto=update 11 | spring.datasource.url=jdbc:mysql://localhost:3306/command?useUnicode=true&characterEncoding=utf-8 12 | spring.datasource.username=command 13 | spring.datasource.password=command 14 | spring.datasource.driver-class-name=com.mysql.jdbc.Driver 15 | ################################################################ 16 | # 开发的时候请将此项设置为false 17 | spring.thymeleaf.cache=true 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=8081 2 | #spring.profiles.active=dev 3 | spring.profiles.active=prod 4 | 5 | 6 | 7 | 8 | 9 | 10 | --------------------------------------------------------------------------------