这2个函数可以用于Jenkins打包脚本中

iOS

android

上篇 编译cocos2dx项目

不足

你一定会想,真实的打包环境可比这复杂多了,我要这样那样,希望通过参数来解决

为任务添加参数化构建

  • 打开任务
  • 在General中,勾选”参数化构建”
  • 点击添加参数
  • 这里参数种类很多,还可以通过插件扩展,挑几个讲
Boolean value 单选框
Choice 下拉框
String parameter 单行文本
List Subversion tags (and more) SVN tag

添加压缩图片选项(Boolean value)

  • 下载pngquant,确保/usr/local/bin/pngquant可以访问
  • 添加Boolean value
  • Name:Optimize,Default Value:勾选, Description:压缩PNG图片

添加平台选项(Choice)

  • 添加Choice
  • Name:Platform,Choices:ios/android/all(一行一个), Description:目标平台

添加编译选项(String parameter)

  • 添加String parameter
  • Name:Configuration,Default Value:debug,Description:编译选项

添加SVN Tags选项(List Subversion tags)

  • 添加List Subversion tags(and more)
  • Name:Tag,Tags filter:^tags/.*$,Maximum tags to display:10,勾选Sort newest first
  • Repository URL:svn://127.0.0.1/testjenkins
  • Credentials选择一个账号密码
  • 修改源码管理中的Repository URL:svn://127.0.0.1/testjenkins/$Tag

修改脚本

执行任务

在首页点击任务名称
点击左侧”Build With Parameters”
配置参数
点击”开始构建”

最后依照你的项目和喜好 配置属于你项目的脚本吧

配置环境

macOS 10.12.3
cocos2dx 3.10
Jenkins 2.32.3
Xcode 8.2.1

创建Cocos工程

cocos new -l cpp testjenkins

配置编译环境/证书/签名

包括NDK,安卓SDK,ANT,苹果开发者证书,共享Schema,安卓签名
这一步大家自行挥发就好,确保最后cocos compile可以使用

将工程传到SVN上

假设路径为 svn://127.0.0.1/testjenkins/trunk

创建Jenkins任务

  • 进入Jenkins,点击左侧”新建”,输入任务名称
  • 这里有很多模板,我们选择”自由风格项目”

配置Jenkins任务

这里可以看到有很多步骤,我们一个个来

源码管理

  • 选择Subversion
  • Repository URL填svn://127.0.0.1/testjenkins/trunk
  • Credentials中点击右侧Add,添加一个svn账号密码
  • 其他默认就好

构建

  • 点击”增加构建步骤” 选择”Execute shell”
  • 输入 “/Applications/Cocos/Cocos2d-x/cocos2d-x-3.10/tools/cocos2d-console/bin/cocos compile -p android”
  • 注意,如果不在jenkins中配置环境变量,cocos需要配置绝对路径

最后点击保存

执行任务

在首页点击任务名称
点击左侧”立即构建”
可以在Build History中看到正在执行的任务和过往记录
点击Console Output可以看到控制台输出的日志

最后有没有成功呢

Jenkins

Jenkins是一款基于Java的持续化集成工具

下载与安装

LTS是稳定版 Weekly是尝鲜版

  • 下载后得到一个jenkins.war
  • 使用命令java -jar jenkins.war启动服务
  • 在浏览器中输入http://localhost:8080/
  • 第一次启动,会验证合法性,打开红底的文件,将其中的初始化密码粘贴到文本框中
  • 接下来是安装插件,可以安装推荐的插件,也可以自己手动选择,管理界面也可以下载安装插件
  • 等待一段时间后,创建管理员账号密码

扩展

1. 编译cocos2dx项目
2. 参数化构建

Subversion

subversion简称svn,svn和git是常用的版本控制工具,用于多人并行开发,项目管理

目录结构

一般来说,一个项目的svn目录下会有trunk,branches,tags三个文件夹

trunk

主干,大部分人,大部分功能都在此开发

branches

分支,有大改动,或者需要bugfix时,从trunk或者tag上拉分支开发

tags

标签,此目录只允许添加,不允许修改
一般是打包前从trunk或者branch上拉tag
用于2个版本diff和问题追查

流程

主干开发

  • 所有人员在trunk开发
  • 提交前先更新,解决好代码冲突

分支开发

  • 从trunk上拉branch,部分人员在branch上开发
  • 开发完成后,如需分支上线,则从分支拉tag
  • 如需要合并到主干,提交后,切换到主干,然后merge from branch,解决好冲突再提交

发布版本

  • 从trunk或者branch上拉tag,tag路径上最好带上版本号
  • check out tag并发布/使用自动化工具发布,如Jenkins

bugfix

  • 从tag上拉branch,branch路径最好能体现版本号及用途(如bugfix_1.0.1.2)
  • 参与bugfix的人员在branch上开发
  • bugfix完成后,版本号上升,按发布版本流程
  • 切换到主干,然后merge from tag,解决好冲突并提交

事情的起因是这样的…

iOS10即将发布,晚上逛网站,突然发现一篇新闻安全大过天iOS应用将必须支持ATS安全标准

好嘛,这简直不让人玩了
现在开发iOS9的APP都必须在Info.plist里加入App Transport Security Settings -> Allow Arbitrary Loads == YES
否则http请求都不允许你发

对用户来说是好事,对开发者来说就…

