Java 程序的发布流程

之前的文章介绍了 Python 和 Nodejs  的发布流程,这里再说一下 Java 的,基本齐全了。

1. git 项目里需要一个 pom.xml 文件,用于打包。

为了区分 production、preonline 和 development,可以使用两种方式 – filtering 和 profile

1). 使用 filtering;

第一,在 pom.xml  里开启 filtering 功能:<filtering>true</filtering>

第二,在 pom.xml 的 build/filters/filter 里写上路径,用变量 env 来表示环境.

[text]
<build>

<filters>
    <filter>src/main/resources/filter.properties.${env}</filter>
</filters>

</build>
[/text]

第三,filter.properties.* 里面写各个环境的配置(比如数据库信息),此时用 mvn 打包:

[shell]mvn clean package -D maven.test.skip=true -Denv=production[/shell]

-D maven.test.skip=true 等同于 -Dmaven.test.skip,表示忽略测试代码。

2). 使用 profile.

类似下面的配置文件:

[text]
<profiles>
<profile>
<id>development</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<filters>
<filter>profile-development.properties</filter>
</filters>
</build>
</profile>
<profile>
<id>production</id>
<build>
<filters>
<filter>profile-production.properties</filter>
</filters>
</build>
</profile>
</profiles>
[/text]

打包命令类似

[shell]mvn clean package -D maven.test.skip=true -Pproduction[/shell]

用 -P 指定 profile 的 id,mvn 会使用对应的 profile,不指定 -P 的话,会使用 activeByDefault=true 的一项(即 development).

 

2. 把 war 包(或 jar 包等) post 到包管理系统,带入参数可以有 项目名、分支号、包名和机房(如果需要),发布的时候发布系统就可以知道发布的项目名,以及分支,以及下载链接(post 之后生成,放在数据库)。

 

3. 发布,拿到包,解压到机器上,放入 tomcat 的 webapp 目录,启动 tomcat.

 

此文有待继续补充。

 

参考:

https://spring.io/guides/gs/maven/

http://archboy.org/2012/05/21/apache-maven-profile-filtering-multiple-build-environments/

Python 程序的发布流程

记录一下 Python 的发布流程。


1.代码的项目里要求有 requirements.txt 文件。

可以使用 链接 中的 pip-tools 来生成 requirements.txt .

例如先在 requirements.in 写入

futures
ujson
tornado
DBUtils
jinja2
redis
MySQL-python

然后运行

pip-compile requirements.in

这个命令生成 requirements.txt,如下:

#
# This file is autogenerated by pip-compile
# Make changes in requirements.in, then run this to update:
#
# pip-compile requirements.in
#
backports.ssl-match-hostname==3.4.0.2 # via tornado
certifi==2015.4.28 # via tornado
dbutils==1.1
futures==3.0.3
jinja2==2.7.3
markupsafe==0.23 # via jinja2
mysql-python==1.2.5
redis==2.10.3
tornado==4.2
ujson==1.33

2.然后执行命令:

mkdir ./wheelhouse;
pip wheel -r requirements.txt -w ./wheelhouse/

在 ./wheelhouse 目录下生成了 .whl 格式的二进制依赖包.


3.把程序打包, 解压到机器上;


4.执行虚拟环境:

virtualenv .venv
source .venv/bin/activate

5.通过执行:

pip install --use-wheel --no-index --find-links=./wheelhouse/ -r requirements.txt

来安装二进制依赖文件.


6.启动程序即可.

Nodejs 的发布流程

nodejs 的发布流程和 Python 相比还要简单些,先看下面的流程:


1.要求在每个 nodejs 项目下面都有 package.json 文件。

package.json 是 本项目的依赖,用 npm install 会把依赖下载到本目录的 node_modules 下。

由于有线上环境和测试环境之分,可以用 npm install –production 或者设置环境变量 NODE_ENV 为 production 之后用 npm install 都只会安装 package.json 文件中 dependencies 的依赖,dependencies 即是线上环境。

否则 npm install 会把 dependencies 和 devDependencies 的依赖都装上,此时用于测试环境。


2.还要求项目下面有一个配置文件用于表示 NODE_ENV 、 PORT 和 LOG 环境变量。

把 NODE_ENV 环境变量写入文件的目的是为了正式环境和测试环境打不同的包,用一样的启动脚本,和 Java 的打包工具 maven 根据配置文件打不同的包的想法类似。

如果 NODE_ENV 是 production,表示只打 dependencies 的依赖,否则都打;PORT 只是用来表示启动端口;LOG 表示日志目录。

我们的配置文件格式如下:

{
    "node_env": "production",
    "port": 8080
}

3.打包。

来个打包脚本示例(封装一下启停脚本 start.sh、stop.sh,打在包里):

#!/bin/bash

project_url=""

export NODE_ENV=""

project_name=`echo $project_url |basename |sed "s/.git//g"`

git clone $project_url
cd $project_name

npm install && \
cd .. && \
cp start.sh stop.sh $project_name && \
tar czf $project_name-`date "+%Y%m%d%H%M%S"`.tgz $project_name

4.打包之后上传到远程服务器(打包应该支持分支选项,发布的时候会用到分支)。


5.开始发布,拿到上面打的包。


6.到目标服务器上解压,执行启动脚本(start.sh),启动脚本示例(使用 forever 启动,文档):

#!/bin/bash

cd $project_dir

export NODE_ENV=$_env
export PORT=$port
export FOREVER_ROOT=`pwd`

forever -l logs/access.log -e logs/error.log -o logs/out.log -a start -c "node –harmony" bin/www

最后,如果想限定依赖的版本 可以用 npm shrinkwrap ,但是发布流程要变,文档。