基于ubuntu18.04搭建一套持续集成、部署的系统,在本地推送(push)代码到Gitlab后,通过Gitlab的webhook触发Jenkins任务,自动拉取代码并部署到生产服务器运行。

1. Jenkins搭建

  • 查看是否安装了java

java -version

  • 如果没有安装java,则执行下面的命令安装

sudo apt-get install openjdk-8-jre

  • 配置java环境变量,在/etc/profile中添加以下内容:

    #set jdk environment 
    export JAVA_HOME=/usr/lib/jvm/Java-8-openjdk-amd64
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
  • 使配置文件生效

source /etc/profile

  • 安装Jenkins
  • 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 update
  • sudo apt-get install jenkins

java -jar /usr/share/jenkins/jenkins.war
由于8080端口可能被占用,建议改端口:
vim /etc/default/jenkins ,找到HTTP_PORT=8080 这一项,将其改为其他端口
然后重启sudo systemctl restart jenkins

参考:https://blog.csdn.net/lsl520hah/article/details/102839940

2. 生产服务器准备(ubuntu18.04)

  • 将Django项目文件夹mipin拷贝到生产服务器/home/ubuntu路径下

    2.1 python安装

  • python3.7安装参考:https://zhuanlan.zhihu.com/p/62930419

  • python安装完成后,开始安装虚拟环境virtualenv

sudo pip3.7 install virtualenv
sudo pip3.7 install virtualenvwrapper

  • 配置环境变量vim ~/.bashrc ,加入以下内容

    export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python3.7
    export WORKON_HOME=/home/ubuntu/.virtualenvs
    export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
    source /usr/local/bin/virtualenvwrapper.sh
  • source ~/.bashrc

  • 创建名为mipin的虚拟环境(作为Django项目运行的虚拟环境)

mkvirtualenv mipin
pip install -r /home/ubuntu/mipin/requirements.txt

2.2 部署Django项目

这里使用uwsgi来运行Django项目,并通过supervisor来管理进程
详见:https://www.yuque.com/docs/share/2ccfaa59-827c-4549-9a6e-1c214c02c2b6?# 《Supervisor使用》

3. Jenkins及Gitlab配置

3.1 安装jenkins插件

  • 需要安装的插件有Gitlab HookBuild Authorization Token RootPublish Over SSHGitlab AuthenticationGitlabGit Parameter

1.png

2.png

3.png

  • 安装完插件,重启jenkins

3.2 配置SSH密钥

  • 首先在jenkins所在的主机上生成一对SSH密钥

ssh-keygen -t rsa -P ''
执行这条命令,会在~/.ssh目录下创建2个文件: id_rsa (私钥) 、id_rsa.pub (公钥)

  • 然后将公钥发送到需要部署代码的主机

ssh-copy-id -i ~/.ssh/id_rsa.pub <IP> 即需要部署代码的目标主机的ip
之后在jenkins所在主机上直接使用ssh <IP> 看是否能免密码登录到目标主机
若还有问题请参考:https://www.cnblogs.com/jager/p/5986563.html

  • 将私钥以及SSH主机配置到jenkins系统设置中

打开系统设置
4.png
复制私钥内容填入
5.png
添加目标服务器(点击Add)
6.png
(如果需要配置多台服务器,同样按上面方法将jenkins所在主机的公钥发到目标服务器,再到这里点击Add添加即可)
点击save保存

3.3 新建jenkins项目

  • 新建项目

7.png

8.png

  • 配置项目

点击Add添加Git认证密钥
9.png
复制自己开发电脑的私钥到这里(前提是已经在Gitlab上添加了自己的公钥)
10.png

  • 如何在Gitlab上添加公钥

点击Gitlab右上角个人中心的Settings进入设置页面
11.png

  • 配置build triggers(记录url以及secret token,用于后面Gitlab中webhook的配置)

12.png
点击Advanced
13.png

  • 配置部署参数

在部署的时候,有时可能需要配置一些可变参数,这些参数能够在后续执行部署脚本(Exec command)的时候获取到
微信截图_20201221100828.png

  • 配置构建步骤

这里同样可以配置多个服务器,点击Add server添加即可
另外,建议将Advanced中Exec timeout(命令执行的超时时间)调整大一点 , 按照下图配置

14.png
Exec command一栏即代码传输到服务器之后需要执行的构建步骤,上图是一个简单的示例。实际生产中,我们是使用supervisor来管理进程,并且还需要进行代码备份,以方便后续回滚,一个完整的脚本如下:

case $Status  in
Deploy)
echo "Status:$Status"
bak_path="/home/ubuntu/bak/mipin/${BUILD_NUMBER}" #创建每次要备份的目录
if [ -d $bak_path ];
then
echo "The files is already exists "
else
sudo mkdir -p $bak_path
fi
\sudo cp -rf /home/ubuntu/mipin/* $bak_path #将项目备份到相应目录,覆盖已存在的目标
sudo /home/ubuntu/.virtualenvs/mipin/bin/pip install -r /home/ubuntu/mipin/requirements.txt
sudo supervisorctl restart mipin
echo "Completing!"
;;
Rollback)
echo "Status:$Status"
echo "Version:$Version"
cd /home/ubuntu/bak/mipin/$Version #进入备份目录
\sudo cp -rf ./* /home/ubuntu/mipin/ #将备份拷贝到程序打包目录中
sudo supervisorctl restart mipin
;;
*)
exit
;;
esac

# 删除旧的代码
ReservedNum=5 #保留文件数
FileDir=/home/ubuntu/bak/mipin
date=$(date "+%Y%m%d-%H%M%S")

cd $FileDir #进入备份目录
FileNum=$(ls -l | grep '^d' | wc -l) #当前有几个文件夹,即几个备份

while(( $FileNum > $ReservedNum))
do
OldFile=$(ls -rt | head -1) #获取最旧的那个备份文件夹
echo $date "Delete File:"$OldFile
sudo rm -rf $FileDir/$OldFile
let "FileNum--"
done

3.4 Gitlab配置webhook

15.png
测试
16.png

3.5 如何查看部署结果

做完以上步骤,可以尝试在本地push代码到Gitlab,然后登陆Jenkins查看部署结果
17.png
点击console output查看控制台输出
18.png

3.6 回滚

由于在配置时加入了构建参数,因此我们可以在手动构建的时候根据情况选择
jenkins222.png

4. 参考文章

Ubuntu18.04安装Jenkins : https://blog.csdn.net/lsl520hah/article/details/102839940
Gitlab + Jenkins实现自动部署:https://blog.51cto.com/bigboss/2129477



CI/CD      CI/CD Jenkins

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!