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