前言
之前项目中虽然使用过 Jenkins,但是都只是使用,没有自己搭建过,完整部署一个项目。既然工作中没有独立部署过,那么就只能自己动手实操一番,技多不压身嘛。
一开始是在本机上下载安装 Jenkins,然后将本地项目上传到 Gitlab 上,期望在 Jenkins 上构建项目,然后进行项目的部署和发布。但是在动手过程中发现本机 Jenkins 新建任务时走不通,要么就搭建虚拟机,或者搞台服务器,刚好手头有一台自己玩的服务器,刚好也刚贴合实际生产,所以才有了下文。
准备工作
JDK
准备java环境,jdk1.8
检查java是否安装,如果没有则先安装java环境:java -version
查看 jdk 安装路径:echo $JAVA_HOME
[root@iZ8vbf6lodiycfjz81qhkyZ home]# echo $JAVA_HOME /usr/java/jdk1.8.0_251-amd64 复制代码
配置环境变量
JAVA_HOME=/usr/java/jdk1.8.0_251-amd64 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME export PATH export CLASSPATH 复制代码
然后生效配置文件,
注意
如果不配置环境变量,结果会是这样
[root@iZ8vbf6lodiycfjz81qhkyZ alternatives]# java -version openjdk version "1.8.0_302" OpenJDK Runtime Environment (build 1.8.0_302-b08) OpenJDK 64-Bit Server VM (build 25.302-b08, mixed mode) 复制代码
Git
通过 yum 命令安装 yum install git。
git --version #查看安装位置 which git 复制代码
maven
yum -y install maven mvn -v # 注: 是mvn不是maven,用错的话,还以为没有配置maven环境变量呢,错误用法:maven -v Apache Maven 3.0.5 (Red Hat 3.0.5-17) Maven home: /usr/share/maven Java version: 1.8.0_302, vendor: Red Hat, Inc. Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64/jre Default locale: zh_CN, platform encoding: UTF-8 OS name: "linux", version: "3.10.0-1160.11.1.el7.x86_64", arch: "amd64", family: "unix" 复制代码
修改配置文件,如下命令:
vi /usr/share/maven/conf/settings.xml #然后添加阿里云镜像地址 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> #设置本地仓库 <localRepository>/home/maven/repository</localRepository> 复制代码
配置环境变量,
vi ~/.bash_profile #追加如下内容 export M3_HOME=/usr/share/maven export PATH=$M3_HOME/bin:$PATH 复制代码
Gradle
本文使用 Gradle 的最新版本是7.2
。在继续下一步之前,您应该检查 Gradle版本页面,以查看是否有较新的版本。
首先使用以下wget
命令在/tmp
目录中下载仅Gradle Binary zip文件:
wget https://services.gradle.org/distributions/gradle-7.2-bin.zip -P /tmp 复制代码
下载完成后,解压缩/opt/gradle
目录中的zip文件:
sudo unzip -d /home/gradle /tmp/gradle-7.2-bin.zip 复制代码
通过列出/opt/gradle/gradle-7.2
目录来验证是否提取了Gradle文件:
ls /home/gradle/gradle-7.2 bin init.d lib LICENSE NOTICE README 复制代码
配置环境变量,
vi ~/.bash_profile #追加如下内容 GRADLE_HOME=/home/gradle/gradle-7.2 export GRADLE_HOME export PATH=$PATH:$GRADLE_HOME/bin 复制代码
查看版本号
gradle -v 复制代码
安装jenkins
(1)安装稳定版
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key sudo yum install jenkins 复制代码
(2)安装最新版,默认安装最新的
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key yum install -y jenkins 复制代码
安装完成后,如果想查看 jenkins 版本,按照网上的说法是去 /var/lib/jenkins 目录下执行下述命令:
cat config.xml|grep version 复制代码
不过我自己服务器的输出结果有点问题。
自动安装的话,默认用户名为 jenkins,端口为8080,默认目录:
- 安装目录:/var/lib/jenkins
- 日志目录:/var/log/jenkins/jenkins.log
- 默认配置目录:/etc/sysconfig/jenkins
可修改jenkins用户为root用户、修改端口等
vim /etc/sysconfig/jenkins service jenkins restart 复制代码
卸载jenkins
卸载yum
方式安装的jenkins
(默认安装主目录是在/var/lib/jenkins/
)
service jenkins stop yum clean all yum -y remove jenkins 复制代码
初始化
激活jenkins
首先启动 jenkins,执行下述命令:
service jenkins start 复制代码
然后访问 http::/ip:8080,
首次登录需要输入密码,看页面提示:
/var/lib/jenkins/secrets/initialAdminPassword 复制代码
最后成功登录。
浏览器进入Jenkins
(1)登录:http://自己的IP:8081/
(2)关闭:http://自己的IP:8081/exit
(3)重启:http://自己的IP:8081/restart
(4)重新加载:http://自己的IP:8081/reload
启动与关闭
service jenkins start service jenkins stop #如果遇到warning systemctl start jenkins systemctl stop jenkins 复制代码
插件安装
给项目配置授权。
当Github有代码提交时触发自动构建
更新-2020-4-21:
1.26 还叫SSH slave
1.31.2 已经更新为SSH build Agents
Gitlab
当有新的commit push到gitlab时,jenkins可以自动触发构建过程。除了需要 gitlab-hook-plugin 插件,还需要 Gitlab 插件。
与Gitlab关联
配置SSH
如果要通过 git 协议拉取代码,需要建立 Jenkins 服务器和 Gitlab 服务器的无密码通信,我们首先要生存一组密钥对。
[root@iZ8vbf6lodiycfjz81qhkyZ tmp]# ssh-keygen -t rsa -C "你的邮箱(随意)"Generating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): 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:D998pKifmjJgSmUcNNlaEDAdhB/UU4wr+QkPVMkd1KU xxxxxThe key's randomart image is:+---[RSA 2048]----+| oBOX.B+o .. || ..*.O o .. || + * o E || @ . || o * .S . || . o + + + o || . o . + + . || . o o . . || o+oo |+----[SHA256]-----+ 复制代码
完成后在/root/.ssh/ 会生成2个文件。id_rsa 和 id_rsa.pub。前者是私钥,注意保管,后者是公钥。
添加SSH Key到GitLab
登录GitLab之后: Profile Settings => SSH Keys => Add SSH key
输入之前生成的公钥,标题自定义。
推荐阅读:持续集成之 Jenkins 如何通过 Gitlab 上的权限认证(三)
Gitlab令牌
关于 jenkins 中配置 gitlab access token 的步骤推荐阅读:如何获取 GitLab Token?
新建任务
在新建任务前,需要配置好 SSH。
1、新建任务
2、General
其中 Gitlab Connection 是在获取 Gitlab 令牌时配置的。JDK 可以选择服务器上的路径,我们之前在全局工具配置那里配置过。
3、源码管理
此时点击添加按钮,会有个 jenkins 选项,然后进入到该页面:
类型选项可以选择 Username with password,或者 SSH,选择前者,则输入 gitlab 的账号和密码,选择后者,则在 private key 配置私钥,也就是配置 SSH 时 id_rsa 文件中的内容。
配置成功后
如果你的账号、密码、仓库地址均正确,则错误提示消失。
4、构建触发器
我们勾选 "Build whenever a SNAPSHOT dependency is built" 。同时需要配置 Gitlab 的 webhook,将上述红框标注的地址配置到 gitlab 中。
可以点击测试按钮试一下,选择 pubsh events 即可。
5、构建环境
6、Build
Build是当把代码拉下来之后需要做的操作,由于是一个maven项目,因此我们需要指定编译打包的命令,这里是:
clean package -Dmaven.test.skip=true 复制代码
7、Post Steps
这一步最为关键,能否成功全看这里的配置了,首先给出对应的 shell 脚本:
#!/bin/bash echo '开始maven 构建服务' #export BUILD_ID=dontKillMe这一句很重要,这样指定了,项目启动之后才不会被Jenkins杀掉。 export BUILD_ID=dontKillMe mvn clean install #指定最后编译好的jar存放的位置 www_path=/home/wwwroot/jenkins #Jenkins中编译好的jar位置 jar_path=/var/lib/jenkins/workspace/Mybatis-Generate/target cd ${jar_path} #获取Jenkins中编译好的jar名称,其中XXX为你的pom文件中的artifactId的值,这一步主要是为了根据项目版本号动态获取项目文件名 #jar_name=`ls |grep XXX-|grep -v original` jar_name=`ls |grep mybatis-generator-|grep -v original` #jar_name=mybatis-generator-1.0-SNAPSHOT.jar #需要注意的是,初次构建时并没有对应的pid,所以需要判断一下是否存在该文件 #获取运行编译好的进程ID,便于我们在重新部署项目的时候先杀掉以前的进程 if [ -f "/home/wwwroot/jenkins/Mybatis-Generate.pid" ];then pid=$(cat /home/wwwroot/jenkins/Mybatis-Generate.pid) #杀掉以前可能启动的项目进程 kill -9 ${pid} fi #进入最后指定存放jar的位置 cd ${www_path} #先删除原来的jar文件 rm -rf ./${jar_name} #进入指定的编译好的jar的位置 cd ${jar_path} #将编译好的jar复制到最后指定的位置 cp -r ${jar_path}/${jar_name} ${www_path} #进入最后指定存放jar的位置 cd ${www_path} #启动jar,指定SpringBoot的profiles为beta,后台启动 #java -jar -Dspring.profiles.active=beta ${jar_name} & java -jar ${jar_name} & #将进程ID存入到ufind-web.pid文件中 echo $! > /home/wwwroot/jenkins/Mybatis-Generate.pid 复制代码
关于上述脚本,我们该如何配置呢?
jar_path
首先在服务器中找到 jenkins 的安装地址,上文提到过,位于 /var/lib/jenkins。
在该目录下有 workspace 文件夹,其中 Mybatis-Generate 是我们任务的名称,最终这就构成了我们的 jar_path,mvn 执行命令后会生成对应的 jar 包,并存放在 target 目录下。
www_path
我们后序会将 jar 包复制一份到另外一个文件夹中,所以根据自己的习惯来创建这个文件夹。
8、构建设置,配置 email,额外功能,不影响项目的构建
首先需要下载两个插件:Email Extension
, Email Extension Template
,这两个插件可以帮助我们进行邮件的编写发送以及格式化。
具体操作步骤网上有很多,这里推荐阅读:03-Jenkins之Email配置与任务邮件发送实践与踩坑
网易163免费邮箱相关服务器信息:
参考文献
问题记录
解决jenkins内存占用过高
- 修改配置文件
vim /etc/sysconfig/jenkins
- 内容如下:
# JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true" JENKINS_JAVA_OPTIONS="-XX:MaxPermSize=512m -Djava.awt.headless=true" 复制代码
- 重启jenkins
Java 11 is the recommended version to run Jenkins on;
分为两种环境,linux 中,以及 macOS 中通过 brew 安装的 jenkins。
一、linux
vi /etc/init.d/jenkins 复制代码
修改如下部分:
candidates=" /etc/alternatives/java /usr/lib/jvm/java-1.8.0/bin/java /usr/lib/jvm/jre-1.8.0/bin/java /usr/lib/jvm/java-11.0/bin/java /usr/lib/jvm/jre-11.0/bin/java /usr/lib/jvm/java-11-openjdk-amd64 /usr/bin/java " 复制代码
追加本机安装的 jdk
/usr/java/jdk1.8.0_251-amd64/bin/java 复制代码
此法不通,则推荐阅读:stackoverflow.com/questions/5…
二、macOS
尝试在 jenkins 中安装 gitlab-hook 插件,而在安装 ruby-runtime 时它会引发错误
java.lang.RuntimeException: unsupported Java version: 11 at org.jruby.RubyInstanceConfig.initGlobalJavaVersion(RubyInstanceConfig.java:1674) at org.jruby.RubyInstanceConfig.<clinit>(RubyInstanceConfig.java:1387) Caused: java.lang.ExceptionInInitializerError at org.jruby.embed.internal.AbstractLocalContextProvider.<init>(AbstractLocalContextProvider.java:42) 复制代码
1、打开文件 vi /usr/local/opt/jenkins/homebrew.mxcl.jenkins.plist
2、修改 java 配置
/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/bin/java 复制代码
参考文献:
jenkins.service changed on disk. Run 'systemctl daemon-reload' to reload units
[root@izm5e1qim1yoreb6toj6d9z local]# service jenkins start Starting jenkins (via systemctl): Warning: jenkins.service changed on disk. Run 'systemctl daemon-reload' to reload units. [ OK ] [root@izm5e1qim1yoreb6toj6d9z local]# systemctl daemon-reload [root@izm5e1qim1yoreb6toj6d9z local]# systemctl restart jenkins 复制代码
Jenkins 中创建项目时没有Maven项目怎么办
下载插件:Maven Integration
jenkins构建时错误 Failed to create parent directories for tracking file
使用jenkins构建时提示如下错误,原因是maven仓库的权限不够,解决办法增加文件夹权限:
chmod 777 maven仓库路径,如:
chmod 777 /home/maven/repository 复制代码
jenkins构建报错Failed to create /home/jenkins/.m2
chmod 777 /home/jenkins 复制代码
总结
回顾上文,看起来很简单,只是安装必要的工具,然后配置一下 Jenkins 即可,但是实际操作却花了不少的时间,有些时候就只是那么一丁点的问题,但是自己不明白,去网上各种查找资料,往往需要翻阅很多文章,相互对比结合起来才能找到正确的答案。
也许找个有经验的人指导着做,很快就能完成了,但并不是每个人身边恰巧有这样的大佬。
还是那句话,好记性不如烂笔头,做一遍,写下来,踩踩坑,会留下很深的印象。