云原生系列2-CICD持续集成部署-GitLab和Jenkins-程序员宅基地

技术标签: 云原生  

1、CICD持续集成部署

传统软件开发流程:
1、项目经理分配模块开发任务给开发人员(项目经理-开发)
2、每个模块单独开发完毕(开发),单元测试(测试)
3、开发完毕后,集成部署到服务器(测试、运维)
4、测试出现问题,提交bug,开发继续修复bug(开发)
5、bug修改完毕,继续提交测试....
问题:
1、模块之间依赖负载,集成部署经常出问题
2、测试人员经常在等待
3、按时交付也会出问题
思考:
1、测试时间能否提前(开发一提交代码,问题就能直接暴露出来:自动化测试)
2、人工集成部署 ( 能否使用自动化工具部署构建 )

持续集成:简称 CI
思想:每天要多次将代码合并到主干,并进行集成,测试,这样就可以提早发现错误,进行修正。持续集成也属于DevOps运维开发。
CI持续集成的好处:
1、自动化集成部署,提高了集成效率。
2、更快的修复问题。
3、更快的进行交付。
4、提高了产品质量。
持续集成流程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
DevOps 兴起于2009 年,近年来由于云计算、互联网的发展,促进了DevOps的基础设施及工具链的发展,涌现了一大批优秀的工具,这些工具包括开发,测试,运维的各个领域,例如:GitHub,Git/svn,Docker、Jenkins,HudSon,Ant/Maven/Gradle,QUnit、JMeter等,看下图:
在这里插入图片描述
在这里插入图片描述
这么多软件,按需学习,公司用什么学什么。
测试、部署的逻辑只需要写一遍,就可以自动运行了。
自动化监控平台(短信-)
自动化压测平台

2、GitLab类似github,是个私有仓库

1、GitLab安装,至少8G内存4核cpu

# 查找Gitlab镜像
docker search gitlab/gitlab-ce
# gitlab镜像拉取
docker pull gitlab/gitlab-ce
# 查看镜像
docker images
# 本机先建3个目录,为了gitlab容器通过挂载本机目录启动后可以映射到本机目录
# 配置文件
mkdir -p /home/gitlab/etc
# 数据文件
mkdir -p /home/gitlab/data
# 日志文件
mkdir -p /home/gitlab/logs
# 启动容器 mygitlab,如果不指定--hostname,host默认使用的是容器id访问。
docker run --name mygitlab -d \
--hostname=10.1.1.118 \
-p 4443:443 -p 8888:80 -p 8022:22 \
-v /home/gitlab/etc:/etc/gitlab \
-v /home/gitlab/data:/var/opt/gitlab \
-v /home/gitlab/logs:/var/log/gitlab \
--privileged=true \
gitlab/gitlab-ce:latest
# 动态查看容器日志
docker logs -f mygitlab

配置

# 配置http协议所使用的访问地址,不加端口默认为80
vim /home/gitlab/etc/gitlab.rb  加上下面这一行配置
external_url 'http://10.1.1.118'

/home/gitlab/data/gitlab-rails/etc/gitlab.yml,刚才启动容器指定的--hostname可在此配置文件修改配置

2、网页访问登入,http://10.1.1.118:8888
在这里插入图片描述

# 查看root用户默认密码
cat /home/gitlab/etc/initial_root_password
Password: Gsxzpjm/RwJgHlHIUJIOTFvfYnM19sC2VMPM7NTmCng=

登录成功后,修改密码(默认密码24小时有效)
在这里插入图片描述
3、创建项目
在这里插入图片描述
直接像使用github一样,所有操作都一样。

# 本机需要安装git环境
yum install git -y
git --version

克隆项目

# 全局配置
git config --global user.name "Administrator"
git config --global user.email "[email protected]"
git config --global credential.helper store  #只需要输入一次账户密码信息就会被保存记住

# 注意点:需要配置端口8888
git clone http://10.1.1.118:8888/root/base-test.git    #有问题可rm -rf base-test删除项目再克隆一次
cd base-test     # 克隆下来后进入这个项目
# 创建一个分支git switch -c main,这里不创建分支main了,使用默认的master主分支
touch README.md    #创建一个项目
git add .      # git add README.md添加这个项目,git add . 添加当前目录下所有项目
git commit -m "update"  # 提交的信息-m "update"
git push -u origin master  #推送到master主分支

