使用Jenkins打包和部署Maven工程步骤详解

上节已部署jenkins: https://blog.csdn.net/weixin_39816740/article/details/104943258

准备好一个maven项目发布到码云 上节地址:https://blog.csdn.net/weixin_39816740/article/details/105093124

使用Jenkins进行自动打包部署之前,需要对Jenkins做一些全局配置。jdk,maven,git(并添加ssh凭证)

设置jdk

我的安装目录:/usr/local/java/jdk1.8

设置maven

我的安装目录:/usr/local/java/maven3.6.3

 

 

配置maven的settings.xml文件

我的配置文件路径:/usr/local/java/maven3.6.3/conf/settings.xml

 

 

 

 

配置git 注意这里配置的是git的启动文件路径

我的文件路径:/usr/local/java/git/bin/git

有许多第三方网站和应用程序可以与Jenkins进行交互,例如代码仓库GitHub等。

此类应用程序的系统管理员可以在应用程序中配置凭证以专供Jenkins使用。通常通过将访问控制应用于这些凭证来完成这项工作,以“锁定Jenkins可用的应用程序功能区域”。一旦Jenkins管理员在Jenkins中添加/配置这些凭证,Jenkins项目就可以使用凭证与这些第三方应用程序进行交互。

Jenkins中保存的凭证可以用于:

  • 适用于Jenkins的任何地方(即全局证书)。
  • 特定的Jenkins项目。
  • 特定的Jenkins用户。

Jenkins可以保存下面几种凭证:

  • Secret text:例如 API Token(例如GitHub的个人access token)。
  • Username with password:指的是登录GitHub的用户名和密码,可以作为单独的组件处理,也可以作为username:password格式的冒号分割字符串来处理。
  • Secret file:实际上是文件中的秘密内容。
  • SSH Username with private key:即使用私钥的SSH 用户名。这是一个SSH 秘钥对。公钥配置在GitHub上面,这里添加私钥。
  • Certificate:即证书。一个PKCS#12证书文件和可选的密码。
  • Docker Host Certificate Authentication:即Docker主机证书身份验证凭证。

为了确保安全,Jenkins中配置的凭据在Jenkins主实例中加密存储(通过Jenkins实例的ID来加密),并且只能通过它们的凭据ID在Pipeline项目中处理。

这样就最大限度地减少了向Jenkins用户暴露实际证书本身的可能性,并且限制了将功能证书从一个Jenkins实例复制到另一个Jenkins实例的能力。

SSH凭据需要一对私钥,所以我们首先需要生成SSH Key(一直 enter)

ssh-keygen -t rsa -C "your_email@youremail.com"

所有选项都是默认,一直回车即可生成。生成之后在.ssh文件夹下就会生成文件,如下图所示:

 

一共会生成两个文件:

  • id_rsa。这个是私钥文件。
  • id_rsa.pub。这个是公钥文件,需要配置到码云上面。
  • 仓库的 SSH Key 和账户 SSH Key 的区别?

    和仓库"只读"权限的 SSH Key 相比,账户的 SSH Key 同时具备推送/拉取的权限,对用户创建/参与的仓库均能使用,使用起来更加方便。

    仓库的 sshkey 只针对仓库,且我们仅对仓库提供了部署公钥,即仓库下的公钥仅能拉取仓库,这通常用于生产服务器拉取仓库的代码。
    而用户的 key 则是针对用户的,用户添加了 key 就对用户名下的仓库和用户参加了的仓库具有权限,一般而言,用户的key具有推送和拉取的权限,而仓库的 key 则只具有拉取权限。

我们选择仓库的只读公钥配置(把生成的id_rsa.pub文件里面的内容拷贝进来即可):

添加jenkins ssh凭据

 

 

注意:这里在拷贝私钥的时候,一定要把生成的私钥文件里面的所有内容都拷贝进来。

最后点击“ok”按钮即可完成添加SSH 凭证。

这样就配置好了SSH凭据。

构建项目我的项目名叫zslg_member

进入项目配置:

(1)General部分,默认可以不填,有项目名称即可,当然你也可以加上项目描述,可根据需要选择:

