配置
在项目根目录,新建.styleci.yml
配置文件,并编写配置内容:
1 | preset: psr2 |
查看
打开https://styleci.io/,使用Gitlab账号登录,找到对应的项目,点击右侧的 ENABLE STYLECI
启用按钮,即可使用,
每次提交代码,都会看到检测结果
提示
如果没有找到自己的项目,打开 https://styleci.io/account#repos
点击 Sync With GitHub
同步,就会看到
清净无为
在项目根目录,新建.styleci.yml
配置文件,并编写配置内容:
1 | preset: psr2 |
打开https://styleci.io/,使用Gitlab账号登录,找到对应的项目,点击右侧的 ENABLE STYLECI
启用按钮,即可使用,
每次提交代码,都会看到检测结果
如果没有找到自己的项目,打开 https://styleci.io/account#repos
点击 Sync With GitHub
同步,就会看到
公司的GitLab中,有一个存放所有技术文档的Wiki仓库,按照目录分门别类,包括API文档,编码规范,技术专题文档等,通过与Gollum进行持续部署.
然而在GitLab中,每个项目都有自己的Wiki库, 所以在将项目文档合并更新到总Wiki仓库时,同步更新比较麻烦,通过充分使用GitLab的持续集成功能, 将项目Wiki与Wiki仓库集成, 从而实现了Wiki的自动部署,
同步时,自动同步的提交信息和提交人信息
GitLab中在使用SSH的时候, 会生成公钥和私钥对
将公钥添加到gitlab上, 以便于该用于可以拉取代码
在 CI/CD Piplines
中设置 Secret Variables
, 这里名为 SSH_PRIVATE_KEY
SSH_PRIVATE_KEY
值为私钥.
.gitlab-ci.yml
文件, 注入私钥, 通过ssh
执行远程命令 创建一个分支, 如docs
, 在该分支中添加 gitlab-ci.yml
文件, 实现wiki自动提交, 内容形如以下内容:
1 |
|
其中, 将WIKI_REPO
后面的`git@domain.com:project.wiki.git替换为项目wiki的git地址,
$CI_PROJECT_NAME`替换为项目英文别名(如不改则使用当前GitLab的项目名), 用于在文档中心的api下面创建相关目录。
其他地方不需要修改。
注意: 项目wiki的git地址与项目的git地址不相同, 请在Wiki右侧中的Clone repository 找到
打开项目的 CI/CD Pipelines 选项, 找到 Triggers
, 点击添加一个Token, 并从下方的 Use webhook
段落找到触发URL, 如
https://domain.com/api/v4/projects/74/ref/REF_NAME/trigger/pipeline?token=TOKEN
将TOKEN替换为上述Triggers
中获取的Token, 将 REF_NAME
替换分分支名称 docs
, 得到最终URL
打开项目的 integrations 选项, 在URL中, 填写上一步中拿到的URL
在GitLab-CI中,使用artifacts
可以确保所需要传递的文件可靠性,但由于生成的artifacts
存在的GitLab上,每次需要远程下载,因此速度相对较慢。
所以,在一些对依赖的准确性要求不高的地方,可以考虑使用cache
。
cache 顾名思义为缓存,不同的任务之前,缓存可以进行共享。根据配置中的声明,在需要缓存时,GitLab-CI会自动下载缓存,以供当前任务使用。
cache一旦命中,意味着这部分文件不需要重新生成(编译,下载或构建),这样一来,便省去了不少功夫,从而加速了构建过程。
1 |
|
如上,在build-package任务中,声明了cache,其目录为vendor, 当script执行完之后,vendor目录会生成,该任务最后,cache会自动生成(push)
1 |
|
如上,该过程定义了所要使用的cache, 由于cache并不保证每次都命中(即拿到的cache可能为空),周时在script处进行判断,如果cache为空时,重新生成所需文件
以doctor-online为例子,在未使用cache之前 ,使用的是artifacts, 每次构建时间在7分钟左右,
使用cache后,构建时间缩短到了1分钟
最近接触了一个抽奖的项目,由于用户量比较大,而且第三方提供的认证接口并发量有限,为了保证服务的高可用性,所以对高并限制发有一定的要求。经过一系列研究和讨论,做出了以下一些优化方案。
根据用户量和日活情况,估算出并发值在100左右,所以该项目的并发量就当在100上以,初期目标定为600-800
特定页面的并发量不超过300,为了保证不对第三方服务造成访问压力,特将并发控制在150以内
由于奖品数量有限,故得奖时,需要进行并发写入控制,防止奖品超发
使用CDN对网站的静态资源进行优化,可以答复静态请求次数。
抽奖结果一次性生成。
每个用户有有一次抽奖机会,但只能有一次中奖,其他两次随机弹出推荐产品。所以有一次抽奖中,只需要访问一次服务器的抽奖接口。
将抽奖次数,是否中奖等信息记录在本地,避免超次抽奖和多余的服务器请求。例如,一旦该用户中过将,就不需要再访问服务器抽奖接口。
将页面和相关数据查询进行缓存,减少数据库访问次数。
对于不需要实时处理的业务逻辑,压入队列,实现异步处理。例如优惠券的发放。
使用 worker_processes
,worker_cpu_affinity
,worker_rlimit_nofile
, worker_connections
,open_file_cache
等命令,提高nginx的处理性能。
先看实例,如下:
1 | limit_req_zone $binary_remote_addr zone=req_ip:10m rate=40r/s; // #每个IP平均处理的请求频率为每秒40次 |
在这里,限制了每个IP的请求频率,限制了同一IP的并发连接数,限制了服务器的总连接数
配置 nginx, 使用负载均衡
1 | upstream icontact_pool { |
如上,通过 Docker 启动多个处理请求的服务容器,在 nginx 中配置每个服务的地址,权重等信息,扩大请求的处理能力
例如,增加服务器配置(CPU,内存,带宽),如果是PHP, 开启 opcache, 并使用较新版本(php7+), 各种依赖尽量使用最新版本。
1 | zend_extension=opcache.so |
按照以往的做法,你会使用hexo来生成博客的静态文件,并通过git提交到github上,以此来写作和发布文章。
然而,经过一段时间,你会发现,这种写作方式存在几个问题:
鉴于以上几个问题,结合Travis-CI的使用经验,我决定对往常的写作方式进行改进:
除了原来博客中的master分支, 再新建两个分支:docs分支用于存放文章源:hexo分支用于存放一些配置文件,我们将在该分支上进行持续部署。
该分支下存放文章源,各篇均以markdow格式书写。除此之外,有 .travis.yml
配置文件和一个触发部署的脚本 deploy.sh
。
每当有文章提交上来,就会自动触发一次构建,其内容是通过调用Travis-CI的API,自动执行一次 hexo 分支上的自动构建。
该分支存放一些hexo的配置文件,当构建被触发时,会自动拉取docs中的文章内容,安装一个material皮肤,并进行hexo的自动网站编译。
最后编译完的静态Html,强制推送到master分支,从而博客自动更新。
Code Climate 是一个代码测试工具, 它可以帮助你进行代码冗余检测、质量评估,同时支持多种语言,如PHP, Ruby, JavaScript, CSS, Golang, Python 等。
1 | [[runners]] |
注意, 需要增加一个 /tmp/builds:/builds
, 这里用于映射放代码。否则根据官方文档中的描述,无法正常实现
为了能使用宿主机的docker 缓存, 加快构建速度, 这里使用 sock 绑定的方式使用docker, 不使用 docker in docker
1 | codeclimate: |
1 | engines: |
相关配置请参考官方文档
rsync命令是一个远程数据同步工具
-r 递归目录
-t 保留修改时间
-v 详细日志
-h 输出数字以人类可读的格式
-z 在传输过程中压缩文件数据
-e 指定要使用的远程shell, 注意该过程需要注入SSH
1 |
|
远程服务器需要安装rsync, 否则会出现 bash: rsync: command not found
错误
LFTP是一款FTP客户端软件, 支持 FTP 、 FTPS 、 HTTP 、 HTTPS 、 SFTP 、 FXP 等多种文件传输协议。
本文介绍如何使用 LFTP 将文件同步到远程FTP服务器上, 从而实现自动部署
-R 反向传输, 因为是上传(put)到远程服务器, 所以使用该参数 (默认是从远程服务器下载)
-L 下载符号链接作为文件, 主要处理文件软链接的问题
-v 详细输出日志
-n 只传输新文件 (相同的旧文件不会传输, 大大提升了传输效率)
–transfer-all 传输所有文件, 不论新旧
–parallel 同时传输的文件数
–file 本地文件
–target-directory 目标目录
1 | deploy: |
PHPMD是与PMD类似的静态代码分析工具, 通过分析可以找出潜在的Bug或设计问题, 从而进一步提高代码质量
1 | composer require phpmd/phpmd --dev --prefer-dist |
1 | vendor/bin/phpmd ./ text phpmd.xml --suffixes php |
phpmd.xml配置如下:
1 | <?xml version="1.0"?> |
在.gitlab-ci.yml中添加一个任务, 用于执行静态分析, 一个典型的例子:
1 | phpmd: |
Fixtures 是测试中非常重要的一部分。主要目的是建立一个固定/已知的环境状态以确保 测试可重复并且按照预期方式运行。
简答说就是Fixtures提供一种预填充数据的方式,即在测试前需要准备好哪些数据,以便测试可以正常展开,不受其他测试的影响。
一个 Fixture 可能依赖于其他的 Fixtures ,所定义的依赖会自动加载。
该方法相比于dump.sql
的填充方法更加灵活, 且不会出去填充的冲突问题.
通过继成yii\test\ActiveFixture
, 并声明 modelClass
来定义一个Fixtures , depends
为要依赖的Fixtures, 可选。
Fixtures通常放置于tests
目录中的fixtures
目录下.
1 | <?php |
在 @tests/fixtures/data
目录中,每个Fixtures添加一个数据文档
在位置 @tests/fixtures/data/user.php
中, 设置以下数据, 为要被插入用户表中的数据文件, user1
和user2
为别名, 方便调用
1 | <?php |
在测试用例中, 通过定义_fixtures方法
, 声明需要使用的Fixtures及填充数据文件
1 |
|
通过如下方法, 可以获取插入的记录, 返回值为该Fixture类中对应的modelClass
的一个实例
1 | $user = $this->tester->grabFixture('users', 'default'); |