-
IP切换软件
2012-09-03 15:55:10[一句话] 一键切换网络 [系统支持] Window2000/XP/2003/Vista/2008, 98也可以支持,但不予支持,BS不稳定的98 [界面语言] 简体中文(为人民服务),繁体中文(单独提供!),英文(单独提供!) [网卡] 精确检测及识别... -
Bean的自动化装配
2018-01-15 10:14:26今天我们来总结一下bean的装配问题,一个软件需要不同功能的类之间建立合作,才能是组装成一个强大的系统,spring在其中就是一个调度者的角色,总结一句话就是:我知道你需要什么,我提供给你需要的,而你只需要大脑...前言
今天我们来总结一下bean的装配问题,一个软件需要不同功能的类之间建立合作,才能是组装成一个强大的系统,spring在其中就是一个调度者的角色,总结一句话就是:我知道你需要什么,我提供给你需要的,而你只需要大脑空空就可以了,专注于你要完成的业务逻辑就好了,别的事情交给我来做。有没有被spring感动到,比如一台电脑,他包含了许多组件,cup知道他需要一个硬盘吗?不知道吧,这需要工人给他组装到一起,拿到手上的就是所有配件齐全的一台机器,而spring就是这个组装工人
装配 创建应用对象之间协作关系的行为通常称为装配(wiring),这也是DI(依赖注入)的本质
三种配置方式:
- 在XML中进行显示配置
- 在JAVA中进行显示配置
- 隐式的bean发现机制和自动装配
自动化装配bean
- 组件扫描:Spring会自动发现应用上下文中所创建的bean
- 自动装配:Spring自动满足bean之间的依赖
实例:(取自《spring实战》) 这个小例子以cd机为原型,cd机如果没有加入唱片,那么他也没有用处,所以这里的依赖关系就是cd机要依赖唱片才能播放
一、创建唱片
public interface CompactDisc { void play(); }
值得思考的编码哲学:将唱片定义为一个接口,他定义了cd机对一盘唱片所能进行的操作,他将cd机的任意实现与CD本身的耦合降低到了最小的程度
二、唱片的实现
@Component public class SgtPeppers implements CompactDisc { //beatles1967年发行的专辑 private String title="Sgt.Perpper's Lonely Hearts Club Band"; private String artist="The Beatles"; public void play() { System.out.println("Playing "+title+" by "+artist); } }
p.s. @Component、@Repository、@Service 和@Controller的区别
- @Service用于标注业务层组件
- @Controller用于标注控制层组件(如struts中的action)
- @Repository用于标注数据访问组件,即DAO组件
- @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
他们都是元注解,用于标注其他注解,在这里的作用:标注在某个类上,此类就会自动的被Spring容器注册为BeanDefinition(扫描包的时候,如果有以上四个注解,则将此类管理到spring容器中)
三、配置spring
组件扫描默认是不启动的,需要显示配置一下Spring,有两种方式进行配置,一种是使用Java代码定义Spring的装配规则,第二种是使用xml配置文件
方法一:
@Configuration @ComponentScan public class CDPlayerConfig { }
带有@Configuration注解,说明这个类是一个配置类,而@ComponentScan默认会扫描会配置类相同的包
测试方法:
//在测试开始的时候自动创建Spring的应用上下文 @RunWith(SpringJUnit4ClassRunner.class) //会告诉他需要在CDPlayerConfig中加载配置。因为CDPlayerConfig包含了@ComponentScan,最终的应用上下文中应该包含CompactDisc bean @ContextConfiguration(classes=CDPlayerConfig.class) public class CDPlayerTest { @Autowired private CompactDisc cd; @Test public void cdShouldNotBeNull(){ assertNotNull(cd); } }
方法二:
在xml文件中配置包扫描器<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <!-- 配置包扫描器 --> <context:component-scan base-package="soundsystem"/> </beans>
测试方法:
第二种测试方法:(配置文件) public class CDPlayerTest { @Autowired private CompactDisc cd; @Test public void cdShouldNotBeNull(){ ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml"); context.start(); cd=(CompactDisc) context.getBean("lonelyHeartsClub"); assertNotNull(cd); } }
总结
今天简单的了解了一些spring的装配的最基本的应用,这只是最简单的一个实例,业务复杂的时候就会出现各种各样的其他场景,spring的强大才会慢慢体现出来 -
芭奇站群管理软件 v2019.05.25.zip
2019-07-11 04:56:22芭奇站群管理软件集自动采集,自动发布,各种伪原创,站长APP接口等等SEO功能为一体,软件功能强大,支持关键词采集 文章采集,图片和视频采集,也支持自定义采集规则指定域名采集,也提供有超强的原创文章... -
发布一个长尾词生成的小软件工具
2014-08-31 15:59:20我们经常会通过不同的词进行组合来生成长尾词,比如“海尔和春兰的洗衣机哪个好?”这个句话实际上是:...这个小软件就是可以把各种词元素组自动组合成各种长尾词。 介绍一下如何操作:先把不同类别的词元素放在不我们经常会通过不同的词进行组合来生成长尾词,比如“海尔和春兰的洗衣机哪个好?”这个句话实际上是:“品牌词”和“品牌词”“判断词”。那么我们可以用一些列的词作为品牌词,比如“海尔、春兰、博世、科龙、格力...",判断词可以用”哪个好、相比怎么样、哪个便宜...“等等,这样就可以组合出大量长尾词。这个小软件就是可以把各种词元素组自动组合成各种长尾词。
介绍一下如何操作:先把不同类别的词元素放在不同的文本文件里,一个词一行。有多少个类别就有多少个文件,比如说品牌词1放在”ppc1.txt"里,品牌词2放在"ppc2.txt"里,判断此放在文件"pdc.txt“里。
然后按照你想组合的顺序,通过点击“1、加入词元素文件”,依次加入这些文件。
然后点击“生成长尾词”,让软件自动生成,生成完毕后,就可以在右边的文本框里看到已经组合好的长尾词了。
如果想把这些词保存到文件或者别的地方,可以点击“拷贝到剪贴板”,这样就可以拷贝出来。如果还需要生成别的词,点击“清除词元素文件”,又可以重新开始。
这里可以下载,完全免费哦!
链接: http://pan.baidu.com/s/11u6hK 密码: e6e4
-
Maslow-CNC-Jumpstart-Bundle:占位符一句话描述-源码
2021-02-23 10:37:02库存中包含免费项目,软件和支持。 当天发货。 访问进行订购 产品概要: 如果您正在寻找购买和生产之间的最短距离,这就是Maslow套件。 根据与Maslow CNC的协议,该套件由MakerMade CNC制造。 您的订单将随附所有... -
聊一聊前端自动化测试
2021-01-10 04:41:54内部还可以分子组)。另外还有一个非常重要的特性,就是每个分组都可以进行预处理(<code>before、<code>beforeEach</code>)和后处理(<code>after, <code>afterEach</code>)... -
支持MP3、wav等多种格式复读的软件
2009-05-03 09:39:157,智能分句,自动复读:电脑程序自动智能分析,判断句读分界,自动逐句复读,强化训练,可任意指定每句复读次数和复读间隔时间,远非普通复读机可以办到。 8,多级变速,快慢自如:极大方便不同需要的使用者对播放... -
模拟精灵 v9.01 免费绿色版.rar
2019-07-09 22:25:01一句代码下载网页,一句代码自动发贴,一句代码批量处理文件,一句代码完成工作。小到桌面自动化,大到价值数千的大型群发软件。大量的成功案例无不体现出模拟精灵卓越的创造能力。 第一天玩玩模拟精灵 ----- ... -
芭奇站群管理系统 v16.09.25.zip
2019-07-15 06:53:21软件采集到最新相关内容,并自动SEO发布到指定网站的多任务站群管理系统,可24小时不间断的全自动维护数百个网站。其核心价值在于全自动按SEO优化规则建站,无需任何技术门槛,为客户创造网站价值。系统能根据设置的... -
gitea+drone+kubernetes搭建devops平台
2020-01-07 18:12:12**DevOps** 一词的来自于 Development 和 Operations 的组合,突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、发布更加快捷、频繁和可靠。DevOps 其实包含了三个部分:开发、测试...gitea+drone+kubernetes搭建devops平台
DevOps基本介绍
DevOps 一词的来自于 Development 和 Operations 的组合,突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、发布更加快捷、频繁和可靠。DevOps 其实包含了三个部分:开发、测试和运维。换句话 DevOps 希望做到的是软件产品交付过程中IT工具链的打通,使得各个团队减少时间损耗,更加高效地协同工作。
关于devops的基础概念可以参考关于DevOps落地方案的个人观点了解,一般来说一次版本发布包含如下Checklist:
- 代码的下载构建及编译
- 运行单元测试,生成单元测试报告及覆盖率报告等
- 在测试环境对当前版本进行测试
- 为待发布的代码打上版本号
- 编写 ChangeLog 说明当前版本所涉及的修改
- 构建 Docker 镜像
- 将 Docker 镜像推送到镜像仓库
- 在预发布环境测试当前版本
- 正式发布到生产环境
单人开发模式
- clone 项目到本地, 修改项目代码, 如将 Hello World 改为 Hello World V2。
- git add .,然后书写符合约定的 commit 并提交代码, git commit -m "feature: hello world v2”
- 推送代码到代码库git push,等待数分钟后,开发人员会看到单元测试结果,gitea 仓库会产生一次新版本的 release,release 内容为当前版本的 changeLog, 同时线上已经完成了新功能的发布。
虽然在开发者看来,一次发布简单到只需 3 个指令,但背后经过了如下的若干次交互,这是一次发布实际产生交互的时序图,具体每个环节如何工作将在后面中详细说明。
多人开发模式:
- Clone 项目到本地,创建一个分支来完成新功能的开发, git checkout -b feature/hello-world-v3。在这个分支修改一些代码,比如将Hello World V2修改为Hello World V3
- git add .,书写符合规范的 Commit 并提交代码, git commit -m "feature: hello world v3”
- 将代码推送到代码库的对应分支, git push origin feature/hello-world
- 如果功能已经开发完毕,可以向 Master 分支发起一个 Pull Request,并让项目的负责人 Code Review
- Review 通过后,项目负责人将分支合并入主干,Github 仓库会产生一次新版本的 release,同时线上已经完成了新功能的发布。
这个流程相比单人开发来多了 2 个环节,很适用于小团队合作,不仅强制加入了 Code Review 把控代码质量,同时也避免新人的不规范行为对发布带来影响。实际项目中,可以在 Gitea 的设置界面对 master 分支设置写入保护,这样就从根本上杜绝了误操作的可能。当然如果团队中都是熟手,就无需如此谨慎,每个人都可以负责 PR 的合并,从而进一步提升效率。
GitFlow 开发模式:
在更大的项目中,参与的角色更多,一般会有开发、测试、运维几种角色的划分;还会划分出开发环境、测试环境、预发布环境、生产环境等用于代码的验证和测试;同时还会有多个功能会在同一时间并行开发。可想而知 CI 的流程也会进一步复杂。
能比较好应对这种复杂性的,首选 GitFlow 工作流, 即通过并行两个长期分支的方式规范代码的提交。而如果使用了 Gitea,由于有非常好用的 Pull Request 功能,可以将 GitFlow 进行一定程度的简化,最终有这样的工作流:
这个模式主要遵循以下约定
- 以 dev 为主开发分支,master 为发布分支
- 开发人员始终从 dev 创建自己的分支,如 feature-a
- feature-a 开发完毕后创建 PR 到 dev 分支,并进行 code review
- review 后 feature-a 的新功能被合并入 dev,如有多个并行功能亦然
- 待当前开发周期内所有功能都合并入 dev 后,从 dev 创建 PR 到 master
- dev 合并入 master,并创建一个新的 release
上述是从 Git 分支角度看代码仓库发生的变化,实际在开发人员视角里,工作流程是怎样的呢。假设我是项目的一名开发人员,今天开始一期新功能的开发:
- Clone 项目到本地,git checkout dev。从 dev 创建一个分支来完成新功能的开发, git checkout -b feature/feature-a。在这个分支修改一些代码,比如将Hello World V3修改为Hello World Feature A
- git add .,书写符合规范的 Commit 并提交代码, git commit -m “feature: hello world feature A”
- 将代码推送到代码库的对应分支, git push origin feature/feature-a:feature/feature-a
- 由于分支是以feature/命名的,因此 CI 会运行单元测试,并自动构建一个当前分支的镜像,发布到测试环境,并自动配置一个当前分支的域名如 test-featue-a.avnpc.com
- 联系产品及测试同学在测试环境验证并完善新功能
- 功能通过验收后发起 PR 到 dev 分支,由 Leader 进行 code review
- Code Review 通过后,Leader 合并当前 PR,此时 CI 会运行单元测试,构建镜像,并发布到测试环境
- 此时 dev 分支有可能已经积累了若干个功能,可以访问测试环境对应 dev 分支的域名,如 test.avnpc.com,进行集成测试。
- 集成测试完成后,由运维同学从 Dev 发起一个 PR 到 Master 分支,此时会 CI 会运行单元测试,构建镜像,并发布到预发布环境
- 测试人员在预发布环境下再次验证功能,团队做上线前的其他准备工作
- 运维同学合并 PR,CI 将为本次发布的代码及镜像自动打上版本号并书写 ChangeLog,同时发布到生产环境。
由此就完成了上文中 Checklist 所需的所有工作。虽然描述起来看似冗长,但不难发现实际作为开发人员,并没有任何复杂的操作,流程化的部分全部由 CI 完成,开发人员只需要关注自己的核心任务:按照工作流规范,写好代码,写好 Commit,提交代码即可。
总结
- 如果搭建了Gerrit服务,可以使用Gerrit作为ReviewCode的中间代码仓库
- golang静态分析工具有sonarqube和golangci-lint等,运行静态分析可以保证代码没有明显的错误。
使用docker-compose实现CI
具体的代码库可以访问drone_gitea_devops仓库查看,这部分只实现了持续集成,并未实现持续发布和持续部署。
代码管理
git基本使用
详情访问赵布的学习笔记-Git的使用查看
gitea部署代码仓库
采用如下docker-compose部署:
version: "3.7" networks: dronenet: name: dronenet services: # 使用nginx做反向代理 # nginx: # image: nginx:alpine # container_name: drone_nginx # ports: # - "8080:80" # restart: always # networks: # - dronenet # volumes: # - ./nginx/conf:/etc/nginx/conf.d:rw # - ./nginx/nginx.conf:/etc/nginx/nginx.conf # - ./nginx/hosts:/etc/hosts:rw # gitea 服务 gitea_server: image: gitea/gitea:latest ports: - 3000:3000 # 必须映射22端口,不然只能使用http cloen仓库 - "3022:22" volumes: - ./gitea_server/data:/data - ./gitea_server/conf/app.ini:/data/gitea/conf/app.ini restart: always container_name: gitea_server environment: - USER_UID=1000 - USER_GID=1000 - HTTP_PORT=3000 - DB_TYPE=postgres - DB_HOST=gitea_postgres:5432 - DB_USER=${POSTGRES_USER} - DB_NAME=${POSTGRES_DB} - DB_PASSWD={POSTGRES_PASSWORD} - APP_NAME="DROG (gitea + drone) test" # this exposes to end users - ROOT_URL=http://${HOST}:3000 networks: dronenet: # gitea 可以用postgres也可以用mysql gitea_postgres: image: postgres:alpine # ports: # - 5432:5432 restart: always container_name: gitea_postgres volumes: - ./gitea_postgres/data:/var/lib/postgresql/data environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} networks: dronenet:
gitea部署需要注意点:
- gitea可以使用postgress也可使用mysql,但是mysql在映射volume时如果想映射到当前目录,会出现读写问题,具体的问题,可以试一下就会明白
- ports端口映射时需要映射两个端口,一个是默认的3000,可以使用http/https协议进行git clone,还有需要映射内部的22端口,才能使用git协议
创建drone使用的token
访问http://192.168.0.90:3000/登录gitea,点击个人信息,应用,然后新建一个oAuth2应用程序,名称随便填,重定向url填http://192.168.0.90:8080/login
然后记录下客户端id,客户端密匙
修改.env文件中的
DRONE_GITEA_CLIENT_ID=dd94066a-df64-4d0c-b49c-e4c2d50bb025
DRONE_GITEA_CLIENT_SECRET=ZmYdYjtaLYLF8fiGYMCBistpQeHuxtyDdQgo3A5dnlY=然后启动drone容器
Harbor镜像仓库
在drone的pipline中build完镜像后需要提交镜像到images仓库。在持续发布和持续部署阶段需要用到
按照docker-compose-manager仓库里面的harbor目录里的docker-compose启动Harbor镜像仓库,访问http://192.168.0.90:8180/登录harbor,并且记录用户名和密码
使用Drone实现CI
启动Drone容器
version: "3.7" networks: dronenet: name: dronenet # volumes: # portainerdata: # name: portainerdata services: # 使用nginx做反向代理 # nginx: # image: nginx:alpine # container_name: drone_nginx # ports: # - "8080:80" # restart: always # networks: # - dronenet # volumes: # - ./nginx/conf:/etc/nginx/conf.d:rw # - ./nginx/nginx.conf:/etc/nginx/nginx.conf # - ./nginx/hosts:/etc/hosts:rw # gitea 服务 gitea_server: image: gitea/gitea:latest ports: - 3000:3000 # 必须映射22端口,不然只能使用http cloen仓库 - "3022:22" volumes: - ./gitea_server/data:/data - ./gitea_server/conf/app.ini:/data/gitea/conf/app.ini restart: always container_name: gitea_server environment: - USER_UID=1000 - USER_GID=1000 - HTTP_PORT=3000 - DB_TYPE=postgres - DB_HOST=gitea_postgres:5432 - DB_USER=${POSTGRES_USER} - DB_NAME=${POSTGRES_DB} - DB_PASSWD={POSTGRES_PASSWORD} - APP_NAME="DROG (gitea + drone) test" # this exposes to end users - ROOT_URL=http://${HOST}:3000 networks: dronenet: # gitea 可以用postgres也可以用mysql gitea_postgres: image: postgres:alpine # ports: # - 5432:5432 restart: always container_name: gitea_postgres volumes: - ./gitea_postgres/data:/var/lib/postgresql/data environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} networks: dronenet: # drone使用mysql drone_mysql: image: mysql restart: always container_name: drone_mysql # ports: # - 3306:3306 environment: - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD} networks: dronenet: volumes: - ./drone_mysql/conf/my.cnf:/etc/mysql/my.cnf:rw - ./drone_mysql/data:/var/lib/mysql/:rw - ./drone_mysql/logs:/var/log/mysql/:rw # drone 服务端 drone_server: image: drone/drone container_name: drone_server ports: - 8080:80 # drone comtainer serves via port 80, we expose to end users via port 8381 # - 8443:443 volumes: - /var/run/docker.sock:/var/run/docker.sock - ./drone_server/data:/data:rw - ./drone_server/drone:/var/lib/drone:rw restart: always environment: # db Config - DRONE_DATABASE_DATASOURCE=${MYSQL_DATABASE}:${MYSQL_PASSWORD}@tcp(drone_mysql:3306)/drone?parseTime=true #mysql配置,要与上边mysql容器中的配置一致 - DRONE_DATABASE_DRIVER=mysql - DRONE_TLS_AUTOCERT=false # gitea Config # - DRONE_AGENTS_ENABLED=true - DRONE_GITEA_SERVER=http://${HOST}:3000 # this is internal communication with gitea server on the same network - DRONE_GITEA_CLIENT_ID=${DRONE_GITEA_CLIENT_ID} - DRONE_GITEA_CLIENT_SECRET=${DRONE_GITEA_CLIENT_SECRET} - DRONE_RPC_SECRET=${DRONE_RPC_SECRET} #RPC秘钥 - DRONE_SERVER_HOST=${HOST}:8080 - DRONE_SERVER_PROTO=http - DRONE_RUNNER_CAPACITY=2 - DRONE_USER_CREATE=username:zhaobu,admin:true #管理员账号,是你想要作为管理员的Gitea用户名 # droneclient Config # dronelog - DRONE_LOGS_PRETTY=true - DRONE_LOGS_COLOR=true - DRONE_LOGS_TEXT=true - DRONE_LOGS_DEBUG=true - DRONE_LOGS_TRACE=true depends_on: - gitea_server networks: dronenet: drone_agent: image: drone/agent:latest container_name: drone_agent restart: always depends_on: - drone_server volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - DRONE_RPC_PROTO=http - DRONE_RPC_HOST=drone_server - DRONE_RPC_SECRET=${DRONE_RPC_SECRET} #RPC秘钥,要与drone_server中的一致 - DRONE_RUNNER_CAPACITY=3 - DRONE_LOGS_TRACE=true - DRONE_LOGS_DEBUG=true - DRONE_UI_USERNAME=root - DRONE_UI_PASSWORD=root networks: dronenet:
测试持续集成
使用drone_gitea_devops中的dronetest目录在gitea新建一个仓库dronetest,然后访问http://192.168.0.90:8080/登录drone,并且激活该仓库.
- 进入setting,添加访问Harbor的Secrets:
docker_username: admin
docker_password: Harbor12345- 修改/etc/docker/daemon.json文件内容,新增
"insecure-registries": ["192.168.0.90:8180"]
在dronetest仓库根目录有.drone.yml文件
kind: pipeline type: docker name: default # Create a named volume to share this directory with all pipeline steps volumes: - name: cache temp: {} steps: # 代码分析 - name: 静态检测 image: aosapps/drone-sonar-plugin settings: sonar_host: http://192.168.0.90:9001 sonar_token: 204403c2cd049c9d0a0439a5eff536027b4e89c8 # sonar_host: # from_secret: sonar_host # sonar_token: # from_secret: sonar_token - name: 测试 image: golang:alpine environment: CGO_ENABLED: 0 GOPROXY: https://goproxy.io,direct commands: - go test registry: https://d8c5y6di.mirror.aliyuncs.com/ volumes: - name: cache path: /go - name: 编译 image: golang:alpine environment: CGO_ENABLED: 0 GOPROXY: https://goproxy.io,direct commands: - go build registry: https://d8c5y6di.mirror.aliyuncs.com/ volumes: - name: cache path: /go - name: 镜像发布 image: plugins/docker environment: CGO_ENABLED: 0 GOPROXY: https://goproxy.io,direct settings: use_cache: true repo: 192.168.0.90:8180/dronetest/testgo dockerfile: ./Dockerfile # context: # tags: latest auto_tag: true # auto_tag_suffix: linux-amd64 username: from_secret: docker_username password: from_secret: docker_password registry: http://192.168.0.90:8180 # 如果使用自建的镜像仓库,例如 Harbor,这里可以通过 registry 指定 # 启用不安全通讯,才能使用http insecure: true mirror: https://d8c5y6di.mirror.aliyuncs.com # 自动部署容器到服务器 - name: 部署 image: appleboy/drone-ssh # 用于连接服务器 settings: host: 192.168.0.90 username: root password: 12345 port: 22 # command_timeout: 1000 # ssh命令行执行超时时间,300秒 script: - docker pull 192.168.0.90:8180/dronetest/testgo:latest - docker rm -f docker-demo || true # 这里这样是因为如果不存在docker-demo,rm会报错 - docker run -d -p 8056:8080 --name docker-demo 192.168.0.90:8180/dronetest/testgo:latest
按照这个配置,每次推送到master分支,都会触发drone持续集成阶段。最终效果如下:
golang静态代码检测
使用sonarqube作为代码静态质量检测工具
使用如下docker-compose启动sonarqube服务:version: "3.7" networks: sonarqubenet: external: false name: sonarqubenet # volumes: # sonarqubedata: # name: sonarqubedata services: sonarqube: image: sonarqube:8.1-community-beta container_name: sonarqube restart: always volumes: - ./sonarqube/conf:/opt/sonarqube/conf - ./sonarqube/data:/opt/sonarqube/data - ./sonarqube/logs:/opt/sonarqube/logs - ./sonarqube/extensions:/opt/sonarqube/extensions ports: - 9001:9000 env_file: .env environment: # - sonar.jdbc.url=jdbc:postgresql://sonarqube_postgres/${POSTGRES_DB} # - sonar.jdbc.username=${POSTGRES_USER} # - sonar.jdbc.password=${POSTGRES_PASSWORD} - sonar.jdbc.username=sonar - sonar.jdbc.password=sonar - sonar.jdbc.url=jdbc:postgresql://sonarqube_postgres/sonar # command: ["--init"] networks: - sonarqubenet depends_on: - sonarqube_postgres # gitea 可以用postgres也可以用mysql sonarqube_postgres: image: postgres:alpine ports: - 5432:5432 restart: always container_name: sonarqube_postgres volumes: - ./postgres/data:/var/lib/postgresql/data env_file: .env # environment: # - POSTGRES_USER=${POSTGRES_USER} # - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} # - POSTGRES_DB=${POSTGRES_DB} networks: sonarqubenet:
的源码在
docker-compose-manager
访问:http://192.168.0.90:9001然后输入账号admin,密码admin登录,push代码后,可以看到结果
还可以学习一下sonarqub的使用方法,修改检测的规则参考了:
持续发布
使用drone-ssh插件发布
在.drone.yml文件中使用到了drone-ssh插件,在持续集成最后,会在192.168.0.90服务器上启动测试的容器服务,
可以访问http://192.168.0.90:8056/health,返回结果说明部署成功
使用k8s部署
k8s的学习可以参考文档
如果觉得有用,可随意赞赏
-
护卫神·云查杀系统 v4.5.zip
2019-07-14 04:51:07第一次打开该软件时,会自动下载最新的病毒库。 建议每次查杀前都下载最新的病毒库,以达到最优查杀效果。 护卫神·云查杀系统 v4.5 更新日志 1、再次优化内核算法,比3.X版本查杀效率提高50%以上,节省您的时间... -
DevOps实践指南学习笔记
2021-01-24 17:21:55DevOps 一词的来自于 Development 和 Operations 的组合,突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、发布更加快捷、频繁和可靠。DevOps 其实包含了三个部分:开发、测试和...- DevOps 一词的来自于 Development 和 Operations 的组合,突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、发布更加快捷、频繁和可靠。DevOps 其实包含了三个部分:开发、测试和运维。换句话 DevOps 希望做到的是软件产品交付过程中IT工具链的打通,使得各个团队减少时间损耗,更加高效地协同工作;
- DevOps基于持续构建、测试和集成的开发原则;
- DevOps看作开发(软件工程)、技术运营和质量保障(QA)三者的交集;
- DevOps 的转型过程中,如果希望前置时间从月或季度缩短为几分钟,那么一般需要依次
优化下面的约束点:环境搭建;代码部署;测试和准备的执行;紧密耦合的架构。 - 为部署流水线奠定基础 ; 实现快速可靠的自动化测试 ;实现并实践持续集成和持续测试 ;通过自动化、架构解耦等方式实现低风险发布。
- DevOps 不是简单的开发软件化,而是企业的学习能力不断提升的结果,将企业改造成敏捷应对的学习型组织,运用新的工具,优化组织架构和流程,不断地进行自我革命和创新的方式。工具是辅助,而非基础。
- Google 提出的 5 个 DevOps 原则,这套原则中必须依赖于工具辅助的部分只有后两点,更多的则是对于开发组织形式的内省:精简组织架构;愿意承担一部分试错带来的损失;分阶段地一小步一小步地进行转型;最大化地利用工具和自动化流程;对所有的过程和结果进行记录和分析。
- DevOps工具博客一
- DevOps工具博客二
git;gitlab,github;docker;kubernetes; linux平台;shell;监控服务分析平台zabbix和
-
护卫神·云查杀 v4.5
2019-11-12 05:51:40每次打开该软件时,系统会自动下载最新的病毒库,以达到最好查杀效果。护卫神·云查杀v4.5更新:1、再次优化内核算法,比3.X版本查杀效率提高50%以上,节省您的时间;2、进一步增加对组合木马的查杀,如在图片文件中... -
使用sublime text3搭建Python编辑环境
2020-11-04 18:01:06我所在的测试组有一套PC软件前端自动化工程,在进行自动化测试时,需要在一台古老的xp机器上运行,但这台古老的xp机器带给我诸多烦恼,特别是使用Pycharm编辑器时,我遇到了以下三个问题: 电脑关机后无法重新运行... -
ubuntu安装配置FTP
2016-11-03 20:10:14Ubuntu 12.04下安装FTP软件当然选择大名鼎鼎的vsftpd(very secure FTP daemon), Ubuntu装vsftpd很简单,一句命令就行: sudo apt-get install vsftpd 命令执行过程中,安装程序会给本地创建一个名为“ftp”的... -
Ubuntu下搭建FTP服务器
2014-07-20 21:01:59Ubuntu 12.04下安装FTP软件当然选择大名鼎鼎的vsftpd(very secure FTP daemon), Ubuntu装vsftpd很简单,一句命令就行: sudo apt-get install vsftpd 命令执行过程中,安装程序会给本地创建一个名为“ftp”... -
ubuntu12.04安装vsftp
2014-08-12 12:03:00Ubuntu 12.04下安装FTP软件当然选择大名鼎鼎的vsftpd(very secure FTP daemon), Ubuntu装vsftpd很简单,一句命令就行: sudo apt-get install vsftpd 命令执行过程中,安装程序会给本地创建一个名为“ftp”... -
Ubuntu14.04搭建ftp
2014-07-30 22:01:59我装的服务器系统是Ubuntu 14..04 LTS,FTP软件当然是选择大名鼎鼎的vsftpd(very secure FTP daemon), ...命令执行过程中,安装程序会给本地创建一个名为“ftp”的用户组,命令执行完之后会自动启动FTP服务。 -
Time machine字幕编辑器
2017-11-02 18:55:34字幕制作软件是一款由人人影视字幕组开发的字幕制作软件,人人影视字幕组为了方便字幕组制作字幕以及字幕调整组调整字幕,倾力打造功能丰富的的字幕制作工具《时间机器Time machine》 1.支持SRT,ASS,格式字幕,... -
详解在Ubuntu下搭建FTP服务器
2021-01-10 23:09:33我装的服务器系统是Ubuntu 12.04 LTS,FTP软件当然是选择大名鼎鼎的vsftpd(very secure FTP daemon), 用系统自带的FTP还好Ubuntu装vsftpd还是很简单,一句命令就行: sudo apt-get install vsftpd 命令执行过程... -
coding coding coding 感悟
2011-01-20 22:15:00前些年写软件,感觉是在搭积木 ,一个软件用控件或者对象组合起来 ,写点业务逻辑,偶尔写两个算法(递归、树),就完成了。自测,提交给客户。反馈,修改,基本轻轻松松。 现在写代码感觉非常耗神,先不说功能强大... -
韵脚大全 v6.6.rar
2019-07-11 07:27:2506、软件关闭时自动修改首页面供下次启动时调用 2011.09.17 【v5.7】 01、修正Win7系统下输入法读取错误问题 02、韵脚查询区域、草稿区域字体稍加增大 03、双击“成语区域”弹出“成语联想”页面,... -
PowerWord.exe
2020-04-01 09:23:25整句翻译是许多手机翻译软件必有的功能之一,金山词霸的整句翻译可以正确互译一些简单的中英文句子或短语,不过倘若句式过于复杂,那么就像大多数的手机翻译软件一样,它很可能会给你一份半成品释义。 英语学习 在... -
万能拼音 v1.9
2019-11-01 08:50:20可以帮您学习五笔和英语的实用必备软件,词库有基础、网络、动态、新鲜四种组合,满足不同人士的需要。它具备以下4大特色:1、热门词组一个也不能少: 利用先进搜索分析技术,自动分析网罗互联网上出现的热门词组,... -
visual graph专业图形系统
2008-11-05 15:29:18这是一套非常完善的图形系统,适合在电力、煤炭、化工、仿真、网络、自动化等各种工业监控软件以及图形建模、图形管理、图形分析、中小型GIS系统、工作流、中文表格、表单、工程绘图等软件项目中应用。 基本特点 : ...
-
常用JVM启动参数
-
docker基本使用教程, 以及docker部署flask框架示例
-
2013年上半年 信息系统管理工程师 上午试卷 综合知识 软考真题【含答案和答案解析】
-
物联网之mqtt实现(emqx+springboot+mqtt附源码)
-
一天学完MySQL数据库
-
UL 153:2020 Portable Electric Luminaires(便携灯具)- 最新完整英文版(204页)
-
Galera 高可用 MySQL 集群(PXC v5.7+Hapro)
-
C++MFC开发远程控制软件教程(VS2013)
-
响应式编程入门与实战(Reactor、WebFlux、R2DBC)
-
Jenkins软件开发持续集成及自动构建
-
物联网基础篇:快速玩转MQTT
-
什么是SYSML:registered:?
-
构建低成本高密度Wi-Fi网络实验床
-
CentOS 7 下修改主机名
-
量子差分密码分析
-
全光子晶体光纤单级直接放大产生34 W高功率飞秒脉冲
-
FyreString:FyreString是PHP的免费开源字符串实用程序库-源码
-
【学习札记NO.00004】Linux Kernel Pwn学习笔记 I:一切开始之前
-
简单增删查改新闻管理系统
-
JMETER 性能测试基础课程