Jenkins 提供了“Discard old builds”的选项可以配置保留几天/最多几个的build 和 artifacts,缺省这个选项不会勾上。不勾选时,默认值为365,显然这个值过大了。

打开一个Jenkins job的Configure页面,勾选上”Discard old builds”,填入Day of keep builds (保留几天的build记录)和Max# of builds to keep (保留最多几个build记录)。

点击Advanced按钮,还可以填入Days of keep artifacts (保留几天的artifact)和 Max# of builds to keep with artifacts (保留最多几个artifacts)。

通常来讲,如果磁盘空间足够,这4个选项设置为15就可以了(也就是两周 + 1天)。

如果磁盘空间不足时,可以将这4个选项都设置为3。

(2)源码部分,因为我使用的是git和码云上的项目,所以这里勾选git,并填写相关的内容,所显示码云上项目的git路径(ssh),然后是添加凭据:

(3)构建触发器,即你当前新建的项目什么时候什么条件下需要触发构建的任务,可以使用这个构建触发器;这里我选用手动触发,不选择下面的4中,默认即可:

  • 触发远程构建(Trigger builds remotely (e.g., from scripts))
  • 其他工程构建后触发( Build after other projects are build)
  • 定时构建( Build periodically)
  • 轮询 SCM(Poll SCM)

(4)构建环境设置 默认不勾选即可:

 

(5)构建设置,可以添加构建的步骤,按照需要选择,我这里选择Invoke top-level Maven targets,然后添加一个clean package  -Dmaven.test.skip=true的步骤:

在使用mvn package进行编译、打包时,Maven会执行src/test/java中的JUnit测试用例,有时为了跳过测试,会使用参数-DskipTests和-Dmaven.test.skip=true,这两个参数的主要区别是:

-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。

-Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类。

  (6)构建后操作设置 默认先不设置

  (7)点击apply,进入到该任务的主页(测试上述配置是否可以打包成功):

注意:远程仓库默认位置在jenkins安装目录.m2文件夹内:

接下来配置使用shell脚本复制jar包到指定目录下(我的是/usr/local/java/zslg/):

