jenkins与自动发布接口

1.安装

需先下载java环境
# 拉取库的配置到本地对应文件
0、wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
1、wget https://pkg.jenkins.io/redhat-stable/jenkins-2.190.1-1.1.noarch.rpm

2、yum install jenkins-2.190.1-1.1.noarch.rpm -y

# 修改配置文件,用户改成了root,端口8020
3、vim /etc/sysconfig/jenkins 
JENKINS_USER="root"
JENKINS_PORT="8020"

4、启动
systemctl start jenkins
systemctl enable jenkins

5.查看状态
[root@iZuf6fy2kg5mx828krkhcuZ qqc_data]# systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: active (running) since Sat 2020-10-17 16:24:29 CST; 16s ago
     Docs: man:systemd-sysv-generator(8)
   CGroup: /system.slice/jenkins.service
           └─22749 /etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar ...

Oct 17 16:24:27 iZuf6fy2kg5mx828krkhcuZ systemd[1]: Starting LSB: Jenkins Automation Server...
Oct 17 16:24:27 iZuf6fy2kg5mx828krkhcuZ runuser[22734]: pam_unix(runuser:session): session opened for user root by (uid=0)
Oct 17 16:24:29 iZuf6fy2kg5mx828krkhcuZ systemd[1]: Started LSB: Jenkins Automation Server.
Oct 17 16:24:29 iZuf6fy2kg5mx828krkhcuZ jenkins[22729]: Starting Jenkins [  OK  ]
[root@iZuf6fy2kg5mx828krkhcuZ qqc_data]# ps -aux | grep 8020
root     22749 32.0 14.6 2351276 148728 ?      Ssl  16:24   0:12 /etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=8020 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20
root     22907  0.0  0.0 112712   964 pts/2    S+   16:25   0:00 grep --color=auto 8020

6、访问
http://www.qqc-home.com:8020/
如下图显示即已安装成功

# 管理员登录密码位置:
vim /var/lib/jenkins/secrets/initialAdminPassword
登录名:admin

image

2、使用

2.1 啰嗦几句
ps: 配置了半天也没搞清楚怎么操作,各种选项操作太复杂了;
它的基本流程:手动在服务器执行发布任务命令的过程,进行封装后,可视化页面进行一键批量调用;
本质上就是干了这么一件事,附加了一些用户权限,发布日志记,异常发邮件等相关功能;
有兴趣的同学去jenkins官网(https://www.jenkins.io/zh/doc/)学一下,我暂时学不会啊

2.2 自己实现简易版发布接口
目标:在本地起一个flask 服务,写一个发布接口
(1) 建一个表,存发布日志信息,基本信息如:用户id,发布描述信息,服务器返回的日志等
(2)连接服务器,执行发布命令,日志信息入库,返回

逻辑代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/12/10 15:28
# @Author  : qqc
# @File    : release_tool.py
# @Software: PyCharm


import paramiko
import datetime
import json
from utils.connect_mysql import *


class ReleaseTools(object):
    def __init__(self, user_id, params):
        self.user_id = user_id
        self.params = params

    @property
    def ssh_connect(self):
        """ 连接服务器 """
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

        # 通过ssh 私钥登录
        ssh.connect(hostname='47.102.138.171', username='root', key_filename=r'C:\Users\admin\.ssh\id_rsa')
        return ssh

    @property
    def command(self):
        """ 发布的命令 """
        cmds = " cd /object/test_obj/django_test ; " \
               "git pull ; " \
               "supervisorctl restart test-django:test-django-uwsgi "
        return cmds

    def create_release_data(self, info_data):
        """ 记录发布日志 """
        sql_str = """
        INSERT INTO obj_release
        (user_id, params_data, out_data,create_time)
        VALUES
        ({0}, '{1}','{2}', NOW());
        """.format(self.user_id, self.params, info_data)

        cursor_sql(sql_str)

    def obj_release(self):
        """ 执行入口 """
        stdin, stdout, stderr = self.ssh_connect.exec_command(self.command)
        out = stdout.readlines()
        err = stderr.readlines()

        info_data = json.dumps({"out": out, "err": err}, ensure_ascii=False)
        self.create_release_data(info_data)
        self.ssh_connect.close()
        return {"user_id": self.user_id, "params_data": self.params, "out": out, "err": err,
                "create_time": datetime.datetime.now()}

调用路由(参数根据实际业务需求调节):
from flask import Flask, request, jsonify
from utils.release_tool import *

app = Flask(__name__)


@app.route('/get/release')
def release_objects():
    user_id = request.args.get("user_id", 0)
    params = request.args.get("params", '')
    release = ReleaseTools(user_id, params)
    res = release.obj_release()
    return jsonify(res)

3. 测试

image

image

问题:
1、多台服务器发布
2、用户使用权限配置
3、实际生产过程中,通过跳板机连接到生产服务器;
4、可视化页面操作
ps:优化是没完没了的过程,有兴趣的伙伴们来完善起来了啊
posted @ 2020-12-11 13:41  朝朝哥  阅读(463)  评论(0编辑  收藏  举报