利用ansible来做tomcat应用的持续交付
https://www.jianshu.com/p/fca8f91ae223
在做持续交付这件事,想必大家都是用jenkins这款程序来做基石。当然,我们这次也是用jenkins作为承载工具,jenkins强大的插件是有目共睹的,有些ansible做起来不容易的事情交给jenkins反而简单有效。下面我会详细说明怎么持续交付tomcat应用。
希望本实验可以引导大家在持续交付的过程中使用ansible工具,也希望本实验能帮助到有需要的人,更希望给到大家一个简单的持续交付思想和启发。如想继续交流的,还请加入QQ群:425931784。
应用架构
本次使用的应用架构是常见的负载均衡实例。

软件版本
os: centos 6.7 X64
ansible: 2.3.1.0
python: 2.6.6
ant: 10.1
java: 1.8.0_13
tomcat: 8.5.14
jenkins: 2.73
Ansible roles
- Ansible Role 系统环境 之【ant】
- Ansible Role 系统环境 之【java】
- Ansible Role 系统环境 之【iptables】
- Ansible Role WEB 之【tomcat】
- Ansible Role WEB 之【nginx】
- Ansible Role 持续集成 之【jenkins】
- Ansible Role 持续交付 之【deploy-tomcat】
服务器角色
| 主机 | 角色 |
|---|---|
| node1 | nginx,jenkins |
| node130 | tomcat |
| node131 | tomcat |
集群搭建
本次使用anisble playbook
---
- hosts: node130 node131
vars:
- java_version: "1.8"
- tomcat_version: "8.5.14"
- iptables_allowed_tcp_ports: ["8080"]
roles:
- java
- { role: tomcat, java_home: "/usr/java/jdk1.8.0_131" }
- iptables
- hosts: node1
vars:
- java_version: "1.8"
- nginx_version: "1.12.1"
- nginx_upstreams:
- name: upstremtest
servers:
- 192.168.77.130:8080 max_fails=2 fail_timeout=2
- 192.168.77.131:8080 max_fails=2 fail_timeout=2
- nginx_vhosts:
- listen: 80
locations:
- name: /
proxy_pass: http://upstremtest
- jenkins_version: "2.73"
- jenkins_plugins_extra:
- ansible
- ansicolor
- iptables_allowed_tcp_ports: ["80","8080"]
roles:
- ant
- java
- nginx
- jenkins
- iptables
tasks:
- name: install ansible
package: name=ansible
怎么使用ansible roles,请移步到 Ansible Role【怎么用?】
确保正常访问以下服务:
- nginx http://192.168.77.129/lework
- jenkins http://192.168.77.129:8080 帐号密码:admin/admin
- tomcat http://192.168.77.130:8080/lework http://192.168.77.131:8080/lework
node1服务器操作
在服务器上配置ansible playbook
# cd /etc/ansible/
# cat tomcat-deploy.yml
---
- hosts: all
serial: 1
roles:
- deploy-tomcat
# cat hosts
[node130]
192.168.77.130
[node131]
192.168.77.131
[testservers:children]
node130
node131
[testservers:vars]
ansible_ssh_user=root
ansible_ssh_pass=123456
# git clone https://github.com/kuailemy123/Ansible-roles.git /etc/ansible/roles/
# chown jenkins.jenkins /etc/ansible/
jenkins 操作
登录jenkins之后,设置工具
点击“系统管理”==》“Global Tool Configuration”



创建发布项目

配置参数化构建

配置源码仓库地址

配置构建环境

配置编译

配置ansible

配置ansible变量

这里就不配置邮件通知了。
创建回滚项目

配置参数化构建

配置构建环境

配置ansible

配置anisble变量

测试
执行tomcat_deploy任务

