该方法适用于maven构建的项目,自动部署需要用到maven插件wagon-maven-plugin。

当配置插件后,部署流程如下:

客户端通过maven打包项目(package)

插件会自动将包上传到配置的服务器

插件调用wagon-ssh库执行部署脚本

上述流程中每次都需要手动操作的就只有第1条,其他都可以自动完成,这种方案很适用于开发过程中的测试部署,具体配置方法如下(想直接查看所有配置的代码见文末配置代码)。

配置wagon-maven-plugin

配置wagon-maven-plugin分为4个部分:

配置服务器认证

配置插件执行阶段(阶段简单说就是插件的执行时机,比如package之后,可以搜索maven生命周期关键词了解)。

配置上传包的目标(目标简单说就是要插件做的事情,一个插件可以做很多事情,一件事情就是一个目标)

配置执行部署脚本目标

1. 配置服务器认证

在maven的配置文件settings.xml(一般在用户目录下的.m2文件夹下)中配置服务器认证信息,即用户和密码,找到文件的大概121行可以看到配置server信息的注释,在注释后面添加如下代码。

1

2

3

4

5

127.0.0.1

root

root

其中,

标签是该配置的唯一编号,后面配置插件连接服务器会用到,建议配置为服务器ip

标签是服务器登录用户名

标签是服务器登录密码

2. 配置插件执行阶段

执行打包命令完成打包后,就要执行插件了,那么插件的执行时机就是package。pom.xml中新增如下代码。

1

2

3

4

5

6

7

8

9

10

11

12

13

org.codehaus.mojo

wagon-maven-plugin

2.0.0

upload-and-deploy

package

其中,

标签表示定义执行,具体为后面要配置的上传包和执行部署脚本。

标签表示这个执行的id,取一个有意义的名称即可。

标签表示这个插件在package阶段执行,即打包完成后执行。

简单描述下阶段以及如何配置插件在阶段中执行。比如命令mvn clean package,这个命令中有2个阶段,即clean和package,如果想要pluginA插件在package之后执行,就可以执行命令mvn clean package pluginA。如果希望命令简单一些,可以将插件的phase标签配置为package,这时候执行命令mvn clean package就可以达到命令mvn clean package pluginA同样的效果了。更多信息可以搜索maven生命周期关键词了解,不再赘述。

3. 配置上传包的目标

上传目标就是要插件将打好的包上传到服务器,需要配置:

服务器地址

上传到的路径

要上传的包的路径

配置服务器相关信息的代码如下,在中加入和标签。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

...

...

upload-single

127.0.0.1

target/my-war-package.war

scp://root@127.0.0.1/root

其中,

标签表示目标,有多个目标时按照顺序执行,上传包使用upload-single即可,即上传一次。

标签表示服务器和上传路径配置

服务器和上传路径配置中,

标签即上面配置的服务器认证的id。

标签表示打包后包的位置,一般都是target下的某个war包。

标签表示使用scp将包拷贝到指定的路径,root 是服务器用户名,**@** 后面是服务器地址和存放路径(类似scp命令)。

4. 配置执行部署脚本目标

执行部署脚本目标是当包上传完成后,用于在服务器执行部署脚本的。具体配置如下,在中加入,即加入新的目标,多个目标按顺序执行。以及在标签中添加和标签。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

...

...

sshexec

...

cd /root;./run.sh

true

其中,

标签 表示执行ssh命令。

标签 是要执行的命令行,具体命令在标签中。案列中是进入war包所在目录,然后执行run.sh脚本。

标签 表示在客户端打印出执行的命令和命令返回结果。

需要注意的是,commond标签中的命令涉及到目录或文件需要使用全路径,如果不想使用全路径,可以像案列中那样,多条命令用分号隔开合并为一条语句,后面的命令就可以使用相对路径了。

编写部署脚本

这个步骤就是自定义部署的命令了,比如解压war包到目录,重启docker等,当然也可以不通过sh文件执行,也可以在commond标签中直接写命令,但是每一行命令都要使用完整路径,否则就使用案列中的一条语句,多条命令用分号隔开。下面是一个sh脚本示例。

1

2

3date >> log.txt

ls my-war-package.war >> log.txt

echo deployed successfully >> log.txt

其他说明

wagon-maven-plugin版本说明

案列中采用的插件版本为2.0.0,如果使用1.0,还需要配置wagon-ssh,否则无法正常执行命令,会报错Cannot find wagon which supports the requested protocol: sftp: java.util.NoSuchElementException。

1

2

3

4

5

6

7

8

9

10

...

org.apache.maven.wagon

wagon-ssh

3.3.3

多个阶段执行命令

案列中将插件配置在package阶段执行,即打包后执行上传和部署,如果在打包之前还要做一些准备工作,比如清理之前的包,关闭容器等,那么可以再配置一个执行(execution)并在clean阶段执行即可,具体代码如下,在id为upload-and-deploy这个执行之前再添加一个id为prepare的执行,就可以在clean之后,package之前执行了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

...

prepare

clean

sshexec

cd /root;echo prepare > log.txt

true

upload-and-deploy

...

FAQ报错Cannot connect. Reason: invalid privatekey

错误原因是服务器认证没有配置或者配置不正确,配置方法见上述配置服务器认证。

报错Cannot find wagon which supports the requested protocol: sftp: java.util.NoSuchElementException

错误原因是wagon-maven-plugin插件使用的1.0版本,并且没有配置wagon-ssh库,配置方法见上述wagon-maven-plugin版本说明。

附件:配置代码服务器认证配置

配置到maven的settints.xml中。

1

2

3

4

5

127.0.0.1

root

root

pom.xml配置

配置到pom.xml的plugins标签中。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

org.codehaus.mojo

wagon-maven-plugin

2.0.0

upload-and-deploy

package

upload-single

sshexec

127.0.0.1

target/my-war-package.war

scp://root@127.0.0.1/root

cd /root;./run.sh

true

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