mirror of
https://git.oceanpay.cc/danial/kami_ctrip.git
synced 2025-12-18 21:50:51 +00:00
feat: 添加 Drone CI 配置和 Docker 镜像构建
- 新增 .drone.yml 文件,配置 Drone CI/CD 流程 - 添加 Dockerfile,定义应用的 Docker 镜像构建过程 - 新增 app.py 文件,实现携程卡绑定功能 - 添加 __pycache__ 目录,存放编译后的 Python 文件
This commit is contained in:
48
.drone.yml
Normal file
48
.drone.yml
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: ssh
|
||||||
|
name: master-machine
|
||||||
|
|
||||||
|
server:
|
||||||
|
host: 38.38.251.113:31245
|
||||||
|
user: root
|
||||||
|
password:
|
||||||
|
from_secret: www_password
|
||||||
|
|
||||||
|
clone:
|
||||||
|
depth: 1
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build new image
|
||||||
|
environment:
|
||||||
|
DOCKER_LOGIN:
|
||||||
|
from_secret: docker_login
|
||||||
|
DOCKER_TOKEN:
|
||||||
|
from_secret: docker_token
|
||||||
|
DOCKER_PASSWORD:
|
||||||
|
from_secret: docker_password
|
||||||
|
commands:
|
||||||
|
- echo "$DOCKER_PASSWORD" | docker login -u $DOCKER_LOGIN --password-stdin docker.kkknametrans.buzz
|
||||||
|
- docker build -t docker.kkknametrans.buzz/kami/ctrip_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER} -f deploy/Dockerfile . --build-arg USE_PROXY=0
|
||||||
|
- docker tag docker.kkknametrans.buzz/kami/ctrip_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER} docker.kkknametrans.buzz/kami/ctrip_${DRONE_BRANCH}:latest
|
||||||
|
- docker push docker.kkknametrans.buzz/kami/ctrip_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER}
|
||||||
|
- docker push docker.kkknametrans.buzz/kami/ctrip_${DRONE_BRANCH}:latest
|
||||||
|
- docker logout docker.kkknametrans.buzz
|
||||||
|
- docker login git.kkknametrans.buzz -u $DOCKER_LOGIN -p $DOCKER_TOKEN
|
||||||
|
- docker tag docker.kkknametrans.buzz/kami/ctrip_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER} git.kkknametrans.buzz/danial/kami_ctrip_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER}
|
||||||
|
- docker tag docker.kkknametrans.buzz/kami/ctrip_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER} git.kkknametrans.buzz/danial/kami_ctrip_${DRONE_BRANCH}:latest
|
||||||
|
- docker push git.kkknametrans.buzz/danial/ctrip_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER}
|
||||||
|
- docker push git.kkknametrans.buzz/danial/kami_ctrip_${DRONE_BRANCH}:latest
|
||||||
|
- docker logout git.kkknametrans.buzz
|
||||||
|
- name: deploy to docker compose
|
||||||
|
environment:
|
||||||
|
DOCKER_LOGIN:
|
||||||
|
from_secret: docker_login
|
||||||
|
DOCKER_TOKEN:
|
||||||
|
from_secret: docker_token
|
||||||
|
DOCKER_PASSWORD:
|
||||||
|
from_secret: docker_password
|
||||||
|
commands:
|
||||||
|
- echo "$DOCKER_PASSWORD" | docker login -u $DOCKER_LOGIN --password-stdin docker.kkknametrans.buzz
|
||||||
|
- BRANCH=${DRONE_BRANCH} VERSION=${DRONE_BUILD_NUMBER} docker compose -f /data/kami/docker-compose.yml --profile itunes up -d
|
||||||
|
- docker logout docker.kkknametrans.buzz
|
||||||
36
Dockerfile
Normal file
36
Dockerfile
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# 基于 Python 3.8.6 镜像
|
||||||
|
FROM python:3.8.6
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# 设置工作目录
|
||||||
|
ENV FLASK_APP=app.py
|
||||||
|
# 复制项目
|
||||||
|
ADD . /app
|
||||||
|
|
||||||
|
# 修改apt-get源地址为阿里云镜像
|
||||||
|
RUN echo "" > /etc/apt/sources.list && \
|
||||||
|
echo "deb http://mirrors.aliyun.com/debian buster main" >> /etc/apt/sources.list && \
|
||||||
|
echo "deb http://mirrors.aliyun.com/debian-security buster/updates main" >> /etc/apt/sources.list && \
|
||||||
|
echo "deb http://mirrors.aliyun.com/debian buster-updates main" >> /etc/apt/sources.list
|
||||||
|
|
||||||
|
# 安装cv2依赖和其他依赖
|
||||||
|
RUN apt-get update && apt-get install -y libgl1-mesa-glx libglib2.0-0
|
||||||
|
|
||||||
|
# 下载并安装 Node.js
|
||||||
|
RUN wget https://nodejs.org/dist/v16.13.0/node-v16.13.0-linux-x64.tar.gz && \
|
||||||
|
tar -xvf node-v16.13.0-linux-x64.tar.gz && \
|
||||||
|
mv node-v16.13.0-linux-x64 /usr/local/nodejs && \
|
||||||
|
ln -s /usr/local/nodejs/bin/node /usr/local/bin && \
|
||||||
|
ln -s /usr/local/nodejs/bin/npm /usr/local/bin && \
|
||||||
|
rm node-v16.13.0-linux-x64.tar.gz
|
||||||
|
|
||||||
|
# python环境包
|
||||||
|
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple gunicorn gevent
|
||||||
|
RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
|
||||||
|
|
||||||
|
# 暴露容器端口
|
||||||
|
EXPOSE 5001
|
||||||
|
|
||||||
|
# 运行应用
|
||||||
|
CMD ["gunicorn", "-c", "gun.conf", "app:app"]
|
||||||
BIN
__pycache__/app.cpython-38.pyc
Normal file
BIN
__pycache__/app.cpython-38.pyc
Normal file
Binary file not shown.
BIN
__pycache__/ctrip.cpython-38.pyc
Normal file
BIN
__pycache__/ctrip.cpython-38.pyc
Normal file
Binary file not shown.
BIN
__pycache__/logger.cpython-38.pyc
Normal file
BIN
__pycache__/logger.cpython-38.pyc
Normal file
Binary file not shown.
59
app.py
Normal file
59
app.py
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
import json
|
||||||
|
|
||||||
|
from flask import Flask, g, request, jsonify
|
||||||
|
|
||||||
|
from ctrip import CtripLogin
|
||||||
|
from logger import get_logger
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
logger = get_logger()
|
||||||
|
|
||||||
|
|
||||||
|
@app.before_request
|
||||||
|
def before_request():
|
||||||
|
g.ip_list = None
|
||||||
|
g.order_num = None
|
||||||
|
g.ck = None
|
||||||
|
g.card_num = None
|
||||||
|
g.card_pwd = None
|
||||||
|
g.money = None
|
||||||
|
g.proxies = {}
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/xiecheng/v3/card/bind', methods=['GET', 'POST'])
|
||||||
|
def bind_card_v3():
|
||||||
|
if request.method == 'GET':
|
||||||
|
return 'okk'
|
||||||
|
elif request.method == 'POST':
|
||||||
|
# 接收参数
|
||||||
|
data = json.loads(request.get_data())
|
||||||
|
g.ck = data.get("ck")
|
||||||
|
g.card_num = data.get("card_num")
|
||||||
|
g.card_pwd = data.get("card_pwd")
|
||||||
|
g.order_num = data.get("order_num")
|
||||||
|
g.money = data.get("money")
|
||||||
|
# 绑卡
|
||||||
|
trip = CtripLogin(
|
||||||
|
cookies=g.ck,
|
||||||
|
card_num=g.card_num,
|
||||||
|
card_pwd=g.card_pwd,
|
||||||
|
price=g.money,
|
||||||
|
order_num=g.order_num
|
||||||
|
)
|
||||||
|
res = trip.run()
|
||||||
|
logger.info(f"订单ID:{g.order_num},返回速代充:{res}")
|
||||||
|
if res.get("code") == 111:
|
||||||
|
for _ in range(5):
|
||||||
|
res = trip.check_card()
|
||||||
|
logger.info(f"订单ID:{g.order_num},未知重新查卡返回:{res}")
|
||||||
|
if res.get("code") in [110, 2001]:
|
||||||
|
res = {'code': 110, 'msg': '重新查卡返回可重新绑卡', 'data': {}}
|
||||||
|
return jsonify(res)
|
||||||
|
if res.get("code") == 111:
|
||||||
|
continue
|
||||||
|
res = {'code': 111, 'msg': '重新查卡未知', 'data': {}}
|
||||||
|
return jsonify(res)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run()
|
||||||
19
gun.conf
Normal file
19
gun.conf
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# 并行工作进程数
|
||||||
|
workers = 2
|
||||||
|
# 指定每个工作者的线程数
|
||||||
|
threads = 4
|
||||||
|
# 监听内网端口80
|
||||||
|
bind = '0.0.0.0:5001'
|
||||||
|
# 工作模式协程
|
||||||
|
worker_class = 'gevent'
|
||||||
|
# 设置最大并发量
|
||||||
|
worker_connections = 2000
|
||||||
|
# 设置进程文件目录
|
||||||
|
pidfile = 'gunicorn.pid'
|
||||||
|
# 设置访问日志和错误信息日志路径
|
||||||
|
accesslog = '-'
|
||||||
|
errorlog = '-'
|
||||||
|
# 设置日志记录水平
|
||||||
|
loglevel = 'info'
|
||||||
|
# 代码发生变化是否自动重启
|
||||||
|
reload = True
|
||||||
29
logger.py
Normal file
29
logger.py
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
from loguru import logger
|
||||||
|
import sys
|
||||||
|
import pytz
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
# 移除默认的日志处理器
|
||||||
|
logger.remove()
|
||||||
|
|
||||||
|
# 设置中国时区
|
||||||
|
china_tz = pytz.timezone("Asia/Shanghai")
|
||||||
|
|
||||||
|
|
||||||
|
# 自定义时间格式函数
|
||||||
|
def custom_time():
|
||||||
|
return datetime.now(china_tz).strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
|
||||||
|
|
||||||
|
# 添加新的处理器,输出到控制台
|
||||||
|
logger.add(sys.stdout, format="{time:YYYY-MM-DD HH:mm:ss} {level} {message}", level="INFO", serialize=False)
|
||||||
|
|
||||||
|
# 添加文件日志处理器
|
||||||
|
logger.add("xiecheng.log", rotation="20 MB", retention="30 days", format="{time:YYYY-MM-DD HH:mm:ss} {level} {message}")
|
||||||
|
|
||||||
|
# 创建一个带有时间信息的 Logger
|
||||||
|
logger = logger.bind(time=custom_time())
|
||||||
|
|
||||||
|
|
||||||
|
def get_logger():
|
||||||
|
return logger
|
||||||
14
requirements.txt
Normal file
14
requirements.txt
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
flask==3.0.3
|
||||||
|
flask_cors==4.0.1
|
||||||
|
opencv-python-headless==4.9.0.80
|
||||||
|
pillow==10.3.0
|
||||||
|
requests==2.32.3
|
||||||
|
urllib3==1.26.2
|
||||||
|
pyexecjs==1.5.1
|
||||||
|
gunicorn==22.0.0
|
||||||
|
gevent==24.2.1
|
||||||
|
selenium==3.141.0
|
||||||
|
pillow==10.3.0
|
||||||
|
pycryptodome==3.21.0
|
||||||
|
pytz==2024.2
|
||||||
|
loguru==0.7.2
|
||||||
Reference in New Issue
Block a user