Redmine基础:Plugin开发:3:部署Plugin_淼叔的博客-程序员宅基地

技术标签: 插件开发  Ticket管理  Redmine  部署  工具  # 需求与缺陷管理  

在这里插入图片描述
开发的Plugin部署到Redmine的服务中,最为简单的方式即是将整个内容进行打包,然后解开至Redmine的plugins目录中,重启Redmine的服务即可。

事前准备

事前在Redmine的开发环境中开发了一个名为sample的插件,此插件未实现任何功能,只有插件信息的设定,详细内容为:
在这里插入图片描述
详细Plugin创建的说明请参看如下内容:

生成待部署的plugin的tar文件包

liumiaocn:redmine liumiao$ docker exec -it redmine_redmine_1 sh
# ls plugins
README	sample
# tar cvpf sample-plugin.tar plugins/sample 
plugins/sample/
plugins/sample/test/
plugins/sample/test/functional/
plugins/sample/test/integration/
plugins/sample/test/test_helper.rb
plugins/sample/test/fixtures/
plugins/sample/test/unit/
plugins/sample/init.rb
plugins/sample/README.rdoc
plugins/sample/db/
plugins/sample/db/migrate/
plugins/sample/config/
plugins/sample/config/locales/
plugins/sample/config/locales/en.yml
plugins/sample/config/routes.rb
plugins/sample/assets/
plugins/sample/assets/stylesheets/
plugins/sample/assets/javascripts/
plugins/sample/assets/images/
plugins/sample/app/
plugins/sample/app/views/
plugins/sample/app/helpers/
plugins/sample/app/models/
plugins/sample/app/controllers/
plugins/sample/lib/
plugins/sample/lib/tasks/
# 

在4000端口启动新的Redmine服务

按照如下步骤在4000启动新的Redmine服务

liumiaocn:redmine liumiao$ mkdir deploy
liumiaocn:redmine liumiao$ cp docker-compose.yml deploy/
liumiaocn:redmine liumiao$ cd deploy
liumiaocn:deploy liumiao$ vi docker-compose.yml 
liumiaocn:deploy liumiao$ diff docker-compose.yml ..
8c8
<       - 4000:3000
---
>       - 3000:3000
liumiaocn:deploy liumiao$ 
liumiaocn:deploy liumiao$ docker-compose up -d
Creating network "deploy_default" with the default driver
Creating deploy_redminedb_1 ... done
Creating deploy_redmine_1   ... done
liumiaocn:deploy liumiao$ 
liumiaocn:deploy liumiao$ docker-compose ps
       Name                     Command               State     Ports  
-----------------------------------------------------------------------
deploy_redmine_1     /docker-entrypoint.sh rail ...   Exit 1           
deploy_redminedb_1   docker-entrypoint.sh mysqld      Up       3306/tcp
liumiaocn:deploy liumiao$ 
liumiaocn:deploy liumiao$ docker-compose up -d
deploy_redminedb_1 is up-to-date
Starting deploy_redmine_1 ... done
liumiaocn:deploy liumiao$ 
liumiaocn:deploy liumiao$ docker-compose ps
       Name                     Command               State           Ports         
------------------------------------------------------------------------------------
deploy_redmine_1     /docker-entrypoint.sh rail ...   Up      0.0.0.0:4000->3000/tcp
deploy_redminedb_1   docker-entrypoint.sh mysqld      Up      3306/tcp              
liumiaocn:deploy liumiao$

此时Plugin的信息为空
在这里插入图片描述

将Plugin的tar文件展开到plugins目录下

部署Plugin只需要将上述的tar文件展开至plugins目录下即可。执行日志如下所示:

  • 获取plugin并放入Redmine服务所在的容器中
liumiaocn:deploy liumiao$ docker cp redmine_redmine_1:/usr/src/redmine/sample-plugin.tar .
liumiaocn:deploy liumiao$ ls sample-plugin.tar
sample-plugin.tar
liumiaocn:deploy liumiao$ docker cp sample-plugin.tar deploy_redmine_1:/usr/src/redmine/
liumiaocn:deploy liumiao$
  • 展开plugin文件至plugins目录下
liumiaocn:deploy liumiao$ docker exec -it deploy_redmine_1 sh
# pwd
/usr/src/redmine
# ls sample-plugin.tar
sample-plugin.tar
# ls plugins
README
# 
# tar xvpf sample-plugin.tar 
plugins/sample/
plugins/sample/test/
plugins/sample/test/functional/
plugins/sample/test/integration/
plugins/sample/test/test_helper.rb
plugins/sample/test/fixtures/
plugins/sample/test/unit/
plugins/sample/init.rb
plugins/sample/README.rdoc
plugins/sample/db/
plugins/sample/db/migrate/
plugins/sample/config/
plugins/sample/config/locales/
plugins/sample/config/locales/en.yml
plugins/sample/config/routes.rb
plugins/sample/assets/
plugins/sample/assets/stylesheets/
plugins/sample/assets/javascripts/
plugins/sample/assets/images/
plugins/sample/app/
plugins/sample/app/views/
plugins/sample/app/helpers/
plugins/sample/app/models/
plugins/sample/app/controllers/
plugins/sample/lib/
plugins/sample/lib/tasks/
# 
# ls plugins
README	sample
# 

重启Redmine服务

使用docker restart命令重启Redmine服务

liumiaocn:deploy liumiao$ docker restart deploy_redmine_1
deploy_redmine_1
liumiaocn:deploy liumiao$

确认结果

可以看到Plugin的信息已经部署到新的Redmine的服务上了
在这里插入图片描述

总结

