# 环境搭建帮助说明

-------------

## Jenkins 环境配置
> 前提:进入容器环境后启动了jenkins服务(启动命令:`service jenkins restart`),然后打开网页,根据提示注册修改登录账户,并安装推荐的默认插件。

### 系统管理

#### 系统设置

+ Jenkins Location -> 填写“系统管理员邮件地址”
+ 邮件通知
    - SMTP 服务器: `` (若使用的是QQ邮箱服务)
    - 用户默认邮件后缀: 如`@liankuan.top`
    - 勾选`使用SMTP认证`
    - 用户名: 填写你的邮箱地址(如: `xxxx@liankuan.top`)
    - 密码: 你的邮箱登录密码
    - 勾选`使用SSL协议`
    - SMTP端口: `465` (若使用的是QQ邮箱服务)
    - Reply-To Address: 填写你的邮箱地址(如: `xxxx@liankuan.top`)
    - 字符集: 使用默认`UTF-8`
    - [测试] : 勾选`通过发送测试邮件测试配置`,填入一个测试接收邮箱地址,然后点击`Test configuration`按钮,若测试发送邮件成功,则会显示'succeed',并且对应测试接收邮箱会收到一封测试邮件
+ **最后要记得点击页面左下角的保存按钮**

### 全局工具配置

+ JDK
    - 点击`JDK安装`按钮
        - 给JDK起一个别名,如`jdk1.8`
        - 去掉勾选`自动安装`
        - 在`JAVA_HOME`输入框中填写`/usr/local/java/jdk1.8.0_171`
+ Maven
    - 点击`Maven安装`按钮
        - 给Maven起一个名称,如`maven3.5.3`
        - 去掉勾选`自动安装`
        - 在`MAVEN_HOME`输入框中填写`/usr/local/maven/apache-maven-3.5.3`
+ **最后要记得点击页面左下角的保存按钮**

### 插件管理

+ 在选项卡中选择`可选插件`,搜索寻找`Maven Integration`插件并勾选,然后点击左下角"直接安装"按钮,跳转页面后等待该插件安装完毕

### 新建任务(即创建java项目)
+ 输入项目名,选择`构建一个maven项目`,然后点击`确定`按钮
+ 可选择填写`项目描述`
+ 源码管理
    - 勾选`Git`
        - Repositories
            - 在`Repository URL`输入框中输入项目的git地址
            - 点击`Credentials`右侧的`Add`按钮,选择`Jenkins`
                - 在弹出框中,在`Username`输入框输入你的`git账号---即对应绑定邮箱`
                - 在`Password`输入框中输入你对应的git账号密码
                - 点击`Add`按钮保存
                - 再在下拉框中选中刚刚新添的要使用的Git账户
        - Branches to build
            - 在`Branch Specifier (blank for 'any')`输入框中输入你要适应的代码分支,默认使用`*/master`分支(若你需要使用dev分在,则改为`*/dev`即可)
+ 构建触发器
    - 勾选`Poll SCM`,在日程表内输入`H/3 9-20 * * 1-5`,即表示每星期的周一至周五,9点到20点,每隔3小时自动检测构建代码
    - **可根据实际需要选择与定义,详细设置可自行百度**
+ Build
    - 在`Root POM`输入框输入Maven项目你要使用的`pom.xml`文件所在当前项目文件夹内的目录位置,如`cqt-frame/cqt-mdengine/pom.xml`
    - 在`Goals and options`输入输入`clean package`,用于自动构建项目的命令
+ 构建设置
    - 勾选`E-mail Notification`,并在`Recipients`输入框输入你的通知邮箱地址,即可开通项目代码构建结果反馈通知邮件
+ **最后要记得点击页面左下角的保存按钮**

### 构建项目
+ 在`我的视图`页面,在你要构建的项目栏的右边,点击`进行构建`的图标按钮进行构建
+ 此时左侧的`构建队列`即会显示当前项目代码构建的情况(*此时会收到项目构建失败的提示,后续解决方法请见下方`项目部署打包`*)

-------------

## 项目部署打包

+ 初始化运行打包项目时,因为需要引入第三方jar包,所以需要进行以下操作,打开容器命令窗口,输入以下命令:
    - `mvn install:install-file -Dfile="/var/lib/jenkins/workspace/你创建的项目名/cqt-frame/external_jar/FinTech_CS.jar" -DgroupId=FinTech_CS -DartifactId=FinTech_CS -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true`
+ 根据需要,可选择"本地运行"或"发布到远程服务器运行",具体参考以下步骤说明。

 

### 本地运行Jar包程序

+ 进入项目的“配置”管理页面,在`Post Steps`项,点击`Add post-build step`下拉框选择`执行Shell`
+ 在输入框中输入以下脚本,(前提是该sh脚本已存在该目录,若无则可执行`wget -N -P /root/ https://gitee.com/yjliankuan/LiankuanPublicPackage/raw/master/post_steps_v3.sh`,其中jar包完整名请填写实际生成的jar包名(后缀.jar不能省略),如"cqt-mdengine-0.0.1-SNAPSHOT.jar"),后保存即可

