转载

jenkins 自动化部署实战

jenkins 作为一个自动化的集成工具,已经是必不可少的了。它里面提供各种插件,以及完备的基础流程设施,为大家的自动化集成之路提供了很多的方便。所以,我们有必要完整的实践一回。以切身体会到它的好处!

一、 操作步骤说明陈列

1. 下载jenkins包,并安装;(两种方案,基于物理机和基于docker,视情况而定建议使用docker)

2. 安装后,初始化jenkins,基本都是下一步下一步搞定,保持默认是比较稳妥的选择;

3. 订立目标,需要完成什么的场景下的打包功能? git ?  subversion? 或者其他 ?

4. 选择此场景需要的必要插件安装,并进行简单调试;

5. 新建一个任务,尝试使用工具完成一次简单的打包操作;

6. 完善一个任务,使其可以支持一些简单的参数定制,如分支的选择;

7. 打包完成后,编写部署脚本,使其可以一键部署;

8. 设置权限管理,使不同环境的包由不同级别的同学进行操作;

9. 进行反复功能验证,及权限验证;

10. 备注所有的操作流程,以便在进行下次重新安装时,能够随时搞定;

二、具体实践操作

简单的安装和初始化,咱们就不多说了,网上一大堆的信息,随便找一个就能搞定,不找也能搞定,请参考官网: https://wiki.jenkins.io/display/JENKINS/Use+Jenkins

打包场景一: 如何打包 maven 管理的java项目 ?

其实要打包这种项目比较简单,只要安装一个 maven integeration 的插件即可!如下:

jenkins 自动化部署实战

安装好后,新建一个 maven 任务即可!

jenkins 自动化部署实战

其实maven任务和其他任务不太一样的地方是,它会出现一个 pom.xml 的字样,其实就是自己去加载这个配置文件,然后自行调用 maven 进行打包。而如果想要更灵活,也是可以的,只需要使用 系统的命令进行自由构建即可!

jenkins 自动化部署实战

经过上面的操作后,你可能会发现,其实并不会打包成功,为什么呢?因为我们还没有安装 maven 的工具到系统上,或者说没有向 jenkins 解释 maven 在哪里,所以需要到全局工具配置一下!

jenkins 自动化部署实战

另外,如果你是需要打包 git 类的代码的话,一般只需要进行简单授权就可以了!

jenkins 自动化部署实战

到此,一个 简单的 maven java 项目打包就成功了!

但是,其实,打包到这个程度,其实对我们的环境部署一点更多的意义都没有,所以我们需要更深的定制化!咱们稍后再说!

先来说说,另一种项目的打包方式, h5 代码的打包。 更具体的讲,就是 基于 nodejs 的打包实现!

首先,我们当然需要安装 node js 的插件了!

jenkins 自动化部署实战

同样,该插件安装好后,还要安装  nodejs 的软件!可以直接选择自动 安装 ! 注意要求的版本!

jenkins 自动化部署实战

安装好后,新建一个自由风格的任务!

jenkins 自动化部署实战

进入,把 node 的环境支持勾选上!然后定稿node 的打包命令!

jenkins 自动化部署实战

同样,git 相关的操作一样!

至此,简单的 node 版本的代码打包功能也做好了。

同样,只是进行打包,无法定制化的东西,对我们毫无意义,所以,我们需要更高级的定制 jenkins !

三、 定制你的 jenkins 功能!

场景一: 我需要为一个git 仓库的多个分支打包?

这个,简单, jenkins 中一添加定制化参数的功能,只需要添加一个文本参数就可以 了!

jenkins 自动化部署实战

在 git 分支一栏,写入 $branch 替换即可!

jenkins 自动化部署实战

如此,一个简单的支持 git 多分支打包的功能就做好了!

但是:每次都让我自己输入分支,好烦啊! 而且,我自己也不一定知道有什么样的分支,这可怎么办?

借助 groovy 脚本,可以动态拉取 分支列表,进行显示了!

jenkins 自动化部署实战

简单来说就是,执行一些shell脚本 , 从 git 远端列举出分支,给到列表选项! groovy 脚本如下:

def git_url = "https://github.com/yougewe/elastic-job-lite"
def git_cmd = "/usr/local/git/bin/git ls-remote -h $git_url  | grep -oP '(?<=refs/heads/).*' "
branch = ['bash', '-c', git_cmd].execute().text.readLines()

