目录

  • 1 第一单元
    • 1.1 项目启动:团队计划
    • 1.2 新建课程目录
    • 1.3 项目启动:开发环境搭建
    • 1.4 第一循环:需求获取
    • 1.5 第一循环:需求获取实践
    • 1.6 建立项目计划:甘特图
  • 2 第二单元
    • 2.1 第二循环阶段预备知识:软件质量
    • 2.2 第二循环实践描述
    • 2.3 第二循环:涉众分析
    • 2.4 用户需求风险分析
    • 2.5 开发用户界面原型
    • 2.6 需求规格说明
    • 2.7 系统级别的测试
    • 2.8 修订项目计划实践
  • 3 第三单元
    • 3.1 第三循环阶段预备知识:软件架构
    • 3.2 第三循环阶段实践描述
    • 3.3 第三循环阶段之筛选关键需求
    • 3.4 架构备选方案和风险分析
    • 3.5 开发演化式架构原型
    • 3.6 软件架构设计文档
    • 3.7 架构评审会议实践
    • 3.8 集成测试计划和用例
    • 3.9 工作量估算及估算实践
    • 3.10 第三循环阶段实验手册及评价标准
  • 4 第四单元 第四循环
    • 4.1 预备知识:软件测试技术
    • 4.2 第四循环阶段实践描述
    • 4.3 详细设计实践
    • 4.4 编码活动实践
    • 4.5 单元测试
    • 4.6 执行各阶段测试
    • 4.7 内部项目评审
    • 4.8 第四循环阶段实验手册和评价标准
  • 5 项目部署
    • 5.1 项目部署阶段实践描述
    • 5.2 项目发布实践
    • 5.3 软件维护活动及维护准备
    • 5.4 用户验收实践
    • 5.5 项目组总结实践
    • 5.6 项目部署阶段实验手册及评价标准
预备知识:软件测试技术

软件测试技术分类:

• 按照产生测试的来源划分。测试可能由需求利用黑盒测试技术产生,也可以由代码产生,还可以由界面产生。

• 按照测试位于的生命周期阶段划分。一般认为,在编码阶段将完成单元测试,组装阶段完成集成测试,系统集成阶段完成系统测试,维护阶段完成回归测试,系统完成发布之前完成Beta测试。

• 按照特定的测试活动目标划分。基于目标的测试活动很多,常见的有基于产品功能产生的功能测试,基于安全性产生的安全性测试,基于无效输入的鲁棒性测试,还有基于 GUI错误的GUI测试等。

• 根据被测试的产物划分。使用被测试的产物来命名测试技术并不少见,比如组件测试、面向对象( OO ) 的测试、手机测试等。但由于在软件过程中需要测试的产物很多,所以这种分类方式一般只能用做区别设计范围,并没有完全覆盖所有需要测试的软件制品。

在各种软件测试技术中,最常见的是白盒 测 试 (white-box testing) 和黑盒测试( black-boxksting )  

Jenkins是一款能提高效率的软件,它能把软件开发过程形成工作流,它可以帮你在写完代码后,一键完成开发过程中的一系列上线测试工作,解决一切重复劳动力,典型的工作流包括以下几个步骤:      1、开发      2、提交      3、编译      4、测试      5、上线

有了Jenkins的帮助,在这5步中,除了第1步,后续的4步都是自动化完成的,具体的,当你完成了提交,Jenkins会自动运行你的编译脚本,编译成功后,再运行你的测试脚本,这一步成功后,接着它会帮你把新程序发布出去,特别的,在最后一步,你可以选择手动发布,或自动发布,那么在真正的生产环境中一般我们都是使用手动上线,自动化上线的弊端就是代码如果经过测试还是存在bug那么此时就会影响我们线上的用户...

