commit 3fdff26d0f5c583c5a4d1c3eb2b4ba23c7e1d270 Author: jiayuqi7813 <1783671926@qq.com> Date: Mon Nov 7 23:17:42 2022 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e05c640 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +HELP.md +target/ +.mvn/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + + +mvnw +mvnw.cmd + + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..742cc5d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,16 @@ +#这个也得有 +FROM openjdk:8-jre-alpine +LABEL maintainer="534096094@qq.com" +#复制打好的jar包 +COPY target/*.jar /app.jar +RUN apk add -U tzdata; \ +ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime; \ +echo 'Asia/Shanghai' >/etc/timezone; \ +touch /app.jar; + +ENV JAVA_OPTS="" +ENV PARAMS="" + +EXPOSE 8080 + +ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar /app.jar $PARAMS" ] \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..22d118f --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,279 @@ +//写流水线的脚本(声明式、脚本式) +pipeline{ + //全部的CICD流程都需要在这里定义 + + //任何一个代理可用就可以执行 + // agent none //以后所有stage都必须指定自己的 + agent any + + + + + //定义一些环境信息 + environment { + hello = "123456" + world = "456789" + WS = "${WORKSPACE}" + IMAGE_VERSION = "v1.0" + +//引用Jenkins配置的全局秘钥信息 + ALIYUN_SECRTE=credentials("aliyun-docker-repo") + } + + //定义流水线的加工流程 + stages { + //流水线的所有阶段 + stage('环境检查'){ + steps { + sh 'printenv' + echo "正在检测基本信息" + sh 'java -version' + sh 'git --version' + sh 'docker version' + sh 'pwd && ls -alh' + sh "echo $hello" + //未来,凡是需要取变量值的时候,都用双引号 + sh 'echo ${world}' + sh "ssh --help" + } + } + //1、编译 "abc" + stage('maven编译'){ + //jenkins不配置任何环境的情况下, 仅适用docker 兼容所有场景 + agent { + docker { + image 'maven:3-alpine' + args '-v /var/jenkins_home/appconfig/maven/.m2:/root/.m2' +// args '-v /a/settings.xml:/app/settings.xml' + //docker run -v /a/settings.xml:/app/settings.xml + } + } + steps { + //git下载来的代码目录下 + sh 'pwd && ls -alh' + sh 'mvn -v' + //打包,jar.。默认是从maven中央仓库下载。 jenkins目录+容器目录;-s指定容器内位置 + //只要jenkins迁移,不会对我们产生任何影响 + sh "echo 默认的工作目录:${WS}" +// sh 'cd ${WS}' + //workdir + //每一行指令都是基于当前环境信息。和上下指令无关 + sh 'cd ${WS} && mvn clean package -s "/var/jenkins_home/appconfig/maven/settings.xml" -Dmaven.test.skip=true ' + //jar包推送给maven repo ,nexus + //如何让他适用阿里云镜像源 + + } + } + + //2、测试,每一个 stage的开始,都会重置到默认的WORKSPACE位置 + stage('测试'){ + steps { + sh 'pwd && ls -alh' + echo "测试..." + } + } + + //3、打包 + stage('生成镜像'){ + steps { + echo "打包..." + //检查Jenkins的docker命令是否能运行 + sh 'docker version' + sh 'pwd && ls -alh' + sh 'docker build -t java-devops-demo .' + + //镜像就可以进行保存 + + + } + } + + + + stage('推送镜像'){ + //没有起容器代理,默认就是jenkins环境 + //step里面卡点这么写 +// input message: '需要推送远程镜像吗?', ok: '需要', parameters: [text(defaultValue: 'v1.0', description: '生产环境需要部署的版本', name: 'APP_VER')] + + //step外面这么写 + input { + message "需要推送远程镜像吗?" + ok "需要" + parameters { + string(name: 'APP_VER', defaultValue: 'v1.0', description: '生产环境需要部署的版本') + choice choices: ['bj-01', 'sh-02', 'wuhan-01'], description: '部署的大区', name: 'DEPLOY_WHERE' + } + } + + + steps { + //false就直接结束 + + echo "$APP_VER" + + + //脚本方式进行判断,和具体逻辑 + // 远程触发,自动分析是哪个分支,如果是master就部署生产,dev就集成测试等 + // gulimall + // mall-order + // mall-user + // xx 100个微服务 + // 哪一个微服务代码提交了部署哪一个微服务,不用手工干预,只需要一个jenkinsfile + //Generic Webhook Trigger 远程触发jenkins,jenkins获取当前提交的分支,和所有分支 + // gitee会告诉我们这次 add了哪些,modify了哪些,delete了哪些, + // add了哪些,modify了哪些,delete了哪些, 自己判断这些修改的文件在哪个模块下 + //对这个模块进行持续集成 + + //Generic Webhook Trigger + script脚本 + 其他已讲过的内容 + 其他自己看看官网 = 搞定 + //别人提交一个issue,jenkins触发 自动把issue做成 fix分支,让程序员自己去修改 + //所有东西都是模板 + script { + //groovy + def where = "${DEPLOY_WHERE}" + + if (where == "bj-01"){ + sh "echo 我帮你部署到 bj-01 区了" + }else if(where == "sh-02"){ + sh "echo 我帮你部署到 sh-02 区了" + }else{ + sh "echo 没人要的,我帮你部署到 wuhan-01 区了" +// sh "docker push registry.cn-hangzhou.aliyuncs.com/lfy/java-devops-demo:${APP_VER}" + withCredentials([usernamePassword(credentialsId: 'aliyun-docker-repo', passwordVariable: 'ali_pwd', usernameVariable: 'ali_user')]) { + // some block + sh "docker login -u ${ali_user} -p ${ali_pwd} registry.cn-hangzhou.aliyuncs.com" +// sh "docker tag java-devops-demo registry.cn-hangzhou.aliyuncs.com/lfy/java-devops-demo:${APP_VER}" + } + + //ssh 秘钥文件配置到 jenkins 全局秘钥中 + withCredentials(ssh){ + //ansible 没有 + sh "ssh root@xxxx " + //不应该的操作。 + sh "远程操作其他机器。。。。" + + //k8s集群 + //动态切换k8s集群 + + } + } + } + +// sh "docker push registry.cn-hangzhou.aliyuncs.com/lfy/java-devops-demo:${APP_VER}" + + } + } + + //4、部署 + stage('部署'){ + steps { + echo "部署..." + sh 'docker rm -f java-devops-demo-dev' + sh 'docker run -d -p 8888:8080 --name java-devops-demo-dev java-devops-demo' + } + + //后置执行 +// post { +// failure { +// // One or more steps need to be included within each condition's block. +// echo "炸了.. ." +// } +// +// success { +// echo "成了..." +// } +// } + } + + //5、推送报告 + stage("发送报告"){ + steps { + //短信通知,购买api接口即可 +// sh 'curl -i -k -X POST 'https://gyytz.market.alicloudapi.com/sms/smsSend?mobile=mobile¶m=**code**%3A12345%2C**minute**%3A5&smsSignId=2e65b1bb3d054466b82f0c9d125465e2&templateId=908e94ccf08b4476ba6c876d13f084ad' -H 'Authorization:APPCODE dddddddd'' + //REST API 所有都行 +// sh 'curl ' + echo '准备发送报告' + emailext body: ''' + + + + ${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志 + + + + +