好了,分支的选择,看起来我们已经解决得差不多了!

但是,前端有个点,就是这分支的触发问题,其实我们可以更动态方式实现!

使用 Active Choice 这个插件,可以让我们在需要的时候触发一次分支的选择,比如支持 分支快速过滤!

然后,也可以使分支依赖于动态的仓库进行变更分支列表等等!总之, Active Choice 插件真是很方便发挥!

最终的效果就是,我们可以选择,多仓库,动态列表多分支,进行打包!

但是,还有个关键的问题,就是我们打包来的包,应该处理的问题!

如果不能很好的处理这些包,我们将很无奈!所以  shell 就出场了!

jenkins 支持在打包后进行一些自定义的操作! 比如 上传包到另外的服务器,或者部署到另外的地方等等!总之,就是任你发挥!

比如如下的脚本 ,我们可以将它部署到我们指定服务器的 docker 容器中!

jenkins 自动化部署实战

参考脚本如下:

echo "hello, build over ??? would you scp or deploy apps ??? work dir: $WORKSPACE , repository: $spec_repository;"
# specify dev environment or product environment
deploy_env_server="root@172.10.11.16"
deploy_path_prefix="/opt/docker/webapps/test"
docker_app_startup_script="/etc/init.d/startup restart";
case "$spec_repository" in
    richCash)
        docker_container_name="test_container";
        docker_app_startup_script="/etc/init.d/startup restart";
        deploy_path_prefix="/opt/docker/webapps/";
        deploy_sub_path="$deploy_environment"
        case "$deploy_environment" in
            "test-p8081")
                docker_container_name="test_p8081_container"
                ;;
                docker_container_name="test_p8083_container"
                ;;
            *)
                # default container
                ;;
        esac
        deploy_path_prefix="/opt/docker/webapps/$deploy_sub_path";
        ;;
    xcz_audit)
        deploy_path_prefix="/opt/docker/webapps/test2-01";
        docker_container_name="test2_01_container";
        docker_app_startup_script="/etc/init.d/startup restart";
        ;;
    *)
        echo "not find special configures in $spec_repository, do the default thing";
    ;;
esac
# deploy script
deploy_script_path="ssh $deploy_env_server /"docker exec $docker_container_name bash -c '$docker_app_startup_script'/"";

pom_file="$WORKSPACE/pom.xml";
pom_file_tmp="$pom_file/.tmp";
cd $WORKSPACE;
cat $pom_file | awk '{if($0 ~ /<parent>/){parent_begin++; print "no dump parent"} else if(parent_begin > 0){ if($0 ~ /<//parent>/){parent_begin = 0; print "match the parent end.";} else {print "hit parent dump"; }} else { print $0;}}' > $pom_file_tmp
package_artifactId=`grep "<artifactId>" $pom_file_tmp | head -n 1 | sed -e 's//(/s*<artifactId>/|<//artifactId>/s*/)//g'`;
package_version=`grep "<version>" $pom_file_tmp | head -n 1 | sed -e 's//(/s*<version>/|<//version>/s*/)//g'`;
package_full_name="$package_artifactId-$package_version.jar"    # 定义为jar包写死
package_full_path="$WORKSPACE/target/$package_full_name";
echo "packaged file is: $package_full_name";
scp $package_full_path $deploy_env_server:"$deploy_path_prefix/$package_full_name";
# restart the server...
eval $deploy_script_path;

  如上,就可以进行一键部署测试环境了!
  剩下的,就是自己自由发挥了!
  同理于 h5 的部署方式!
    

四、重难点提示

其实,准确来说,上面的操作都比较常规,因为都是最终的结果步骤展示!但是其实这其中有很多的坑,期望提示对你有帮助!

1. 使用groovy 进行分支获取时, 需要对 git 命令进行免密授权操作,否则将永远拉不到分支;

2. 使用scp, scp 这些命令调用远程,需要免密登录,否则授权失败;

3. 使用 ssh xx@1.2.2.4 "ls ." 运行远程命令如同本地命令;

4. 真正的部署脚本可以远程服务器上,也可以写在部署机器上;

原文  http://www.cnblogs.com/yougewe/p/10567850.html
正文到此结束
Loading...