一、背景:
容器部署的selenium,如果出现以下场景:
- selenium脚本执行完没调用driver.quit()
- selenium执行过程中报错终止了代码
- 手动ctr+c终止中断运行
上面的场景都会导致容器里面的driver进程没有被释放,下次再跑selenium脚本,就会报错:502超时,链接不到remote driver。
解决方法,每次跑脚本前,手动重启一下容器,但是,如果在集成工具去执行脚本,不可能每次跑脚本前都去手动重启容器。
所以,需要通过代码自动化实现这一手动操作。
二、实现方案:
- 把ks的登录密码存储到redis,方便修改,因为经常几个月就需要改一次密码
- 在ks控制台查看login接口是返回302的,没有response.body,而是把cookie返回给response.headers的Set-Cookie。
- 在ks控制台查看重启容器的接口,需要传哪些信息。
import requests
import json
from helpers._redis import operate_redis
from datetime import datetime, timezone
import time
opr = operate_redis()
def redeploy_docker():
# ks登录跳转到302后,获取set-cookie
url = "http://ks.orgapp.com/login"
username = opr.find_redis_str("ks:username")
password = opr.find_redis_str("ks:password")
payload = json.dumps({"username":username,"encrypt": password})
headers = {
'content-type': "application/json"
}
# allow_redirects=False 参数表示不允许自动重定向,便会返回302,否则返回200,获取不到 set-cookie
# password = "***=@^fSn`ugM_oSgIxIW\\=G]",反斜杠被转义 \\\\,需要处理
response = requests.request("POST", url, headers=headers, data=payload.replace("\\\\","\\"), allow_redirects=False)
cookie = response.headers["Set-Cookie"]
# 重新部署docker-selenium容器
url = "http://ks.orgapp.com/apis/clusters/dev-iot4-oam/apps/v1/namespaces/devops/deployments/docker-selenium"
headers = {
'cookie': cookie,
# 这里需要看前端的传值,有些不一样
'content-type': "application/merge-patch+json"
}
# 获取当前时间
current_time = datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%S.%fZ')
payload = {"spec":{"template":{"metadata":{"annotations":{"kubesphere.io/restartedAt": str(current_time)}}}}}
response = requests.request("PATCH", url, json=payload, headers=headers)
# 等待容器重启
time.sleep(10)
if __name__ == "__main__":
redeploy_docker()
三、运行顺序
试过在scrapy框架里面调用 重启ks容器自动化的脚本,可还是经常出现连接remote-selenium超时的情况,猜测还是因为重启ks容器自动化的顺序不能在scrapy创建driver对象之前。
所以,简单粗暴些,在Jenkins的shell命令行里面,先直接执行ks的文件,再运行scrapy:文章来源:https://www.toymoban.com/news/detail-819765.html
文章来源地址https://www.toymoban.com/news/detail-819765.html
到了这里,关于重启ks容器自动化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!