先说一下HTTPS为何物
简单来说,HTTPS(Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,是HTTP的安全版
即HTTP下加入SSL层,HTTPS的安全基础是SSL

用户安全了,你们的所有请求都被保护起来了
开发者就头疼了,https证书是收费的,企业级的应用该用上早用上了,个人开发者怎么活呀…

解决方案一:自行颁发证书(速成请直接看方案二)

在Linux/Unix/OSX下,HTTPS的SSL证书可以自行颁发

安装带SSL的nginx

我用yum装的时候nginx是带ssl的,所以请自行百度

然后配置nginx.conf,像我一样稀里糊涂不清楚具体位置可以输入nginx -V找到nginx.conf的位置

大致配置修改如下,修改前建议备份一下老配置

重启nginxsystemctl restart nginx

如果出现ssl模块的问题,则需要重新编译安装nginx,请自行百度

解决方案一的缺陷

现在你可以通过https访问你的网站了,但是你的证书浏览器可不认识
它们一般会向用户发出警告:

嘿,这个网站看起来像个假的,你的信息有可能被泄露,还要继续吗?

OMG!小白用户直接被吓走了好嘛…(此时你一定在想:我一步步照做,你竟然给我看这个?)

解决方案一的改进(这里必须step by step做)

由此可以看见,证书是解决方案一的症结,如何申请让各大浏览器爷爷都认可的证书呢?
我用的是StartSSL

由于每个人情况不同,我这里只讲我用到的所有东西,尽量不遗漏
1. dnspod.cn
2. 腾讯企业邮 添加webmaster@yourdomain.com的用户,准备接受验证码
3. 一台电脑(你:这个我有,不要你讲)

先去StartSSL注册个账号,会发送一个验证码给你邮箱,如果收不到找找你的垃圾邮件里有没有
注册好之后,找到Validations Wizard选择Domain Validation (for SSL certificate)
填入你的域名,然后这里需要验证你的邮箱,我选择的是webmaster@yourdomain.com,这就是一开始让你准备企业邮箱的原因(当然也有别的企业邮箱,据说网易的也不错)
然后邮箱又会收到一个验证码,最后你就验证完了
但是!又是但是,他提示我们这个验证只有90天,之后需要重新验证,这个我还没到90天,我不知道到了之后会有什么样的灾难发生

然后跳到Certificates Wizard选择Web Server SSL/TLS Certificate
在Validated domain(s)中填入你要的域名,比如hello.yourdomain.com
下面的CSR文件,选择Generated by Myself (.cer PEM format certificate)
这里提供了Windows的方法和Linux/Unix的方法
1. Windows用户请直接下载那个exe
2. Linux/Unix输入

最后,Windows下直接记事本打开.csr文件,Linux/Unix下直接cat,把文本黏贴到网页上

最后跳到的网页,会让你click here一定别忘了点
下载下来是一个zip包,打开是4个zip包,找到NginxServer.zip,里面有个hello.yourdomain.com_bundle.crt文件(还好这次不是zip包了,否则就变俄罗斯套娃了)

利用我们这次得到的hello.yourdomain.com_bundle.crt文件和yourdomain_nopwd.key替换解决方案一里面nginx.conf的2个文件就可以了

解决方法二(其实并没有,耐心点看吧,为了孩子)

0. 需求

有两台机器,A和B,A机需要通过ssh访问B机

1. 在A机上生成公钥/密钥

然后输入保存路径,密码,重复密码
没有特殊需求直接敲3个回车就行了

2. 在A机上把公钥拷贝到B机

用scp将公钥拷贝到B机的root目录下

3. 在B机上将公钥添加到.ssh/authorzied_keys中

4. 在A机登录B机

不出意外就直接登陆上去了

5. 如果出了意外

试着删除A机中.ssh/known_host中对应的项目再试一次(我遇到过一次)

这条命令是找出所有带”java”的进程,然后排除”grep java”的进程,然后取第一位进程号,挨个kill -9

SimpleDateFormat

SimpleDateFormat是一个性能十分低下的工具类,滥用SimpleDateFormat十分容易导致性能问题
错误的示范:

错误的解决办法

如果将SimpleDateFormat写成static的,就可以避免重复创建,但是SimpleDateFormat又是线程不安全的,如果将其设成synchronized,性能又变差了

优雅的解决办法

比较优雅的做法是用ThreadLocal

网上的例子大多只支持一种格式

支持任意种格式的DateUtil

我稍加修改,现在多了一个format参数,具体代码

很久很久以前

刚从业时,是做Java后端的
我们知道Integer是int的包装类,2个int类型的值是可以通过a == b来进行比较的
于是想当然以为Integer也是可以这么比较

一次事故就要开始

一个简单的充值验证,需要比较充值数额是否相等,用的Integer类
我们测试的时候用的是1块钱(10金币),比较金币拿了2个Integer来做==判断
10金币顺利通过测试,100金币也是,随之上线

事故的爆发

产品上线后,从后台查询发现,只有10金币和100金币的充值记录(但按经验看来是不合理的)
也有玩家陆续反应100块(1000金币)充值失败

原因

Java中<128的Integer取的是常量,内存地址是一样的,>=128时,则是重新开辟了一块内存
又因为==是比较内存地址用的,比较值相等应该用a.equals(b)

测试代码

输出