选择发布的节点,默认all
任务执行的日志
Started by user admin
Building in workspace /var/lib/jenkins/workspace/tomcat_deploy
Cloning the remote Git repository
Cloning repository https://github.com/kuailemy123/AntSpringMVC.git
> git init /var/lib/jenkins/workspace/tomcat_deploy # timeout=10
Fetching upstream changes from https://github.com/kuailemy123/AntSpringMVC.git
> git --version # timeout=10
> git fetch --tags --progress https://github.com/kuailemy123/AntSpringMVC.git +refs/heads/*:refs/remotes/origin/*
> git config remote.origin.url https://github.com/kuailemy123/AntSpringMVC.git # timeout=10
> git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
> git config remote.origin.url https://github.com/kuailemy123/AntSpringMVC.git # timeout=10
Fetching upstream changes from https://github.com/kuailemy123/AntSpringMVC.git
> git fetch --tags --progress https://github.com/kuailemy123/AntSpringMVC.git +refs/heads/*:refs/remotes/origin/*
> git rev-parse refs/remotes/origin/master^{commit} # timeout=10
> git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision 989ea3a6549e16e3dd4cd329ab969b47658c9d67 (refs/remotes/origin/master)
Commit message: "Create README.md"
> git config core.sparsecheckout # timeout=10
> git checkout -f 989ea3a6549e16e3dd4cd329ab969b47658c9d67
First time build. Skipping changelog.
[tomcat_deploy] $ ant -file build.xml -Ddeploy_node=all
Buildfile: /var/lib/jenkins/workspace/tomcat_deploy/build.xml
clean:
[delete] Deleting directory /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes
init:
[mkdir] Created dir: /var/lib/jenkins/workspace/tomcat_deploy/target
[mkdir] Created dir: /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes
resolve:
[echo] Getting dependencies...
[ivy:retrieve] :: Apache Ivy 2.4.0 - 20141213170938 :: http://ant.apache.org/ivy/ ::
[ivy:retrieve] :: loading settings :: url = jar:file:/usr/local/ant/lib/ivy-2.4.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
[ivy:retrieve] :: resolving dependencies :: org.apache#WebProject;working@node1
[ivy:retrieve] confs: [compile, runtime, test]
[ivy:retrieve] found org.slf4j#slf4j-api;1.7.6 in public
[ivy:retrieve] found jstl#jstl;1.2 in public
[ivy:retrieve] found ch.qos.logback#logback-classic;1.1.2 in public
[ivy:retrieve] found ch.qos.logback#logback-core;1.1.2 in public
[ivy:retrieve] found org.springframework#spring-core;4.1.3.RELEASE in public
[ivy:retrieve] found commons-logging#commons-logging;1.2 in public
[ivy:retrieve] found org.springframework#spring-beans;4.1.3.RELEASE in public
[ivy:retrieve] found org.springframework#spring-context;4.1.3.RELEASE in public
[ivy:retrieve] found org.springframework#spring-aop;4.1.3.RELEASE in public
[ivy:retrieve] found aopalliance#aopalliance;1.0 in public
[ivy:retrieve] found org.springframework#spring-expression;4.1.3.RELEASE in public
[ivy:retrieve] found org.springframework#spring-web;4.1.3.RELEASE in public
[ivy:retrieve] found org.springframework#spring-webmvc;4.1.3.RELEASE in public
[ivy:retrieve] downloading https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.6/slf4j-api-1.7.6.jar ...
[ivy:retrieve] ............ (28kB)
[ivy:retrieve] .. (0kB)
..... 省略下载的信息
[ivy:retrieve] :: resolution report :: resolve 74135ms :: artifacts dl 120701ms
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| compile | 13 | 13 | 13 | 0 || 13 | 13 |
| runtime | 13 | 13 | 13 | 0 || 13 | 13 |
| test | 13 | 13 | 13 | 0 || 13 | 13 |
---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: org.apache#WebProject
[ivy:retrieve] confs: [compile, runtime, test]
[ivy:retrieve] 13 artifacts copied, 0 already retrieved (5920kB/79ms)
compile:
[javac] Compiling 1 source file to /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes
copy-resources:
[copy] Copying 1 file to /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes
package:
[ivy:retrieve] :: retrieving :: org.apache#WebProject
[ivy:retrieve] confs: [runtime]
[ivy:retrieve] 0 artifacts copied, 13 already retrieved (0kB/5ms)
[war] Building war: /var/lib/jenkins/workspace/tomcat_deploy/target/helloproject-20170819172002.war
main:
BUILD SUCCESSFUL
Total time: 3 minutes 19 seconds
[tomcat_deploy] $ /usr/bin/ansible-playbook /etc/ansible/tomcat-deploy.yml -i /etc/ansible/hosts -l all -f 5 -e deploy_port=8080 -e deploy_file=/var/lib/jenkins/workspace/tomcat_deploy/target/helloproject-*.war
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : check | 发布文件是否存在] ****************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : check | 目标应用服务的家目录是否存在] **********************************
ok: [192.168.77.130]
TASK [deploy-tomcat : check | 工作目录如果不存在则创建] ************************************
changed: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/new)
changed: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/pre)
changed: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/old)
TASK [deploy-tomcat : deloy | 解压代码至目标服务器] **************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : deloy | 关闭服务] ********************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : deloy | 等待端口关闭] ******************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : deloy | 移动线上代码] ******************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : deloy | 部署最新代码] ******************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : deloy | 启动服务] ********************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : deloy | 等待端口开启] ******************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : backup | 创建存储备份的文件夹] *************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : backup | 备份上线的代码] ****************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : rollback | 检查/tmp/tomcat-ansible-snap/old是否存在代码] *********
skipping: [192.168.77.130]
TASK [deploy-tomcat : rollback | 关闭服务] *****************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : rollback | 等待端口关闭] ***************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : rollback | 部署上一版代码] **************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : rollback | 启动服务] *****************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : rollback | 等待端口开启] ***************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
skipping: [192.168.77.130]
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : check | 发布文件是否存在] ****************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : check | 目标应用服务的家目录是否存在] **********************************
ok: [192.168.77.131]
TASK [deploy-tomcat : check | 工作目录如果不存在则创建] ************************************
ok: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/new)
ok: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/pre)
ok: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/old)
TASK [deploy-tomcat : deloy | 解压代码至目标服务器] **************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : deloy | 关闭服务] ********************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : deloy | 等待端口关闭] ******************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : deloy | 移动线上代码] ******************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : deloy | 部署最新代码] ******************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : deloy | 启动服务] ********************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : deloy | 等待端口开启] ******************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : backup | 创建存储备份的文件夹] *************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : backup | 备份上线的代码] ****************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : rollback | 检查/tmp/tomcat-ansible-snap/old是否存在代码] *********
skipping: [192.168.77.131]
TASK [deploy-tomcat : rollback | 关闭服务] *****************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : rollback | 等待端口关闭] ***************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : rollback | 部署上一版代码] **************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : rollback | 启动服务] *****************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : rollback | 等待端口开启] ***************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
skipping: [192.168.77.131]
PLAY RECAP *********************************************************************
192.168.77.130 : ok=14 changed=8 unreachable=0 failed=0
192.168.77.131 : ok=14 changed=7 unreachable=0 failed=0
Finished: SUCCESS
执行tomcat_rollback任务

