文章目录
前言
一、使用Jenkins实现程序的自动化发布
1.安装Jenkins
二、安装Gitee插件
三、Ubuntu服务器相关编译环境配置
四、新建自动构建任务
五、Jenkins自动发布文件同步其他服务器
前言
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。
Jenkins中文网:http://www.jenkins.org.cn/
Jenkins官网:http://www.jenkins.org.cn/
一、使用Jenkins实现程序的自动化发布
1.安装Jenkins
1、安装java
代码语言:javascript复制sudo apt-get install openjdk-11-jre-headless
sudo apt-get install openjdk-11-jdk-headless
2、配置java环境
代码语言:javascript复制$ sudo vim /etc/environment
在此文件的末尾,添加以下行,确保使用您自己复制的路径替换突出显示的路径:
代码语言:javascript复制JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64/bin/java"
现在重新加载此文件:
代码语言:javascript复制$ source /etc/environment
验证是否已设置环境变量:
代码语言:javascript复制$ echo $JAVA_HOME
3、安装Jenkins
代码语言:javascript复制sudo apt-get install --reinstall ca-certificates
wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get -y update
sudo apt-get install jenkins
sudo ufw allow 8080 //开放8080端口防火墙
修改Jenkins执行用户
代码语言:javascript复制ps aux | grep jenkins //查看时谁启动的
sudo vim /usr/lib/systemd/system/jenkins.service //修改这两项 JENKINS_USER=root、JENKINS_GROUP=root 重启systemctl restart jenkins.service
systemctl daemon-reload
systemctl restart jenkins
默认端口是8080,通过http://127.0.0.1:8080/访问
根据提示找到密码输入就好了sudo cat /var/lib/jenkins/secrets/initialAdminPassword
一路点击就好了
4、安装完成
二、安装Gitee插件
这边以我的个人博客代码为例子,因为目前我的个人博客代码是托管到码云上,因此这里利用Gitee插件来实现持续发布功能
点击左侧 Dashboard->Manage Jenkins(系统管理) 菜单,并点击Manage Plugins(插件管理)
选择可选插件,然后输入Gitee,然后点 Download now and install after restart
这个插件主要是用于接收gitee WebHook通知(如:代码提交、PR等)并触发jenkins构建
安装成功后,前往 Jenkins -> Manage Jenkins(系统管理) -> Configure System(系统配置) -> Gitee Configuration(Gitee配置) ,对插件进行配置。
添加一个新的证书令牌,按照如下配置,GiteeAPIV5 私人令牌可以通过页面:https://gitee.com/profile/personal_access_tokens 生成,然后点击添加。
这个时候点击测试连接,查看确实连接上了。
三、Ubuntu服务器相关编译环境配置
代码语言:javascript复制sudo apt-get install -y openssh-server
systemctl enable ssh
sudo apt-get install dotnet-sdk-6.0
sudo apt-get install git
安装内网穿透工具案例地址:https://cloud.tencent.com/developer/article/2186419
后续会内穿到本地服务器
四、新建自动构建任务
1、进入 Dashboard->新建任务,输入任务名称,然后选择流水线。
2、General和触发器的配置
3、流水线配置
点击Credentials 右下方的添加按钮,添加用于拉取代码用的身份验证凭据。
需要注意的是:如果使用git ssh 协议(也就是格式为git开头的仓储地址),则添加身份验证凭据的时候,凭据类型只支持:Username with password (用户名和密码验证)、SSH Username with private key(用户名和私钥验证),用户名就是gitee的登录账号。
本人选择用户名和私钥验证
在服务器上输入以下命令创建身份验证凭据私钥,-C 后面的参数可以是任意内容,但通常用邮箱账号。
代码语言:javascript复制ssh-keygen -t ed25519 -C "xxxxx@xxxxx.com"
查看公钥
代码语言:javascript复制cat ~/.ssh/id_ed25519.pub
将公钥内容复制到gitee指定项目的 管理->部署公钥管理->添加公钥中添加指定公钥
gitee上添加公钥后,在服务器上执行以下命令
代码语言:javascript复制ssh -T git@gitee.com
通过执行以下命令读取ssh身份验证私钥内容,并输入到 jenkins 身份验证凭据的以下位置。
代码语言:javascript复制cat ~/.ssh/id_ed25519
4、脚本配置
在项目的解决方案文件(.sln)同级目录下新建名称为jenkinsfile的文件,并输入以下脚本内容
git 初始化配置
代码语言:javascript复制git init
git config --global --add safe.directory /www/wwwroot/test
git config --global credential.helper store //配置一次gite账户密码以后就不用了
代码语言:javascript复制pipeline {
agent any
stages {
stage('build') {
steps {
echo '开始拉取代码'
sh 'git pull origin master'
echo '切换到本地master分支'
sh 'git checkout master'
echo '当前工作目录及文件列表如下'
sh 'pwd'
sh 'ls -al'
dir("${WORKSPACE}/003-ABP-WEB") {
echo '开始编译前端站点'
sh 'dotnet publish ./003-ABP-WEB.csproj -c Release -r linux-x64 --no-restore'
}
//WORKSPACE表示存放代码的根目录。
dir("${WORKSPACE}/004-ABP-WPF"){
echo '开始编译后台站点'
sh 'dotnet publish ./004-ABP-WPF.csproj -c Release -r linux-x64 --no-restore'
}
}
}
stage('deploy')
{
steps {
echo '开始发布流程,当前工作目录如下'
sh 'pwd'
echo '开始发布个人前端系统'
echo '停止前端站点'
sh 'ssh -i ~/.ssh/id_rsa root@127.0.0.1 -p 1200 -T "systemctl stop 003-ABP-WEB"'
//dir函数里面要用环境变量记得用双引号,该函数用于改变当前目录,dir函数块里面包含的所有相对路径都是相对于dir指定的目录。
dir("${WORKSPACE}/003-ABP-WEB/bin/Release/netcoreapp6.0/linux-x64/publish/"){
//-i 用于指定ssh传输身份验证私钥,-r表示复制目录下的所有文件及子目录以及子目录下的所有文件,也可以将这个文件夹打包压缩后再传输。
sh 'scp -P 1200 -i ~/.ssh/id_rsa -r ./ root@127.0.0.1:/var/www/003-ABP-WEB'
}
echo '重启前端站点'
//这里不能使用-t 选项,应该使用-T 或 -tt 代理,否则无法正确执行。
sh 'ssh -i ~/.ssh/id_rsa root@127.0.0.1 -p 1200 -T "systemctl restart 003-ABP-WEB"'
echo '开始发布个人后台管理系统'
echo '停止后台站点'
sh 'ssh -i ~/.ssh/id_rsa root@127.0.0.1 -p 1200 -tt "systemctl stop 004-ABP-WPF"'
dir("${WORKSPACE}/004-ABP-WPF/bin/Release/netcoreapp3.1/linux-x64/publish/"){
sh 'scp -P 1200 -i ~/.ssh/id_rsa -r ./ root@127.0.0.1:/var/www/004-ABP-WPF'
}
echo '重启后台站点'
sh 'ssh -i ~/.ssh/id_rsa root@127.0.0.1 -p 1200 -tt "systemctl restart 004-ABP-WPF"'
echo '系统发布成功'
}
}
}
}
五、Jenkins自动发布文件同步其他服务器
在jenkins 服务器上执行以下命令,创建ssh 身份认证秘钥,并将公钥复制到应用服务器上,以便在编译成功后,直接复制dll到应用服务器上,而无需输入应用服务的登录密码,需要注意的是,创建秘钥前,先切换到jenkins用户账号。
代码语言:javascript复制ssh-keygen -t rsa
以下命令表示将jenkins所在服务器生成的公钥复制到应用服务器(因为~/.ssh/目录下已经有其他的秘钥,因此这边指定复制哪一个公钥)
代码语言:javascript复制ssh-copy-id -i ~/.ssh/id_rsa.pub root@IP -p 1200
以上两个命令执行成功后,可以创建一个文本文件进行测试,看下是否能无需输入密码就可以复制文件到应用服务器。
代码语言:javascript复制cd ~
touch test.txt
echo "测试内容" >> test.txt
以下命令用于将jenkins服务器上用户主目录下的test.txt文件复制到应用服务器上用户主目录。
代码语言:javascript复制# -P 表示应用服务器的ssh登录端口(如果不是22,必须指定),-i 后面跟的是jekins服务器上生成的私钥文件。
scp -P 1200 -i ~/.ssh/id_rsa ~/test.txt root@115.159.114.65:~