整个资料涵盖了以下内容:      1、jenkins安装配置以及常见的上线配置流、权限控制、自动化发布的实现;      2、svn/httpd/ssl/nginx/mysql全套集成安装配置;      3、docker/docker-conpose安装配置以及基础使用;      4、ansible自动化工具的实现;      后期可能会更新结合K8S相关内容

适用人群:      1、开发工程师      2、测试工程师      3、运维工程师      4、需要linux基础知识和shell基础即可

最终你可以做到jenkins+svn/git+ansible+docker结合容器化技术实现PHP、Python、JAVA等项目环境全自动化上线、回滚、备份,灰度发布、平滑升级.... 在项目开发的过程中我们会不断迭代更新,那么此时我们如果有这个架构就完全可以解决繁琐的代码测试环节中的重复人工劳动力;


持续集成


互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称CI)。
持续集成指的是,频繁地(一天多次)将代码集成到主干,它的好处主要有两个.
    (1)快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。        
    (2)防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成
持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
与持续集成相关的,还有两个概念,分别是持续交付和持续部署。


持续交付


    持续交付(Continuous delivery)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。持续交付可以看作持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。


持续部署


    持续部署(continuous deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。


流程


    根据持续集成的设计,代码从提交到生产,整个过程有以下几步。


提交


    流程的第一步,是开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交(commit)。


测试


    代码仓库对commit操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。
测试有好几种。
    1、单元测试:针对函数或模块的测试
    2、集成测试:针对整体产品的某个功能的测试,又称功能测试
    3、端对端测试:从用户界面直达数据库的全链路测试


构建


    通过第一轮测试,代码就可以合并进主干,就算可以交付了。交付后,就先进行构建(build),再进入第二轮测试。所谓构建,指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、JS脚本、图片)等等。
常用的构建工具如下。
    Jenkins
    Travis
    Codeship
    Strider


部署


    通过了第二轮测试,当前代码就是一个可以直接部署的版本(artifact)。将这个版本的所有文件打包( tar filename.tar * )存档,发到生产服务器。生产服务器将打包文件,解包成本地的一个目录,再将运行路径的符号链接(symlink)指向这个目录,然后重新启动应用。这方面的部署工具有Ansible,Chef,Puppet等。


回滚


    一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指向上一个版本的目录。


实现方式


    此处以jenkins为例,对于jenkins这个组件的出现给我们的持续集成方案得到了很好的拓展性,不仅支持现有主流的版本控制系统GIT还持续我们的SVN、CVS。它们都会将构建和测试,在一次运行中执行完成。可以结合ansible/puppet这样的自动化工具来实现完善的一套部署方案,利用jenkins在我们的版本控制系统去拉去最新或者指定版本的代码,而后通过ansible来完成一建部署,大大减少了重复劳动力,为我们的开发、运维人员都带来了很好的便利。


实例使用jenkins来一键持续划部署我们的wordpress


配置环境


Hostname网卡eth0默认网关用途
node1192.168.1.71192.168.1.1jenkins/git/ansible
node2192.168.1.72192.168.1.1web前端
node3192.168.1.73192.168.1.1备份服务器


配置Git,此处我们以Github来作为git服务器



创建仓库




配置我们的jenkins用户可以提交代码到git上


[jenkins@node1 ~]$ ssh-keygen -t rsa -C "mail0426@163.com" #创建密钥对,然后将我们的公钥放置到github上
[jenkins@node1 ~]$ cat .ssh/id_rsa.pub 
ssh-rsa             AAAAB3NzaC1yc2EAAAADAQABAAABAQDT4xtEyOPMRa2wHGuBt5GgP/Q5+PiXCKZ5rmx13nilDF7vNhmDtWiPEocAd/ecPN4TIZ87CZZTNTFrhbHeoA4HDsPZLpT0tsHiMghHwalJf7CsUyt8hAqAcd1RbhC7OSeb5DpmeAnTOfgR2Nq5zgWQZ/0gcZvh7KRe7fXQRa+OgGff6HvKHkD8VDd7QGH5mORmEaolVZZr1uBdjXCzBWbuknkBi0QdqTfgC4q7UmObIiAmiSpvu1+T4Uow2OOIY/yiWDA+C0A0a/4dpVvB0DxYxIvaR4nl6EtUF42PLIIYOaW3LFYO4pqE+ew7+MROhPpE8b8DEBkAyiroDcwl6R4Z mail0426@163.com