选择回滚的节点,默认all
执行的日志
Started by user admin
Building in workspace /var/lib/jenkins/workspace/tomcat_rollback
[tomcat_rollback] $ /usr/bin/ansible-playbook /etc/ansible/tomcat-deploy.yml -i /etc/ansible/hosts -l all -f 5 -e deploy_rollback=true
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : check | 发布文件是否存在] ****************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : check | 目标应用服务的家目录是否存在] **********************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : check | 工作目录如果不存在则创建] ************************************
skipping: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/new)
skipping: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/pre)
skipping: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/old)
TASK [deploy-tomcat : deloy | 解压代码至目标服务器] **************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : deloy | 关闭服务] ********************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : deloy | 等待端口关闭] ******************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : deloy | 移动线上代码] ******************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : deloy | 部署最新代码] ******************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : deloy | 启动服务] ********************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : deloy | 等待端口开启] ******************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : backup | 创建存储备份的文件夹] *************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : backup | 备份上线的代码] ****************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : rollback | 检查/tmp/tomcat-ansible-snap/old是否存在代码] *********
changed: [192.168.77.130]
TASK [deploy-tomcat : rollback | 关闭服务] *****************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : rollback | 等待端口关闭] ***************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : rollback | 部署上一版代码] **************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : rollback | 启动服务] *****************************************
fatal: [192.168.77.130]: FAILED! => {"changed": true, "cmd": "/etc/init.d/tomcat start", "delta": "0:00:20.035003", "end": "2017-08-19 17:24:47.586469", "failed": true, "rc": 1, "start": "2017-08-19 17:24:27.551466", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring
TASK [deploy-tomcat : rollback | 等待端口开启] ***************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
ok: [192.168.77.130]
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : check | 发布文件是否存在] ****************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : check | 目标应用服务的家目录是否存在] **********************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : check | 工作目录如果不存在则创建] ************************************
skipping: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/new)
skipping: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/pre)
skipping: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/old)
TASK [deploy-tomcat : deloy | 解压代码至目标服务器] **************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : deloy | 关闭服务] ********************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : deloy | 等待端口关闭] ******************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : deloy | 移动线上代码] ******************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : deloy | 部署最新代码] ******************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : deloy | 启动服务] ********************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : deloy | 等待端口开启] ******************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : backup | 创建存储备份的文件夹] *************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : backup | 备份上线的代码] ****************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : rollback | 检查/tmp/tomcat-ansible-snap/old是否存在代码] *********
changed: [192.168.77.131]
TASK [deploy-tomcat : rollback | 关闭服务] *****************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : rollback | 等待端口关闭] ***************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : rollback | 部署上一版代码] **************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : rollback | 启动服务] *****************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : rollback | 等待端口开启] ***************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
ok: [192.168.77.131]
PLAY RECAP *********************************************************************
192.168.77.130 : ok=8 changed=4 unreachable=0 failed=0
192.168.77.131 : ok=8 changed=4 unreachable=0 failed=0
Finished: SUCCESS
至此,持续交付实验就完成了,但是持续之路还是很漫长了。望大家永远前进。 大家也可在发的过程中,测试发布是否是灰度发布。
for i in `seq 10000`;do curl -s -I http://192.168.77.129 | head -1;sleep 1;done;
作者:lework
链接:https://www.jianshu.com/p/fca8f91ae223
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
利用ansible来做tomcat应用的持续交付的更多相关文章
- 利用ansible来做kubernetes 1.10.3集群高可用的一键部署
请读者务必保持环境一致 安装过程中需要下载所需系统包,请务必使所有节点连上互联网. 本次安装的集群节点信息 实验环境:VMware的虚拟机 IP地址 主机名 CPU 内存 192.168.77.133 ...
- 利用jenkins和docker实现持续交付
利用jenkins和docker实现持续交付 一.什么是持续交付 让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定.持续的保持在随时可以发布的状况.它的目标在于让软件的构建.测试与发布变得更 ...
- 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)
前言 上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库 ...
- Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)
上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库文件和版本,以 ...
- 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境
前言 但凡一个略有规模的项目都需要一个持续集成环境的支撑,为什么需要持续集成环境,我们来看一个例子.假如一个项目,由A.B两位程序员来协作开发,A负责前端模块,B负责后端模块,前端依赖后端.A和B都习 ...
- Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境
使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一) 2015-01-14 20:28 by 飘扬的红领巾, 4322 阅读, 5 评论, 收藏, 编辑 ...
- 用Vagrant和Ansible搭建持续交付平台
这是一个关于Vagrant的学习系列,包含如下文章: Vagrant入门 创建自己的Vagrant box 用Vagrant搭建Jenkins构建环境 用Vagrant和Ansible搭建持续交付平台 ...
- Docker学习总结(8)——利用Docker开启持续交付之路
持续交付即Continuous Delivery,简称CD,随着DevOps的流行正越来越被传统企业所重视.持续交付讲求以短周期.小细粒度,自动化的方式频繁的交付软件,在这个过 程中要求开发.测试.用 ...
- Ansible的roles标准化与Jenkins持续集成(三)
Ansible的roles标准化与Jenkins持续集成(三) 链接:https://pan.baidu.com/s/1A3Iq3gGkGS27L_Gt37_I0g 提取码:ncy2 复制这段内容后打 ...
随机推荐
- 6.capacity scheduler
1.先决条件 要使用yarn的capcitiy调度器,必须开启yarn的ACLs,否则队列ACLs设置不生效 开启yarn ACLs: # hadoop: core-site.xml hadoop ...
- Vue 实例详解与生命周期
Vue 实例详解与生命周期 Vue 的实例是 Vue 框架的入口,其实也就是前端的 ViewModel,它包含了页面中的业务逻辑处理.数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进 ...
- 找"1"
题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的次数. 要求:1.写一个函数f(N),返回1到N之间出现“1”的个数.例如f(12)=5. 2.在32位整数范围内 ...
- 【Coursera】高斯混合模型
一.高斯混合模型 软分类算法,即对每一个样本,计算其属于各个分布的概率,概率值最大的就是这个样本所属的分类. 对于训练样本的分布,看成为多个高斯分布加权得到的.其中每个高斯分布即为某一特定的类. 高斯 ...
- Alpha版本冲刺(五)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- 树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (二) 发送自定义数据
在我的项目里,树莓派主要作为中心节点,用于接收数据,Arduino作为子节点,用于发送数据,考虑到以后会有很多子节点,但又不至于使得代码过于繁琐,因此所有的传输数据添加一个头部编号用于区分不同节点. ...
- 树莓派配置RTC时钟(DS3231,I2C接口)
1.购买基于DS3231的RTC时钟模块,并且支持3.3V的那种 2.配置树莓派 a.打开树莓派的i2c接口 sudo raspi-config -->Interfacing Options - ...
- Head First Java & 异常
- Java 线程结束 & 守护线程
/* 停止线程: 1,stop方法. 2,run方法结束. 怎么控制线程的任务结束呢? 任务中都会有循环结构,只要控制住循环就可以结束任务. 控制循环通常就用定义标记来完成. 但是如果线程处于了冻结状 ...
- 0506Scrum项目1.0
1.确定选题. 应用NABCD模型,分析你们初步选定的项目,充分说明你们选题的理由. 录制为演说视频,上传到视频网站,并把链接发到团队博客上. 截止日期:2016.5.6日晚10点 团队名称:虫洞 团 ...