echo $WORKSPACE
echo "/usr/local/java/zslg/"
pid_str=`netstat -nlp|grep :9000 |awk '{print $7}'`
echo "pid_str:$pid_str"
echo ${pid_str%%/*}
if [ -n "${pid_str%%/*}" ];then
  echo "kill ${pid_str%%/*}"
  kill -9 ${pid_str%%/*}
fi
sleep 2
if [ -f "/usr/local/java/zslg/member-pc-api-1.0-SNAPSHOT.jar" ];then
  echo "存在"
  mv "/usr/local/java/zslg/member-pc-api-1.0-SNAPSHOT.jar" "/usr/local/java/zslg/member-pc-api-1.0-SNAPSHOT.jar"_`date +%Y%m%d%H%M`
else
  echo "不存在"
fi
pwd
cd member-pc-api/target
mv member-pc-api-1.0-SNAPSHOT.jar /usr/local/java/zslg/member-pc-api-1.0-SNAPSHOT.jar
cd /usr/local/java/zslg/
BUILD_ID=dontKillMe
nohup java -jar member-pc-api-1.0-SNAPSHOT.jar &
rm -rf $WORKSPACE

执行脚本的时候jenkins使用的用户没有对应文件的权限。

那jenkins使用的是哪个用户呢?打开配置文件看一下:

vi /etc/sysconfig/jenkins

找到JENKINS_USER,然后会发现执行的默认用户是jenkins。

所以问题的原因就是jenkins用户没有文件的权限。

解决问题的几种方式

1.不建议的方式 chmod 777
在网上看到有人使用这种暴力直接的解决方式,直接给相应的文件改成777的属性,这样任何用户都能操作了。一般使用这种解决方案的人都是没有意识到问题的根本原因。

2.让jenkins以root或对应用户执行

这里以修改jenkins用户为root作为示例:
修改Jenkins配置文件
打开配置文件

修改$JENKINS_USER

JENKINS_USER="root"

修改Jenkins相关文件夹用户权限

 

chown -R root :root /var/lib/jenkins

chown -R root:root /var/cache/jenkins

chown -R root:root /var/log/jenkins

重启Jenkins(若是其他方式安装的jenkins则重启方式略不同

service jenkins restart

3.给jenkins用户添加相应文件的权限

chown -R jenkins <path>

再次启动:

查看指定目录文件:

启动成功!

访问swagger2:

成功!但是部署速度慢

使用jenkins将项目部署到远程服务器

Publish Over SSH用于连接远程服务器

Deploy to container插件用于把打包的应用发布到远程服务器

配置连接远程服务器的ssh

linux中设置免密登录远程服务器

使用密钥登录

1. 制作密钥对 首先在服务器上制作密钥对。首先用密码登录到你打算使用密钥登录的账户,然后执行以下命令:

我们不设置密钥锁码

[root@zslgvm ~]# ssh-keygen  <== 建立密钥对
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):  <== 按 Enter
Enter passphrase (empty for no passphrase):  <== 输入密钥锁码,或直接按 Enter
Enter same passphrase again:  <== 再输入一遍密钥锁码
Your identification has been saved in /root/.ssh/id_rsa. <== 私钥
Your public key has been saved in /root/.ssh/id_rsa.pub. <== 公钥
The key fingerprint is:
SHA256:rPDrK1soD4LioUv8zkp4VmZk9cchytOSbhcjedrscjk root@zslgvm
The key's randomart image is:
+---[RSA 2048]----+
|      . . .      |
|     o * o .     |
|    o O * o      |
|   o . X +       |
|    = + S        |
|+  + = + .       |
|=== . = E        |
|*+++.. + .       |
|o+o+o++.         |
+----[SHA256]-----+
[root@zslgvm ~]# ls
anaconda-ks.cfg
[root@zslgvm ~]# cd .ssh
[root@zslgvm .ssh]# ls
id_rsa  id_rsa.pub  known_hosts
[root@zslgvm .ssh]# 

密钥锁码在使用私钥时必须输入,这样就可以保护私钥不被盗用。当然,也可以留空,实现无密码登录。 现在,在 root 用户的家目录中生成了一个 .ssh 的隐藏目录,内含两个密钥文件。id_rsa 为私钥,id_rsa.pub 为公钥。

登录远程服务器,在用户根目录下新建.ssh文件夹(如果不存在),在其中新建authorized_keys文件(如果不存在),把id_rsa.pub添加到authorized_keys文件中

cat id_rsa.pub >> authorized_keys

lsattr可用来查看文件的属性,执行命令lsattr authorized_keys查看当前文件属性,可以发现有i属性。

那么我们就去掉这两个属性。

chattr -i authorized_keys 

继续cat id_rsa.pub >> authorized_keys写入


 

最后恢复取消掉的属性。

chattr +i authorized_keys 

确保连接成功,请保证以下文件权限正确:

设置 SSH,打开密钥登录功能 编辑 /etc/ssh/sshd_config 文件,进行如下设置:

RSAAuthentication yes
PubkeyAuthentication yes
另外,请留意 root 用户能否通过 SSH 登录:
PermitRootLogin yes

(当你完成全部设置,并以密钥方式登录成功后,再禁用密码登录:
PasswordAuthentication no)这里我两种方式都需要,所以无需禁用

vim /etc/ssh/ssh_config 

最后,重启 SSH 服务:

systemctl restart sshd.service

测试:

但是我注释掉还可以登录,如有知道的,请留言告知!

然后接着配置jenkins ssh

Passphrase                服务器的密码(不需要)

Path to key                  连接远程服务器密钥文件的路径

Key                             密钥文件的内容 (不需要)

Name                         自定义服务器名

HostName                  服务器IP外网地址

UserName                  服务器用户名

Remote Directory     传输文件的目录

在上述zslg_member项目配置的基础上配置将项目部署到远程1号服务器(linux-linux)

Source files     项目构建后的目录

Remove prefix    去前缀

Remote directoty 发布的目录

Exec command     发布完执行的命令

重新部署打包!

 

未完待续!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值