【愚公系列】2022年12月 使用Jenkins实现程序的自动化发布

2022-12-30 15:27:22 浏览数 (1)

文章目录

前言

一、使用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:~

0 人点赞