这里可以看到,只需要将plugin的实现内容放置Redmine的plugins目录下并重启服务,插件即生效。但是需要注意的是,相关的实现均在相对目录sample下这一点是实现这一点的前提。之所以有部署Plugin的操作,在实际的场景中是多种多样的,比如自定义开发的内容较多,而生产环境的Redmine的服务较为简洁,或者Redmine的服务升级需要保证之前的插件能够正常动作等。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liumiaocn/article/details/90612629

智能推荐

程序员技术怀旧_晒晒那些过去的经典_chuanggangbo5551的博客-程序员宅基地

程序员技术怀旧,晒晒那些过去的经典 发布时间:2017-05-03 14:01:312812人关注148人参与 时间能冲淡一切,特别是在IT这个技术发展突飞猛进的领域,不管是软件还是硬件,随着时间的流逝,它们终将会被新的技术所取代,埋没z在史的长河中被人遗忘。而许多程序猿的生活也会随之...

互联网的十年_上海 互联网公司10年_tominto333的博客-程序员宅基地

2011年8月16日,北京798艺术中心。台上,雷军每公布一项技术参数,台下就传来一阵几乎要掀翻屋顶的声浪。一位记者问:“这都是哪请来的托,太敬业了!”工作人员只得实话实说:“都是自己来的,我们也没想到。”这一幕,像极了4年前乔布斯在旧金山。“手机键盘、触控笔?谁要这些玩意儿呢?”在莫斯康尼会议中心举行的第一代iPhone发布会上,乔布斯向全世界宣布:苹果要重新发明手机!这...

新手程序员选Offer?这几个原则考虑一下_大前端修行的博客-程序员宅基地

面试是公司选择你,Offer 是你选择公司。程序员这个职业在初期,门槛比较低,快速掌握一门编程语言,在工作中能参与有挑战且持续的项目,加入有活力和学习氛围的团队,初级程序员很快就能成长为高级工程师。这也是很多老程序员的焦虑所在,一旦自己稍微松懈一点,没能及时迭代自己的能力模型,那行业内不断涌入的新人就可能对自己形成威胁,无论是技术水平,还是充沛的体力和精力,新人都充满竞争力,并且,企业需要付给...

根据数组对象某一元素的id,找到此元素在数组所在的位置(findIndex)_js查询对象在数组的位置_有蝉的博客-程序员宅基地

var listData = [ {id:"1234",name:"bob"}, {id:"2451",name:"mary"}, {id:"6666",name:"tom"}, {id:"5675",name:"jerry"}, {id:"8421",name:"ken"},]let index = listData.findIndex( item...

触摸事件(含手势)_于海明的博客-程序员宅基地

一、概述在APP的开发过程中,可能需要利用手势操作去实现一些功能或者效果。UIKit框架提供了检测常见手势的预定义手势识别器。 在手势开发上,最好尽可能使用预定义的手势识别器,因为它们的简单性减少了我们的的代码量。当然,我们也可以自定义一些特殊的手势,具体的可以查看官方文档学习:Creating a Custom Gesture Recognizer。iOS中的事件可以分为3大类型:触

Untiy-Resources 加载图片_unity resources加载图片_zebintang的博客-程序员宅基地

一开始以为 将图片导入Unity时, 将其 图片转为sprite 以为就可以直接 load为sprite了,可是 一直报null异常原来是 加载后Debug出来是这个类型因为 加载的时候 是Texture2D类型,而我硬生生将其 转为 sprite,难怪会报异常了,其实 用 Load方法的话,一般会Loade第一个,而不会load子物体(sprite),然后sprit...

随便推点

定义一个长方形类,求周长和面积--学习笔记--16_定义一个长方形类,求周长和面积_起风了1122的博客-程序员宅基地

1.变量什么时候定义为成员变量如果这个变量是用来描述这个类的信息的,那么,该变量就应该定义为成员变量2.变量的范围越小越好,因为能及时的被回收3.定义一个长方形类,求周长和面积然后定义一个Test进行测试长方形的类成员变量:长,宽成员方法:周长,面积import java.util.Scanner;class Oblong{ private int length; priva...

Python 逆向抓取 APP 数据_菜鸟学Python的博客-程序员宅基地

点击上方“菜鸟学Python”,选择“星标”公众号超级无敌干货第一时间推给你!!!今天给大伙分享一下 Python 爬虫的教程,这次主要涉及到的是关于某 APP 的逆向分析并抓取数据,关...

Vi,Java,Ant和Junit的自学报告_Jenny_Shirunhao的博客-程序员宅基地

一、ViVim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。下面的基础知识内容都来自于前辈博客Vim 有以下几个模式:正常(normal)模式,缺省的编辑模式;下面如果不加特殊说明,...

【OpenCV 4开发详解】图像模板匹配_小白学视觉的博客-程序员宅基地

本文首发于“小白学视觉”微信公众号,欢迎关注公众号本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究!经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。前面我们通过图像直方图反向投影的方式在图像中寻找模板图像,由...

用jquery获取form表单值的方法总结_jq from.get_gogiqp_jyh的博客-程序员宅基地

用jquery获取form表单值的方法总结 用jquery获取form表单值的方法总结: jquery获取radio单选按钮的值 $("input[name='items']:checked").val(); jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关 获取一组radio被选中项的值 var item

AttributeError: module ‘tensorflow.contrib‘ has no attribute ‘l2_regularizer‘_attributeerror: module 'tensorflow.keras.layers' h_Wanderer001的博客-程序员宅基地

这种错误一般是tensorflow中的类或对象指定错误。第十一行第十一行在contrib.后加上layers.

推荐文章

热门文章

相关标签