测试访问


    因为已经将公钥放入了github仓库,那么此时我们就可以直接测试,是否可以通过本地的私钥去访问持有公钥的github私有仓库
[jenkins@node1 ~]$ ssh -T git@github.com
Hi caichangen/jenkins_object! You've successfully authenticated, but GitHub does not provide shell access.


下载wordpress


[jenkins@node1 ~]# wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz


clone将我们的代码仓库克隆到本地


接下来我们要做的就是把本地代码传到github上去,在此之前还需要设置username和email,因为github每次commit都会记录他们。
[jenkins@node1 ~]$ git config --global user.name "caichangen"
[jenkins@node1 ~]$ git config --global user.email "mail0426@163.com"
[jenkins@node1 ~]$ git clone git@github.com:caichangen/jenkins_object.git  #将代码啦到本地
[jenkins@node1 ~]$ ls jenkins_object/
[jenkins@node1 ~]$ tar xf wordpress-4.7.4-zh_CN.tar.gz #解压我们的workpress
[jenkins@node1 ~]$ mv wordpress/* jenkins_object/  #将我们的代码放置到git仓库
[jenkins@node1 jenkins_object]$ cd jenkins_object/  #进入Git仓库目录
[jenkins@node1 jenkins_object]$ git add ./* 
[jenkins@node1 jenkins_object]$ git commit -m "commit wordpress" #提交代码
[jenkins@node1 jenkins_object]$ git push -u origin master #将代码上传至github仓库


结果如图


    此时,我们的workspaces代码已经提交到了github仓库



Blog Addr

简介


    搭建持续集成首先要了解什么是持续集成,带着明确的目标去搭建持续集成环境才能让我们少走很多弯路。持续集成(Continuous integration)简称CI,是一种软件开发的实践,可以让团队在持续集成的基础上收到反馈并加以改进,不必等到开发的后期才寻找和修复缺陷。当然要明白的是持续集成环境的搭建也不是一劳永逸的,随着软件项目复杂度的增加,持续集成的环境同样要加以维护以确保集成环境的可靠性。


jenkins官网地址:http://mirrors.jenkins.io/war-stable


安装配置


配置jenkins运行所需java环境
[root@node1 ~]# rpm -vih jdk-8u112-linux-x64.rpm
[root@node1 ~]# tail -3 /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_112
export CLASSPATH=.:$JAVA_HOME/jre/lib/*:$JAVA_HOME/lib/*
export PATH=$PATH:$JAVA_HOME/bin
export JENKINS_HOME=/data/jenkins/data
[root@node1 ~]# source /etc/profile
安装配置jenkins
[root@node1 ~]# useradd jenkins  #给jenkins独立配置一个运行用户
[root@node1 ~]# sudo su - jenkins
[jenkins@node1 ~]# wget http://mirrors.jenkins.io/war-stable/2.46.3/jenkins.war #下载jenklins软件包
[jenkins@node1 ~]# mkdir /usr/local/jenkins  #创建存储jenkins软件包路径
[jenkins@node1 ~]# mv jenkins.war /usr/local/jenkins/  
[jenkins@node1 ~]# nohup java -jar /usr/local/jenkins/jenkins.war & #启动jenkins,在正式的应用环境我们可以通过tomcat来部署
此时我们就可以通过http://your_ip:8080来登录我们的jenkins,首先我们需获取jenkins登录密码
[jenkins@node1 ~]$ cat /home/jenkins/.jenkins/secrets/initialAdminPassword
        48ff4a8cc8d7437296e0b6c1b1ff7dd0


登录jenkins



安装插件



插件安装完成后创建我们的管理员帐号



安装成功



使用nginx来作为反代服务器,代{过}{滤}理jenkins供用户访问


        [root@node1 nginx-1.10.1]# yum install -y openssl-devel pcre-devel gcc #安装所需的依赖
        [root@node1 ~]# useradd -r www        #创建nginx运行用户
        [root@node1 src]# tar xf nginx-1.10.1.tar.gz 
        [root@node1 src]# cd nginx-1.10.1
        [root@node1 nginx-1.10.1]# ./configure --prefix=/usr/local/nginx --user=www --group=www
        [root@node1 nginx-1.10.1]# make -j 2 && make install
        [root@node1 ~]# tail -12 /usr/local/nginx/conf/nginx.conf  #配置nginx作为反代服务器
            server {
                listen        80;
                server_name 192.168.1.71;

                location / {
                        proxy_pass http://127.0.0.1:8080;
                        proxy_set_header   Host                      $host;
                        proxy_set_header   X-Real-IP              $remote_addr;
                        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
                }
            }
        }
        [root@node1 ~]# /usr/local/nginx/sbin/nginx


测试访问



Blog Addr

配置ansible实现无密钥交互


安装阿里云YUM源码
[root@node1 ~]# cat <<EOF>>/etc/yum.repos.d/epel.repo
[epel]
name=epel for aliyun
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
enabled=1
gpgcheck=0
[os]
name=os for aliyun
baseurl=https://mirrors.aliyun.com/centos/7/os/x86_64/
enabled=1
gpgcheck=0    
EOF
[root@node1 ~]$ yum clean all
[root@node1 ~]$ yum makecache
安装ansible
[cce@node1 ~]$ yum list |grep ansible*
ansible.noarch                           2.3.0.0-3.el7                 epel     
ansible-doc.noarch                       2.3.0.0-3.el7                 epel     
ansible-inventory-grapher.noarch         2.3.2-1.el7                   epel     
ansible-lint.noarch                      3.4.9-1.el7                   epel     
ansible-openstack-modules.noarch         0-20140902git79d751a.el7      epel     
ansible-review.noarch                    0.13.0-2.el7                  epel     
kubernetes-ansible.noarch                0.6.0-0.1.gitd65ebd5.el7      epel     
python2-ansible-tower-cli.noarch         3.1.3-1.el7                   epel     
[root@node1 ~]$ yum install -y ansible
利用jenkins密钥对实现ansible免密分发
[jenkins@node1 ~]$ ls .ssh/
id_rsa  id_rsa.pub  known_hosts    
将ansible所有权给我们的jenkins用户
[root@node1 ~]# chown -R jenkins:jenkins /etc/ansible/
将两台客户端服务器加入我们的ansible认真hosts表里,并归纳为test组
[jenkins@node1 ~]# tail -3 /etc/ansible/hosts 
[jenkins]
192.168.1.72
192.168.1.73
编写简单的YML来实现以上创建步骤(我们的jenkins用户也需要开通sudo权限来完成一些例如服务重启的工作)
[root@node1 ~]# cat key.yml
---
- hosts: jenkins
  remote_user: root
  tasks:
        - name: Create User
          user: name=jenkins
        - name: grant permissions
          shell: usermod -aG wheel jenkins
        - name: Mkdir Key Director
          file: path=/home/jenkins/.ssh mode=0700 owner=jenkins group=jenkins state=directory
        - name: Copy Public Key
          copy: src=/home/jenkins/.ssh/id_rsa.pub dest=/home/jenkins/.ssh/authorized_keys owner=jenkins group=jenkins mode=600



配置ansible支持无密钥登录


[ops@node1 ~]$ egrep "^[^#\[]" /etc/ansible/ansible.cfg
inventory      = /etc/ansible/hosts
remote_tmp     = ~/.ansible/tmp
local_tmp      = ~/.ansible/tmp
forks          = 5
poll_interval  = 15
sudo_user      = root
executable = /bin/bash
private_key_file = /home/jenkins/.ssh/id_rsa
connect_timeout = 30
connect_retries = 30
connect_interval = 1


切换至jenkins用户测试无密钥登录是否正常



配置我们的node2作为我们的web前端


[root@node2 ~]# yum install mysql mysql-devel httpd httpd-devel php mariadb-server php-mysql
配置测试页面查看我们的PHP环境是否安装成功
[root@node2 ~]# cat /var/www/html/index.php
<?php
phpinfo();
?>
[root@node2 ~]# systemctl start httpd
[root@node2 ~]# systemctl start mariadb



配置我们的node3作为备份服务器


[root@node3 ~]# mkdir -pv /data/www/sourcecode/ 
[root@node3 ~]# chown -R jenkins:jenkins /data/www/


配置我们的jenkins


首先安装以下插件:
Environment Injector Plugin
Safe Restart Plugin
Javadoc Plugin
jQuery plugin
Extended Choice Parameter Plug-In
Pre SCM BuildStep Plugin
Robot Framework plugin
Git Parameter Plug-In


创建一个自由风格的软件项目



配置参数化构建



配置GIT参数




配置构建后的操作



配置环境


[jenkins@node1 ~]$ sudo mkdir /data/www/sourcecode/  #此处为代码存放目录
[jenkins@node1 ~]$ sudo chown -R jenkins:jenkins /data/www/ #将属主修改为jenkins以免出现权限问题


配置分发脚本


[jenkins@node1 ~]$ cat /usr/local/scripts/local-dev-jenkins_test-deploy.sh
#!/bin/bash

### check 
if [ ! -n "$1" ];then
        echo "Please enter your file's name."
        exit 10
fi

name=$1
datetime=$2
destination='jenkins'
##此处的destination是72和73,73作为备份服务器所以也需要推送,72则需要部署上线操作
ansible ${destination} -m copy -a "src=/data/www/sourcecode/${name}.tar.gz dest=/data/www/jenkins_packet/" && \ 
ansible 192.168.1.72 -m shell -a "sudo nohup bash -x /usr/local/scripts/local-dev-jenkins_test-deploy.sh ${name} ${datetime}"  ##nohup在tomcat需要重启的时候必须使用,否则会出现tomcat被杀掉起不起来的情况


配置我们的72和73


配置73的源代码存放目录
[root@node3 ~]# mkdir /data/www/jenkins_packet/
[root@node3 ~]# chown -R jenkins:jenkins /data/www/
配置72的代码存放目录和部署脚本
[root@node2 ~]# mkdir /data/www/jenkins_packet/
[root@node2 ~]# chown -R jenkins:jenkins /data/www/
[root@node2 ~]# mkdir /usr/local/scripts/
[root@node2 scripts]# cat  /usr/local/scripts/local-dev-jenkins_test-deploy.sh 
#!/bin/bash
#
name=${1}.tar.gz
SITE_NAME=${1}
date_time=$2

if [ -d /tmp/${SITE_NAME} ];then
        rm -rf /tmp/${SITE_NAME} 
fi
mkdir /tmp/${SITE_NAME}

rm -rf /var/www/html_bak
#systemctl stop httpd
if [ -d /var/www/html ];then
        mv /var/www/html /var/www/html_bak
fi

tar -zxf /data/www/jenkins_packet/${name} -C /tmp/${SITE_NAME}

mv -f /tmp/${SITE_NAME} /var/www/html
chown -R apache:apache /var/www/html
#systemctl start httpd  ##PHP环境无需重启


正式发布我们的代码



查看node2部署情况



查看node3备份情况



Blog Addr

简介


    Jenkins是一个开源的持续集成工具,应用Jenkins搭建持续集成环境,可以进行自动构建、自动编译和部署,非常方便。在服务器比较少的情况下,Jenkins的优势并不明显,但是随着项目发展,服务器数量的增加,Jenkins的优势就会凸显出来,可以很好的提高效率,减少很多人工操作。现在公司的开发都是使用Git管理代码,Maven管理多模块和项目依赖。Jenkins支持两种工程:FreeStyle工程和Maven工程。如果代码是用Maven构造的,可以直接建立Maven工程。


Maven工程配置


新建一个Maven工程后,需要设置以下条目:
    1、设置git代码的下载路径
    2、设置自动构造的日期
    3、设置pom文件的路径
    4、设置mvn命令的参数
    5、设置post-build的动作


Jenkins插件


菜单路径:系统管理—管理Jenkins—管理插件。
    安装以下插件:
        1、Maven Integration plugin
        2、Subversion Plugin
        3、Checkstyle Plugin
        4、Findbugs Plugin
        5、PMD Plugin
        6、Warnings Plugin
        7、Maven Info Plugin
        8、Maven Repository Scheduled Cleanup Plugin
        9、Unleash Maven Plugin
        10、Maven Invoker plugin


实例:配置jenkins支持maven自动编译


新建一个GIT仓库用于存放我们的JAVA代码



克隆到本地


[jenkins@node1 ~]$ git clone git@github.com:caichangen/maven.git


提交一份代码(此处我找到一份maven编译的代码)


[jenkins@node1 ~]$ tar xf backend.tar.gz
[jenkins@node1 ~]$ mv backend/* maven/
[jenkins@node1 ~]$ cd maven/
[jenkins@node1 maven]$ git add ./*
[jenkins@node1 maven]$ git commit -m 'commit java'
[jenkins@node1 maven]$ git push -u origin master


查看



在node1上配置的maven


[jenkins@node1 ~]$ wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
[root@node1 jenkins]# tar xf apache-maven-3.3.9-bin.tar.gz -C /usr/local/
[root@node1 jenkins]# cd /usr/local/
[root@node1 local]# ln -sv apache-maven-3.3.9/ maven
[root@node1 ~]# 
[root@node1 ~]# tail -6 /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_112
export CLASSPATH=.:$JAVA_HOME/jre/lib/*:$JAVA_HOME/lib/*
export PATH=$PATH:$JAVA_HOME/bin
export M2_HOME=/usr/local/maven
export M2=$M2_HOME/bin
export PATH=$M2:$PATH
[root@node1 ~]# source /etc/profile
[jenkins@node1 ~]$ mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /usr/local/maven
Java version: 1.8.0_112, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8.0_112/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-514.el7.x86_64", arch: "amd64", family: "unix"


配置jenkins设置中的maven和jdk环境



配置JDK



配置maven



创建一个maven项目



写入你的git仓库地址



配置pom.xml



build测试是否会进行打包



查看我们生成的war包(第一次需要下载一些jar包,所以时间会比较久)



注意


打包完成,此后我们就可以使用之前的方式来做代码分发到tomcat网站根目录了,因为java代码每次分发都需要重启tomcat,所以在此处需要注意的是,我们使用ansible去重启tomcat的时候需要用到nohup参数,可能是ansible不支持长连接的原因,如果不使用nohup参数的话会出现无法启动的原因(亲测)
在很多情况下,当我们的jenkins打包java程序的时候,会出现各种意想不到的情况大多部分都是因为缺少某某包而造成的,其实当我们有jenkins/java的环境下,我们可以自建nexus仓库,然后将改仓库加入到我们的项目开发的过程中,开发人员每次提交代码的时候先要将独立开发的工具类上传到我们的nexus,这样就可以完美避免这类问题的发生,当有了这个环境之后,jenkins开始构建的首先会在公共仓库里面去下载代码中需要的jar包,当公共仓库找不到的时候,此时会自己去我们的私有仓库里面去寻找;