参考链接
解决:Jenkins: signature verification failed in update site ‘default‘ (show details)
jenkins 下一切皆文件
虚拟机基本配置
Jenkins 安装
cd /usr/local/src/
rz # 选择以下安装包(xshell 软件命令)
下载完安装包如下所示
依次执行以下命令,进行安装
rpm -ivh jdk-8u121-linux-x64.rpm
# java -version # 检验是否安装成功
rpm -ivh jenkins-2.99-1.1.noarch.rpm
启动 jenkins 服务
systemctl start jenkins
设置 jenkins 服务开机自启
systemctl enable jenkins
查看 jenkins 服务启动状态
systemctl status jenkins
查看服务端口启用情况(jenkins 默认占用 8080 端口)
netstat -lnupt
Jenkins 初始化配置
通过浏览器访问 10.0.0.12:8080(ip + 8080 端口)
查询本机 ip 的方式
ip addr
获取初始化密码
cat /var/lib/jenkins/secrets/initialAdminPassword
输入初始化密码后点击 Continue,出现如下界面
点击 ×,不选择提供的安装选项
点击 Start using Jenkins
由于默认 jenkins 的密码较复杂,所以首先更改 admin 用户的密码
Jenkins 插件管理
通过安装包加载插件
rz # 选择安装包(xshell 软件命令)
在 jenkins 插件目录中安装插件
cd /var/lib/jenkins/plugins/
解压安装包
tar xf plugins.tar.gz
将 plugins 中的文件全部复制到 jenkins 插件目录下
cd plugins
mv * /var/lib/jenkins/plugins/
检查是否复制成功
cd /var/lib/jenkins/plugins/
ll
重启 jenkins 服务
systemctl restart jenkins
回到浏览器中会发现已加载插件(注:非必要不更新)
Jenkins 目录介绍
通过命令查看目录
cd /var/lib/jenkins/plugins/
rpm -ql jenkins
Jenkins 构建一个自由风格的软件项目
执行创建的构建任务
修改 jenkins 用户为 root 用户(方便后续认证管理)
vim /etc/sysconfig/jenkins
重启 jenkins 服务
systemctl restart jenkins
获取 gitlab 源代码
前提准备
安装 git
yum -y install git
ssh 配置,进行权限认证
ssh-keygen -t rsa # 加三次回车
cat /root/.ssh/id_rsa.pub # 复制公钥,配置到 gitlab 上
点击“立即构建”,检查是否配置无误
也可以在终端查看是否拉取源代码成功
cd /var/lib/jenkins/workspace/My-freestyle-job/
ll
使用拉取的源代码部署 html 网站
在 ci-node1(10.0.0.11)上安装 httpd(Apache)服务,并配置服务端口为 10001
cd
yum -y install httpd
vim /etc/httpd/conf/httpd.conf
重启 httpd 服务
systemctl restart httpd
查看端口
netstat -lnupt
在浏览器中访问 10.0.0.11:10001
配置 ci-node2(10.0.0.12)到 ci-node1(10.0.0.11)的 ssh 免密码登录
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
ssh 10.0.0.11 # 测试是否配置成功
exit # 断开连接
在 ci-node2(10.0.0.12)上编写打包脚本
mkdir -p /server/scripts
cd /server/scripts
vim /server/scripts/deploy.sh
/server/scripts/deploy.sh
#!/bin/bash
#目标服务器 IP 地址
host=$1
#job 名称
job_name=$2
#包名
name=web-$(date +%F)-$(($RANDOM+10000))
#打包
cd /var/lib/jenkins/workspace/${job_name} && tar czf /opt/${name}.tar.gz ./*
#发送包到目标服务器
ssh ${host} "cd /var/www/ && mkdir ${name}"
scp /opt/${name}.tar.gz $host:/var/www/${name}
#解包
ssh ${host} "cd /var/www/${name} && tar xf ${name}.tar.gz && rm -f ${name}.tar.gz"
#使用软链接方式部署服务
ssh ${host} "cd /var/www && rm -rf html && ln -s /var/www/${name} /var/www/html"
/server/scripts/deploy.sh(无注释版)
#!/bin/bash
host=$1
job_name=$2
name=web-$(date +%F)-$(($RANDOM+10000))
cd /var/lib/jenkins/workspace/${job_name} && tar czf /opt/${name}.tar.gz ./*
ssh ${host} "cd /var/www/ && mkdir ${name}"
scp /opt/${name}.tar.gz $host:/var/www/${name}
ssh ${host} "cd /var/www/${name} && tar xf ${name}.tar.gz && rm -f ${name}.tar.gz"
ssh ${host} "cd /var/www && rm -rf html && ln -s /var/www/${name} /var/www/html"
执行 deploy.sh 脚本
sh /server/scripts/deploy.sh 10.0.0.11 My-freestyle-job
检查是否传输成功
# 在 ci-node1(10.0.0.11)上
ll /var/www/web-2023-08-30-39547
# 在 ci-node2(10.0.0.12)上
ll /opt/
在浏览器中访问 10.0.0.11:10001
在 Jenkins 中配置执行 deploy.sh 部署脚本
# 在 Command 中添加 shell 命令,执行脚本
sh /server/scripts/deploy.sh 10.0.0.11 ${JOB_NAME}
检查是否传输成功
# 在 ci-node1(10.0.0.11)上
ll /var/www/web-2023-08-30-31666
# 在 ci-node2(10.0.0.12)上
ll /opt/
Jenkins 配置 gitlab 自动触发构建(普通公司不建议使用,除非测试非常全面)
将 URL 和 Secret Token 配置到 gitlab 上
测试是否配置成功
gitlab 模拟测试
使用 ci-node1(10.0.0.11)测试
cd
git clone [email protected]:zylyehuo/monitor.git
cd monitor/
vim index.html
如图修改为 zylyehuo持续集成测试,进行测试
git add .
git commit -m "modify index.html on ci-node1"
git push -u origin master
Jenkins 配置返回构建状态到 gitlab
获取 gitlab 的 Access Tokens
配置 jenkins
配置测试
改动 index.html 进行测试
cd ~/monitor/
vim index.html
git add .
git commit -m "modify index.html on ci-node1 second"
git push -u origin master
Jenkins 安装、配置 maven(用于 Java 仓库)(Centos 7)
Maven 是一个项目管理和综合工具。Maven 提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven 使用标准的目录结构和默认构建生命周期。
Maven 简化和标准化项目建设过程。处理编译,分配,文档,团队协作和其他任务的无缝连接。 Maven 增加可重用性并负责建立相关的任务。
Maven 项目的结构和内容在一个 XML 文件中声明,pom.xml 项目对象模型(POM),这是整个 Maven 系统的基本单元。用来管理项目的构建,相关性和文档。最强大的功能就是能够自动下载项目依赖库。
cd /usr/local/src/
rz # xshell 指令,选择 3.3.9版本的 maven 安装包
tar xf apache-maven-3.3.9-bin.tar.gz
mv apache-maven-3.3.9 /usr/local/
由于文件名字太长,故进行软连接
cd /usr/local/
ln -s /usr/local/apache-maven-3.3.9/ /usr/local/maven
检查是否安装成功
/usr/local/maven/bin/mvn -v
将 mvn 命令加载到环境变量中
vim /etc/profile
# export PATH=/usr/local/apache-maven-3.3.9/bin/:$PATH
source /etc/profile
检验是否配置成功
mvn -v
上传一个 Java 项目进行测试使用
cd /usr/local/maven/
rz
mv hello-world.tar.gz /root/
tar xf hello-world.tar.gz
mvn 命令
位于有 pom.xml 文件的路径下
构建/打包
mvn package # 第一次执行时间会比较久
清除上一次构建的结果
mvn clean
测试
mvn test
将打包好的 jar/war 文件复制到 .m2 本地仓库中,供其他模块使用
mvn install
命令组合使用
mvn clean package # 按照顺序执行,先清除上一次构建的结果,再构建/打包
Jenkins 安装、配置 nexus(搭建 Maven 私服)
Nexus 是一个强大的 Maven 仓库管理器,它极大地简化了本地内部仓库的维护和外部仓库的访问。
Nexus 在代理远程仓库的同时维护本地仓库,以降低中央仓库的负荷,节省外网带宽和时间。
Nexus 是一套“开箱即用”的系统不需要数据库,它使用文件系统加 Lucene 来组织数据。
Nexus 使用 ExtJS 来开发界面,利用 Restlet 来提供完整的 REST APIs,通过 m2eclipse 与 Eclipse 集成使用。
Nexus 支持 WebDAV 与 LDAP 安全身份认证。
Nexus 还提供了强大的仓库管理功能,构件搜索功能,它基于 REST,友好的 UI 是一个 extjs 的 REST 客户端,它占用较少的内存,基于简单文件系统而非数据库。
在 ci-node3(10.0.0.13)上
cd /usr/local/src/
rz
rpm -ivh jdk-8u121-linux-x64.rpm # 安装 jdk
# java -version # 测试是否安装成功
mv nexus-3.13.0-01-unix.tar.gz /usr/local/
cd /usr/local/
tar xf nexus-3.13.0-01-unix.tar.gz # 解压
mv nexus-3.13.0-01-unix.tar.gz ./src/
ln -s /usr/local/nexus-3.13.0-01/ /usr/local/nexus # 软连接
调整配置文件
cd /usr/local/nexus/bin/
vim nexus.rc
nexus 命令
启动 nexus(带输出)
/usr/local/nexus/bin/nexus run
浏览器访问 10.0.0.13:8081,测试是否启动成功
启动 nexus(不带输出)
/usr/local/nexus/bin/nexus start
停止 nexus
/usr/local/nexus/bin/nexus stop
查看 nexus 状态
/usr/local/nexus/bin/nexus status
使用 admin 默认账户登录 nexus
Maven 全局(整个项目)配置
cd /usr/local/maven/conf/
vim settings.xml
<!--在<profiles></profiles>之间加入下面的配置-->
<profile>
<id>my-nexus</id>
<repositories>
<!-- 私有库地址-->
<repository>
<id>nexus</id>
<name>nexus</name>
<url>http://10.0.0.13:8081/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<!--插件库地址-->
<pluginRepository>
<id>nexus</id>
<url>http://10.0.0.13:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
<!--在<settings></settings>之间加入下面的配置,激活使用上面的配置-->
<activeProfiles>
<activeProfile>my-neuxs</activeProfile>
</activeProfiles>
<!--注:profile 名字要对应-->
<!--在<mirros></mirros>之间加入如下配置-->
<mirror>
<id>nexus-myself</id>
<!--*指的是访问任何仓库都使用我们的私服-->
<mirrorOf>*</mirrorOf>
<name>Nexus myself</name>
<url>http://10.0.0.13:8081/repository/maven-public/</url>
</mirror>
删除原先下载的 .m2 本地仓库,防止其直接在本地仓库下载,而不去访问远程仓库
cd /root/hello-world
rm -rf /root/.m2/
mvn clean
此时可以发现,访问的远程仓库地址以及发生改变,代表私服已经配置成功
Jenkins 构建一个 maven 项目
在 gitlab 上新建项目,用于在 jenkins 中进行配置
将本地仓库进行 git 初始化
git config --global user.name zylyehuo
git config --global user.email [email protected]
git init
git remote add origin [email protected]:root/helloworld.git
git add .
git commit -m "Initial commit"
git push -u origin master
将 gitlab 仓库中 ssh 地址配置到 jenkins 中
测试是否配置成功
Jenkins 构建一个 Pipeline 项目
Jenkins pipeline 是 Jenkins 2.0 的精髓, ,是帮助 Jenkins 实现 CI 到 CD 转变的重要角色。简单来说,就是一套运行于 Jenkins 上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Pipeline 的实现方式是一套 Groovy DSL,任何发布流程都可以表述为一段 Groovy 脚本,并且 Jenkins 支持从代码库直接读取脚本,从而实现了Pipeline as Code 的理念。
Pipeline 的基本概念
Stage:一个 Pipeline 可以划分为多个 Stage,每个 Stage 包含一组操作(Step)。注意一个 Stage 可以跨多个 Node 执行,即 Stage 实际上是 Step 的逻辑分组。
Node:一个 Node 就是一个 Jenkins 节点, 可以是 Master,或者是 Slave, 提供 Pipeline 中 Step 的具体运行环境。
Step:是最基本的操作单元,可以是创建一个目录、从代码库中 checkout 代码、执行一个 shell 命令、构建 Docker 镜像、将服务发布到 Kubernetes 集群中。Step 由 Jenkins 和 Jenkins Plugin 各种插件提供。
Jenkinsfile 语法
Jenkins Pipeline 支持两种语法, 一种 Declarative Pipeline(声明式), 一种 Scripted Pipeline(脚本式)。 声明式的 Pipeline 限制用户使用严格的预选定义的结构,是一种声明式的编程模型, 对比脚本式的 Pipeline 学习起来更加简单;脚本式的 Pipeline 限制比较少,结构和语法的限制由 Groovy 本身决定,是一种命令式的编程模型。一般来说 jenkinsfile 会被放在代码库的根目录下。当然也可以在 Web 页面定义。
Declarative Pipeline(声明式)(严格但简单)
声明式的 Pipeline 有严格的预定义格式结构, 最外层必须是 pipeline{},紧接着是 agent 指示 Jenkins 分配一个执行器和工作空间来执行下面的 Pipeline,stages 和 steps 是申明式 Jenkinsfile 必须的,所有的 stage 必须要定义在 stages 里,stage 的名称不能重复,每一个 stage 下的 step (具体的执行步骤)要定义在一个 steps 里
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Building..'
}
}
stage('Test') {
steps {
echo 'Testing..'
}
}
stage('Deploy') {
steps {
echo 'Deploying....'
}
}
}
}
Scripted Pipeline(脚本式)(需要学习 Groovy 脚本语言)
在脚本式 jenkinsfile 里,你可以定义一个 node 或者多个 node 块,然后在 node 块里定义你的 stage,在 stage 里定义你的 step 即可。
node {
stage('Build') {
//
}
stage('Test') {
//
}
stage('Deploy') {
//
}
}
通过 Web 页面创建 Pipeline 项目
测试效果
通过 SCM 获取 Jenkinsfile,创建 Pipeline 项目
在 gitlab 上的 monitor 仓库的根目录下创建一个 Jenkinsfile(名字尽量固定是这个)文件
pipeline {
agent any
stages {
stage('Stage 1') {
steps {
echo 'Hello world!'
}
}
}
}
在 Jenkins 新建一个 pipeline job
测试配置是否成功
在终端查看文件
ll /var/lib/jenkins/workspace/My-pipeline-job01
部署到 httpd 服务下
修改 gitlab 中 Jenkinsfile 文件
此 Jenkinsfile 包括五个 stage,分为 replace file、unit test、package、deploy、test,对于非编译项目,一般包括这五个阶段。
pipeline {
agent any
stages {
stage('replace file') {
steps {
echo "replace config file use cp "
}
}
stage('unit test') {
steps {
echo "unit test "
}
}
stage('package') {
steps {
sh 'tar czf /opt/web-${BUILD_ID}.tar.gz ./* --exclude=./git --exclude=Jenkinsfile'
}
}
stage('deploy') {
steps {
sh 'ssh 10.0.0.11 "cd /var/www && mkdir web-${BUILD_ID}"'
sh 'scp /opt/web-${BUILD_ID}.tar.gz 10.0.0.11:/var/www/web-${BUILD_ID}'
sh 'ssh 10.0.0.11 "cd /var/www/web-${BUILD_ID} && tar xf web-${BUILD_ID}.tar.gz && rm -f web-${BUILD_ID}.tar.gz"'
sh 'ssh 10.0.0.11 "cd /var/www && rm -rf html && ln -s /var/www/web-${BUILD_ID}" /var/www/html'
}
}
stage('test') {
steps {
echo "deploy after test "
}
}
}
}
在 jenkins 中点击“立即构建”,查看效果
在浏览器中访问 10.0.0.11:10001,查看效果
systemctl start httpd # 若访问浏览器打不开,先检查服务是否启动