问题起源于Jenkins要以Jenkins用户启动,不能以root用户启动;一般情况下,登录远程主机肯定不是以Jenkins用户登录,所以造成目录访问权限问题,包括maven本地仓库目录权限,java target目录权限,log文件权限
- 把Jenkins加入登录用户组
usermod -G -a some_group some_user
- 使用umask命令,
umask -S 0001
,创建的文件时,默认抹去某个属性,但是这个不是永久的,并且我发现umask
并不是一个系统命令,而是shell的内置命令,所以需要修改umask就很棘手。后来在SOF上找到:可以修改/etc/login.defs
来更改默认的umask值,正如链接中所述,也即umask的注释:需要把USERGROUPS_ENAB
置为no
,否则某个文件的权限和该文件所有者权限一致,一般也不会有什么问题。 - 直接修改相关目录的权限,手动改是 不可能的!后来想到应该使用maven来解决这个问题;首先想到的是assemble文件,不过我误以为这个是只有在package阶段才使用,而且配置中已经有了assemble文件了,就找到了新的插件:应该使用maven exec插件来解决这个问题
- 再补充些maven生命周期和目标的知识:来自SOF:https://stackoverflow.com/questions/16205778/what-are-maven-goals-and-phases-and-what-is-their-difference; 执行maven命令时可以指定阶段(
mvn test
),也可以是目标(mvn exec:exec
),一个阶段里可以有很多执行目标
maven exec插件使用配置如下:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<id>script-chmod</id>
<phase>compile</phase>
<goals>
<goal>exec</goal>
</goals>
<!-- 看网上不少示例中把configuration放在了错误的位置(executions外面) -->
<configuration>
<executable>chmod</executable>
<arguments>
<argument>0777</argument>
<argument>${project.build.directory}</argument>
<argument>${project.build.directory}/../logs</argument>
<argument>-R</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>