本邮件由系统自动发出,请勿回复!

+ +
+ 各位同事,大家好,以下为${PROJECT_NAME }项目构建信息
+ + + + + + + + +
构建结果 - ${BUILD_STATUS}

+ 构建信息 +
+ + + +

最近提交

+
    +
    + ${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="
  • %d [%a] %m
  • "} +
+ 详细提交: ${PROJECT_URL}changes
+ +
+ + ''', subject: '${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志', to: '17512080612@163.com' + } + } + + stage('部署到生产环境吗?'){ + steps { + // 手动输入版本【参数化构建】,推荐生成器 + +// input { +// message "需要部署到生产环境吗?" +// ok "是的,赶紧部署" +// // submitter "alice,bob" +// parameters { +// //手动传入的参数 +// string(name: 'APP_VERSION', defaultValue: 'v1.0', description: '请指定生产版本号') +// } +// } + sh "echo 发布版本咯......" + // 版本的保存。代码的保存。镜像的保存。存到远程仓库 + + } + } + + } + + + +//后置处理过程 + post { + failure { + echo "这个阶段 完蛋了.... $currentBuild.result" + } + success { + echo "这个阶段 成了.... $currentBuild.result" + } + } + + +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e10b4bc --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +# java-devops-demo + +#### 介绍 +{**以下是 Gitee 平台说明,您可以替换此简介** +Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 +无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} + +#### 软件架构d +软件架构说明 + + +#### 安装教程 + +1. xxxx +2. xxxx +3. xxxx + +#### 使用说明 + +1. xxxx +2. xxxx +3. xxxx + +#### 参与贡献 + +1. Fork 本仓库 +2. 新建 Feat_xxx 分支 +3. 提交代码 +4. 新建 Pull Request + + +#### 特技 + +1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md +2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) +3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 +4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 +5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) +6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..7d8f9a9 --- /dev/null +++ b/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + com.itdachang + java-devops-demo + 0.0.1-SNAPSHOT + java-devops-demo + Demo project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/src/main/java/com/itdachang/devops/JavaDevopsDemoApplication.java b/src/main/java/com/itdachang/devops/JavaDevopsDemoApplication.java new file mode 100644 index 0000000..c8ee29a --- /dev/null +++ b/src/main/java/com/itdachang/devops/JavaDevopsDemoApplication.java @@ -0,0 +1,13 @@ +package com.itdachang.devops; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class JavaDevopsDemoApplication { + + public static void main(String[] args) { + SpringApplication.run(JavaDevopsDemoApplication.class, args); + } + +} diff --git a/src/main/java/com/itdachang/devops/controller/HelloController.java b/src/main/java/com/itdachang/devops/controller/HelloController.java new file mode 100644 index 0000000..e346596 --- /dev/null +++ b/src/main/java/com/itdachang/devops/controller/HelloController.java @@ -0,0 +1,17 @@ +package com.itdachang.devops.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HelloController { + + @GetMapping("/hello") + public String hello(){ + + + return "Hello Java DevOps!!! 66666"; + } + + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..3d335e2 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,4 @@ + + +#优雅停机。 +server.shutdown=graceful diff --git a/src/test/java/com/itdachang/devops/JavaDevopsDemoApplicationTests.java b/src/test/java/com/itdachang/devops/JavaDevopsDemoApplicationTests.java new file mode 100644 index 0000000..5c89e94 --- /dev/null +++ b/src/test/java/com/itdachang/devops/JavaDevopsDemoApplicationTests.java @@ -0,0 +1,13 @@ +package com.itdachang.devops; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class JavaDevopsDemoApplicationTests { + + @Test + void contextLoads() { + } + +}