```
bash /root/post_steps_v3.sh "$WORKSPACE" "$JOB_NAME" "jar包完整名"
```
or
```
#!/bin/bash

if [ ! -d "/var/run/jar_home/version/" ]; then
    mkdir -p /var/run/jar_home/version/
fi

echo "WORKSPACE=$WORKSPACE"

cp -r $WORKSPACE/cqt-frame2/cqt-strategy/target/CQT.jar /var/run/jar_home/
echo "jar包复制到仓库 -- /var/run/jar_home/"

cp -r /var/run/jar_home/CQT.jar "/var/run/jar_home/version/CQT.jar.$(date +%Y%m%d%H%M%S)"
echo "jar包备份留档 -- /var/run/jar_home/version/"

status_file_list=`find /var/run/strategy_home/ -name "strategy.status"|grep -w "CQT"`
for file in $status_file_list; do
    echo "UPDATE" >> $file
done

```

+ 至此,后续自动构建打包,会自动运行生成对应jar包,并且会进行监听运行,若发现对应jar包停止(即对应进程消失),则系统会尝试再次启动,并发送邮件通知(具体逻辑在`jar_run_monitor.sh`脚本中)

 

### 自动部署到远程服务器运行Jar包程序

+ 对应远程服务器环境要求:
    - 已通过`centos7-init-ide.sh`初始化开发环境脚本安装了**init环境**,以及**JDK环境**
    - 目录文件`/root/control_jar_from_java.sh`已存在(下载可直接执行命令:`wget -N -P /root/ https://gitee.com/yjliankuan/LiankuanPublicPackage/raw/master/control_jar_from_java.sh && chmod 755 /root/control_jar_from_java.sh`)
+ 系统管理->插件管理->可选插件,搜索`publish over ssh`,然后勾选安装
+ 返回到系统管理->系统设置,在`Publish over SSH`配置区按要求填写信息
    - 点击新增`SSH Servers`,在显示的SSH Servers配置表单里填写即可
    - `Name`: 自定义标识服务器别名
    - `Hostname`: 远程服务器ip地址
    - `Username`: 服务器登录用户名
    - `Remote Directory`: 要连通使用的服务器目录,如`/var/run/jar_home/`
    - 点击`高级`按钮,在勾选`Use password authentication, or use a different key`
    - `Passphrase / Password`: 服务器登录访问密码
    - `Port`: 对应要访问的服务器SSH端口号(默认: 22)
    - 点击保存
+ 进入对应项目的配置管理页,到“构建后操作”操作区,点击`新增构建后操作步骤`选择`Send build artifacts over SSH`
    - `Source files`: 要发布的包相对于Jenkins目录下的workspace路径(如:`cqt-frame/cqt-mdengine/target/cqt-mdengine-0.0.1-SNAPSHOT.jar`或`**/cqt-mdengine-0.0.1-SNAPSHOT.jar`)
    - `Remove prefix`: 忽略的路径前缀(如:`cqt-frame/cqt-mdengine/target/`)
    - `Remote directory`: jar包发送到远程服务器的位置目录,若已在“配置”下的“SSH Servers”已指定了“Remote Directory”,则是指在该目录的相对路径,此时不填即表示直接直接发送到“SSH Servers”配置里指定的“Remote Directory”目录
    - `Exec command`: 目标服务器要执行的shell命令,格式为:
    ```
    #!/bin/bash
    echo 'NEW' > /var/run/jar_home/jar_status/{对应jar包完整名}.status

    如:echo 'NEW' > /var/run/jar_home/jar_status/cqt-mdengine-0.0.1-SNAPSHOT.jar.status
    ```
    - 点击保存可
    - **注意:** jar包不会自动启动,请到web管理系统去手动启动

 

-----------------------

## 其他

### 支持Glare部署
+ 先确定有安装`Gradle`插件
+ 在`全局工具配置`中,配置`Gradle`
    - 点击`新增Gradle`
    - 填写自定义的Gradle名称
    - 若是自己手动安装的`Gradle`,则去掉勾选项`自动安装`,再在`GRADLE_HOME`配置对应绝对路径即可
    - 若想让jenkins自动安装,则勾选上`自动安装`,然后选择对应下载版本保存即会自动安装
+ 新建任务,选择`构建一个自由风格的软件项目`
+ 配置项目,在`构建`中,选择`Invoke Gradle script`
    - 在`Invoke Gradle`下的`Gradle Version`中选择用于构建使用的Gradle版本(当前项目建议使用v4.8.1)
    - 点击高级,设置`Switches`为:`clean build --stacktrace --info`
    - 同时设置`Root Build script`为:对应要构建的项目的具体路径,如`${workspace}/cqt-frame3/exchange/market-7101/`
+ 在`构建`中再选择`执行shell`,输入命令
``` shell
#!/bin/bash

if [ ! -d "/var/run/jar_home/version/" ]; then
    mkdir -p /var/run/jar_home/version/
fi

echo "WORKSPACE=$WORKSPACE"

cp -r $WORKSPACE/cqt-frame3/exchange/market-7101/build/libs/market-7101.jar /var/run/jar_home/
echo "jar包复制到仓库 -- /var/run/jar_home/"

cp -r /var/run/jar_home/market-7101.jar "/var/run/jar_home/version/market-7101.jar.$(date +%Y%m%d%H%M%S)"
echo "jar包备份留档 -- /var/run/jar_home/version/"

status_file_list=`find /var/run/strategy_home/ -name "strategy.status"|grep -w "market-7101"`
for file in $status_file_list; do
    echo "UPDATE" >> $file
done

```
+ 若需要添加构建邮箱通知,则在`构建后操作`中,再选择`E-mail Notification`,然后填写要接收邮件通知的邮箱地址