在这里插入图片描述
4、设置免密提交
在这里插入图片描述

[root@node1 ~]# ssh-keygen -t rsa -b 4096 -C "[email protected]"   -t加密类型,-b加密大小,-C用户信息
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:woYgeVBL3AKa5oQ2Rz722JDGPBaLo26Mqd9XNPzYhcQ [email protected]
The key's randomart image is:
+---[RSA 4096]----+
|o+o+     .       |
|o=O.=     E      |
|*B+/   . . .     |
|*oB.Bo  + . .    |
|.. ..o+.S= .     |
|+.   . .o o      |
|o+     .         |
|o  .  .          |
|... ..           |
+----[SHA256]-----+
[root@node1 ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDBm6BA8cjS4bjQKOpvReIE8nHEVTnd9tT25jhcxiQU2Epx190bCe/VVxomYQdIFEeECjPzx3TCLMHHxd5rNFaw9hljJwcQuaODmil5g1LmQRFZqnKoTXc9a5VDtW5CZpyGcgrl8lsE2Bgdh95Bmqta64VOhhc5sLjuSY6X5HQjBOvMmg6WetdlAiUIWp4egTXMXzXqCHfRkLw9opuqQpITpCmUOl94PRNG8eqhHGr0o38c/OJmNKDFXx9ouuuRLUJWvmK+qCsyvMTSGlvw3bKxsFGQA2V+Gn6jCgzrEZI1tZakmhoGw8EvuIViRrAjgre1tfzsO424cGGpRElXBHwhYx10NTX+e6HwZfvRznDuPsvkIQ6TlNIX0CIy2UxN63x4w3ZP3kOa+ZL0XTaGbHcxJZ2GUgYjQrHzSbDQ7cKKqiazl2epukcV+osf19QoVnbsg9uIBMC3t+i28fl+byZoJCpxIF+5ItmsyUq770ryKfaWVMrCYI76tMQHFKVE7rEe/fg6c2RwQxcEPfHOl1UN3nVo82x0HfqtMbDRmUdDMJaCf5X/QIS6oKTg7HosjnRb1XOioPAvr8aF2R5Qa3djkFssIj7BdNTia1lg7AuaGypMRIDohbrNOtkspxmVAyw4UQaqMX5buGYdJa+rBHUOK/UAXzj/EGKQCtmlkXGxFQ== [email protected]

在这里插入图片描述
在这里插入图片描述

3、Jenkins安装

官网地址:https://www.jenkins.io/zh/
在这里插入图片描述
1、通过Docker安装Jenkins

# 创建挂载目录
mkdir -p /var/jenkins_home
chmod 777 /var/jenkins_home
# 安装jenkinsci/blueocean
docker run \
  -u root \
  -d \
  -p 8080:8080 \
  -p 50000:50000 \
  -v /var/jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean

[root@node1 ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                                                                      NAMES
c18bf132384c   jenkinsci/blueocean   "/sbin/tini -- /usr/…"   2 minutes ago   Up 2 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp   reverent_gould
[root@node1 ~]# docker logs -f c1   动态查看容器日志

2、网页登入,http://10.1.1.118:8080
查看密码,[root@node1 ~]# cat /var/jenkins_home/secrets/initialAdminPassword
在这里插入图片描述
3、进入插件安装页面,安装插件默认是国外网址,先改成国内网址,再安装推荐的所有插件即可。

/var/jenkins_home/updates/default.json  里面默认是国外网址,插件下载慢
#把 “ www.google.com ”  改成  “ www.baidu.com ”
#全局搜索 “ updates.jenkins-ci.org/download ” 替换成 mirrors.tuna.tsinghua.edu.cn/jenkins
cd /var/jenkins_home/updates
sed -i 's/https:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json 
sed -i 's/https:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json

在这里插入图片描述
部分插件安装失败不用管,直接点击继续
在这里插入图片描述
4、插件安装完毕,注册登录账户
在这里插入图片描述
5、配置实例的地址
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
6、下载更新插件
插件下载慢问题解决,Manage Plugins点击Advanced,把Update Site改为国内插件下载地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
带感叹号!的,说明插件下载完成等待重启安装
在这里插入图片描述
在这里插入图片描述
检查插件配置,比如要使用的gitlab、docker、webhook之类的。没有的话,需要勾选下载,所有插件都更新到最新版本。
在这里插入图片描述
在这里插入图片描述
插件安装完重启,重启容器会挂掉,再启动容器就好了,重启后再次网页登入

[root@node1 updates]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@node1 updates]# docker ps -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED       STATUS                      PORTS     NAMES
c18bf132384c   jenkinsci/blueocean   "/sbin/tini -- /usr/…"   2 hours ago   Exited (5) 31 seconds ago             reverent_gould
[root@node1 updates]# docker start c1

在这里插入图片描述
7、创建流水线工程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

pipeline {
    
    agent {
     docker 'maven:3.3.3' }
    stages {
    
        stage('build') {
    
            steps {
    
                sh 'mvn --version'
            }
        }
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
双击进入此页面,右上角可叉掉
在这里插入图片描述
在这里插入图片描述

4、Jenkins使用

Jenkins基本指令,可参照官网学习,https://www.jenkins.io/zh/doc/pipeline/tour/hello-world/
Jenkins Pipeline(或简称为 “Pipeline”)是一套插件,将持续交付的实现和实施集成到 Jenkins 中。持续交付 Pipeline 自动化的表达了这样一种流程:将基于版本控制管理的软件持续的交付到您的用户和消费者手中。
Jenkins Pipeline 提供了一套可扩展的工具,用于将“简单到复杂”的交付流程实现为“持续交付即代码”。Jenkins Pipeline 的定义通常被写入到一个文本文件(称为 Jenkinsfile )中,该文件可以被放入项目的源代码控制库中。
1、创建流水线任务(Hello,Jenkins)
在这里插入图片描述

pipeline {
    
    agent {
     docker 'maven:3.3.3'}  // agent定义环境,这里可理解为docker run
    stages {
    
        stage('Build') {
     
            steps {
    
                // 具体的执行逻辑 shell命令
                sh 'mvn -version'
            }
        }
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果出现了错误,就会出现红色报错。

pipeline {
    
    agent {
     docker 'maven:3.3.3'}  // agent定义环境,这里可理解为docker run
    stages {
    
        stage('Build') {
     
            steps {
    
                // 具体的执行逻辑 shell命令
                sh 'mvn -version'
                sh 'docker version'  //会报错,启动的容器里面没有docker
            }
        }
    }
}

在这里插入图片描述
在这里插入图片描述
2、重试retry、超时timeout
将agent环境修改为any(any是默认的linux环境)

pipeline {
    
    agent any
    stages {
    
        stage('Deploy') {
       //Deploy部署,不是Build构建了
            steps {
    
                // 重试,连续执行多次,如果不成功就停止了。
                retry(3){
      //重试3次就停止了
                    sh './start.sh'  // 测试脚本
                }
            }
        }
    }
}

在这里插入图片描述

pipeline {
    
    agent any
    stages {
    
        stage('Deploy') {
       //Deploy部署,不是Build构建了
            steps {
    
                // 超时,超过预期的时间,就会自动终止。支付、回调等场景。
                timeout(time: 10,unit: 'SECONDS'){
      //分钟 MINUTES
                    sh './health-check.sh' // 测试脚本
                }
            }
        }
    }
}

在这里插入图片描述

pipeline {
    
    agent any
    stages {
    
        stage('Deploy') {
       //Deploy部署,不是Build构建了
            steps {
    
                // 超时,超过预期的时间,就会自动终止。支付、回调等场景。
                timeout(time: 10,unit: 'SECONDS'){
      //分钟 MINUTES
                    sh 'ping www.baidu.com' 
                }
            }
        }
    }
}

在这里插入图片描述
3、钩子函数post,生命周期的函数
pipeline 执行到某个步骤的时候,来做一些事情。

pipeline {
    
    agent any
    stages {
    
        stage('Test') {
     
            steps {
    
         		sh 'testfail'  //没有此命令会执行失败
            }
        }
    }
    // 钩子函数,比如执行结果不同,我们可以处理一些善后工作
    post {
    
    	// 行为
    	always {
    
    		echo 'always'
    	}
    	success {
    
            echo 'success'
    	}
    	failure {
    
    		echo 'failure'
    	}
    	unstable {
    
    		echo 'unstable'
    	}
    	changed {
    
    		echo 'changed'
    	}
    }
}

在这里插入图片描述

pipeline {
    
    agent any
    stages {
    
        stage('Test') {
     
            steps {
    
         		sh 'echo  11'  //成功执行
            }
        }
    }
    // 钩子函数,比如执行结果不同,我们可以处理一些善后工作
    post {
    
    	// 行为
    	always {
    
    		echo 'always'
    	}
    	success {
    
            echo 'success'
    	}
    	failure {
    
    		echo 'failure'
    	}
    	unstable {
    
    		echo 'unstable'
    	}
    	changed {
    
    		echo 'changed'
    	}
    }
}

在这里插入图片描述
4、定义执行环境agent,将agent环境修改为any(any是默认的linux环境)
agent 指令告诉Jenkins在哪里以及如何执行Pipeline或者Pipeline子集。所有的Pipeline都需要 agent 指令。在执行引擎中,agent 指令会引起以下操作的执行:
1、所有在块block中的步骤steps会被Jenkins保存在一个执行队列中。 一旦一个执行器 executor 是可以利用的,这些步骤将会开始执行。
2、一个工作目录workspace(/var/jenkins_home/workspace) 将会被分配, 工作空间中会包含来自远程仓库的文件和一些用于Pipeline的工作文件。
在Pipeline中可以很容易的运行 Docker 镜像和容器。 Pipeline可以定义命令或者应用运行需要的环境和工具, 不需要在执行代理中手动去配置各种各样的系统工具和依赖。这种方式可以让你使用 Docker容器工具包 中的任何工具。

pipeline {
    
    agent {
    
        docker {
     image 'node:7-alpine' }
    }
    stages {
    
        stage('Test') {
    
            steps {
    
                sh 'node --version'
            }
        }
    }
}

在这里插入图片描述

如果是其他环境,就配置其他的运行镜像即可,默认any(linux环境)。
pipeline{
    
    agent {
    
        docker {
     image '***:version' }
    }
    stages{
      
        // 执行步骤
        dockerfile
        dockercompose
        shell
        其他程序相关的命令
        .....
    }
}

5、环境变量environment
全局的环境变量,在所有的 steps 步骤都可以使用。像linux中profile文件、docker --env都是定义环境变量的。很多命令会使用环境变量,可以在这里定义。

pipeline {
    
    agent any 
    // 环境变量的定义
    environment{
    
    	DB_ENGINE = 'sqlite'
    	DB_PASSWORD='123456'
    }   
    stages {
    
        stage('Build') {
    
            steps {
       // 在steps步骤中使用环境变量
                sh 'echo $DB_ENGINE'
                sh 'echo $DB_PASSWORD'
            }
        }
    }
}

在这里插入图片描述
6、多步骤

// 最外层 pipeline
pipeline {
    
	// agent 环境
    agent any
    // 步骤集合
    stages {
    
    	// 分步骤
        stage('Build') {
      // 构建项目
        	// 具体的步骤
            steps {
    
                // 具体的执行逻辑 shell命令
                sh 'echo Build'  // Dockerfile、构建相关工作
            }
        }
        
        	// 分步骤
        stage('Test') {
      // 测试项目
        	// 具体的步骤
            steps {
    
                // 具体的执行逻辑 shell命令
                sh 'echo Test'   // shell测试、web测试、压测
            }
        }
        
        // 分步骤
        stage('Deploy') {
      // 部署
        	// 具体的步骤
            steps {
    
                // 具体的执行逻辑 shell命令
                sh 'echo Deploy'   // 访问、集群、liunx
            }
        }
    }
}

在这里插入图片描述
在这里插入图片描述
7、人工确认
通常在阶段之间,特别是不同环境阶段之间,可能需要人工确认是否可以继续运行。 例如,判断应用程序是否在一个足够好的状态可以进入到生产环境阶段。 这可以使用 input 步骤完成。 在下面的例子中,“Sanity check” 阶段会等待人工确认,并且在没有人工确认的情况下不会继续执行。

pipeline {
    
    agent any
    stages {
    
  
        stage('Deploy - Staging') {
    
            steps {
    
                echo 'curl '
            }
        }

        stage('Sanity check') {
    
            steps {
    
            	// 人工确认
                input "Does the staging environment look ok?"
            }
        }

        stage('Deploy - Production') {
    
            steps {
    
               echo 'Deploy - Production'
            }
        }
    }
}

在这里插入图片描述
在这里插入图片描述

5、webhook触发器

构建触发器,自动触发构建执行,有一个 webhook 触发器。测试环境关闭防火墙让容器之间互通。
逻辑:提交代码后,jenkins能够自动感知到代码提交了,流水线工程(项目打包,构建镜像,运行容器,测试接口,人工确认,部署上线)就会自动执行。
开发git提交代码push推送到仓库gitlab,仓库gitlab绑定jenkins触发器webhook,jenkins触发器webhook检测到仓库gitlab代码发生变化,会自动执行jenkins的流水线任务(pipeline)。在cicd链上,部署、测试脚本都要提前写好,一次写好,终身运行。
在这里插入图片描述
在这里插入图片描述
jenkins就发出了一个触发器命令,需要gitlab代码仓库那边配置触发
gitlab账户允许配置
在这里插入图片描述
项目中配置webhook
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、流水线项目

流水线项目官方文档:https://www.jenkins.io/zh/doc/tutorials/build-a-java-app-with-maven/
1、clone克隆GitHub示例仓库到本地,然后push到自己的gitlab仓库中

git clone https://github.com/jenkins-docs/simple-java-maven-app.git
mv simple-java-maven-app simple-java-maven-app2
git clone http://10.1.1.118:8888/root/simple-java-maven-app.git
cp -r simple-java-maven-app2/* simple-java-maven-app/

cd simple-java-maven-app
git add .
git commit -m "add"
git push -u origin master

在这里插入图片描述
在这里插入图片描述
2、在 jenkins 创建流水线项目 simple-java-maven-app
在这里插入图片描述
在这里插入图片描述
配置绑定git
在这里插入图片描述
添加git仓库登录凭证
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试构建
在这里插入图片描述
在这里插入图片描述
Docker maven构建很慢,需要配置镜像加速,可以自己定义settings文件,然后识别。
编写一个 settings.xml 放到项目下

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <mirrors>
	<mirror>
      <id>nexus-aliyun</id>  
      <mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>  
      <name>Nexus aliyun</name>  
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>  
    </mirror>
  </mirrors>
</settings>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改 Jenkinsfile,指定我们自己写的 settings.xml

pipeline {
    
    agent {
    
        docker {
    
            image 'maven:3-alpine'
            args '-v /root/.m2:/root/.m2'
        }
    }
    stages {
    
        stage('Build') {
    
        	// 在原来的基础上增加 -gs settings.xml 指定我们的配置
            steps {
    
                sh 'mvn -B -gs settings.xml -DskipTests clean package'              
            }
        }
    }
}

在这里插入图片描述
提交到远程,再次测试构建
在这里插入图片描述
在这里插入图片描述
开发提交代码后,自动构建并运行测试。
在这里插入图片描述
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ma1782072/article/details/135080133

智能推荐

PHP开发——Web的世界_php web开发-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏10次。这篇关于PHP的文章主要介绍了PHP的特性以及其在Web开发、CMS系统、电子商务和数据库连结等应用场景。随着云平台、开发工具和移动应用程序等技术的不断发展,PHP将进一步提高其应用广度和深度。未来的PHP将支持更多的技术,并且将成为与Web开发工具、数据库技术、云平台、移动应用程序等相关的技术。此外,PHP未来的发展将更加高效和易用,使其更适合处理大量数据和请求,并充分考虑用户界面和易用性。_php web开发

windows启动tomcat闪退_tomcat windows闪退-程序员宅基地

文章浏览阅读1.2w次。现象:windows下双击tomcat\bin\startup.bat时闪退原因:缺少环境变量导致解决方法:打开编辑tomcat\bin\startup.bat,头部加入以下代码,一个是JAVA目录,一个是Tomcat目录SET JAVA_HOME=C:\Program Files\Java\jdk1.6.0_39SET TOMCAT_HOME=D:\hunk\work\apache-tomcat_tomcat windows闪退

数组内存存储_64位平台数组内存-程序员宅基地

文章浏览阅读201次。数组内存存储1. 基本类型数组的初始化2. 引用类型数组的初始化1. 基本类型数组的初始化 int[] array; array = new int[5]; for (int i = 0 ; i<array.length;i++){ array[i] = i + 1 ; } System.out.println(Arrays.toString(array));内存分析:2. 引用类型数组的初始化//定义Person类class Person{ private S_64位平台数组内存

Vue 食用指南-程序员宅基地

文章浏览阅读738次,点赞13次,收藏16次。本文记录了 Yukiii 学习 Vue 期间的心得和相关功能的具体实现及 Vue 的基本使用方法,方便后续开发时的查阅~

【Android】高版本访问网络失败问题,解决方法整合_android eperm (operation not permitted)-程序员宅基地

文章浏览阅读6.4k次,点赞3次,收藏25次。报错各种问题,真的很烦java.net.SocketException: socket failed: EPERM (Operation not permitted)java.net.SocketException:socket failed:EACCES (Permission denied)java.io.IOException: Cleartext HTTP traffic to 10.0.2.2 not permittedD/Netw at java.net.Socket.creat_android eperm (operation not permitted)

p88 SRC挖掘-拿下CNVD证书开源&闭源&售卖系统_ihsdus.cn-程序员宅基地

文章浏览阅读826次,点赞2次,收藏9次。SRC挖掘-拿下CNVD证书开源&闭源&售卖系统_ihsdus.cn

随便推点

软件测试全网最全复习总结-别杠,杠就是你对_软件规范化和标准化的原因不包括-程序员宅基地

文章浏览阅读1.1w次,点赞104次,收藏452次。今天仍然拼命看书,因为明天就要考了。学期的成绩就全仗这两天挣,现在更感到考试无用与无聊。——季羡林文章目录概述软件测试分类及流程黑盒测试等价类划分边界值分析法决策表法正交测试法极差法方差法白盒测试单元测试集成测试国际化和本地化测试可靠性测试测试与质量分析报告_软件规范化和标准化的原因不包括

iOS —— use_frameworks! 作用-程序员宅基地

文章浏览阅读1.3k次。通过cocoapods管理应用程序时,在Podfile文件中,**use_frameworks!*cocoapods会生成对应的 frameworks 文件 在Link Binary With Libraries:会生成Pods_工程名.framework,包含了其它用cocoapods导入的第三方框架的.framework文件1、纯OC项目中,通过cocoapods导入OC库时,一般都不使用use_frameworks!2、纯swift项目中,通过cocoapods导入swift库时,必须使用u..._use_frameworks!

Python菜鸟晋级04----raw_input() 与 input()的区别_pycharm没有raw input-程序员宅基地

文章浏览阅读2.5k次。raw_input() 与 input()均是python 的内建函数,通过读取控制台的输入与用户实现交互。但他们的功能不尽相同。举两个小例子>>> raw_input_A = raw_input("raw_input: ")raw_input: abc >>> input_A = input("Input: ")Input: abcTraceback (most recent ca_pycharm没有raw input

高通AR增强现实多卡识别和扩展跟踪Unity_imagetarget扩展追踪-程序员宅基地

文章浏览阅读1k次。只需修改ARcamera上的Max Simutaneous Tracked Images 的值就好了。初始是1,默认只能识别一张图。 扩展跟踪是一个更简单的事情,高通把这个功能封装成了ImageTarget的一个属性 Extended Tracking,只要将其勾上就可以了._imagetarget扩展追踪

对于三星手机的手工root方法-程序员宅基地

文章浏览阅读172次。现在很多一键化的root工具,但是仍然有不少的三星手机是无法用全自动方式进行root的,这时候,我们可以选择使用手工的方式进行root,本文章对手工root的一些方法进行一些介绍。   常规方法:..._三星手机用面具root

2021年佛山高考成绩查询,2021年高三佛山一模,看佛山高中排名-程序员宅基地

文章浏览阅读1.7k次。原标题:2021年高三佛山一模,看佛山高中排名2021年1月11日佛山进行了新高考改革后第一次佛山一模考试,作为高考风向标,各高中的成绩具有很大参考意义。结合2018年中考录取分数、2021年佛山一模、2020年佛山一模对佛山56所高中进行简要分析,从而展望2021年高考。 1-10名石门中学稳居第一,佛山一中重夺第二,南海中学增长强劲,顺德一中略显颓势,李兆基中学增长强劲,郑裕彤中学加工能..._佛山国华纪念中学2021年高考成绩

推荐文章

热门文章

相关标签