前言

  • 环境情况

    工作中使用java+selenium+testng+maven+jedis+jenkins做WebUI自动化测试的过程中。使用Docker安装了JenkinsSelenium-Hubnode-Chrome(挂载在hub节点上)。项目运行逻辑为:Jenkins触发Git中的项目代码,项目代码触发hub节点,然后使用hub节点下的node节点进行UI自动化测试

  • 问题现象

    • 现象1:Jenkins构建项目的时间与当前时间对不上。
      在这里插入图片描述

    • 现象2:控制台输出中,项目代码中获取的当前时间与当前时间对不上。
      在这里插入图片描述

    • 现象3:最后再Jenkins上执行代码后,由于各个容器间的时区不一致,导致测试出错。
      在这里插入图片描述

  • 解决思路

    • 将Jenkins、Selenium-Hub、node-chrome容器的时区设置成Asia/Shanghai。

一、脚本命令行

    系统管理->脚本命令行->输入命令->点击运行

System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone','Asia/Shanghai')

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、Docker容器时区

2.1 查看服务器时区

    使用timedatectl | grep Time命令查看时区信息,使用date命令查看当前时间。

[rzh@hcf-web3 ~]$ timedatectl | grep Time
       Time zone: Asia/Shanghai (CST, +0800)
[rzh@hcf-web3 ~]$ date
2020年 05月 05日 星期二 17:56:54 CST

2.2 设置服务器时区

    使用timedatectl set-timezone "Asia/Shanghai"命令可以设置服务器当前时区为上海

[root@localhost yff]# timedatectl | grep Time
       Time zone: America/Los_Angeles (PDT, -0700)
[root@localhost yff]# date
Tue May  5 03:06:45 PDT 2020

//使用timedatectl set-timezone "Asia/Shanghai"命令设置服务器当前时区为上海
[root@localhost yff]# timedatectl set-timezone "Asia/Shanghai"
[root@localhost yff]# date
Tue May  5 18:06:56 CST 2020
[root@localhost yff]# timedatectl | grep Time
       Time zone: Asia/Shanghai (CST, +0800)
[root@localhost yff]# 

2.3 设置容器时区

    由于设置过程中可能需要进入容器中,所以需要进入容器内,就使用docker exec -u 0 -it [容器id] /bin/bash进入容器中。

//查看运行中的Docker容器
[root@localhost yff]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                               NAMES
a23b83c6196b        jenkins/jenkins:lts   "/sbin/tini -- /usr/…"   3 hours ago         Up 3 seconds        0.0.0.0:8080->8080/tcp, 50000/tcp   jenkins
//进入指定容器 docker exec -u 0 -it [容器id]  /bin/bash
[root@localhost yff]# docker exec -u 0 -it a23b83c6196b  /bin/bash
root@a23b83c6196b:/# 

    在设置完本地时区后,就是设置容器的时区。按照操作文件可以分为两种:一种为操作/etc/localtime文件,另一种为操作/usr/share/zoneinfo/Asia/Shanghai文件。按照操作命令也可以分为两种:一种是宿主机中执行docker cp命令,另一种是Docker容器中执行ln -sf命令。

[root@localhost yff]# cat /etc/localtime 
TZif ¢¡y񇘞	񊓽ˊ񊻀л>񓊻ӂ­񔃢Ռ¿񕼿ֆfpם򁘁|򞹒 i ~ !I}"g¡ #)_$G %|&'e &񜎨G (р~pCDTCSTTZif2 
                                                                              ÿÿÿÿ~6C)ÿÿÿÿ ¢ÿÿÿÿ¡y򁀿ÿǙ^ÿÿÿÿ	򁀿ÿʓ½ÿÿÿÿˊ򁀿ÿʼ@ÿÿÿÿл>򁀿ÿӋ{ÿÿÿÿӂ­򁀿ÿԅ"ÿÿÿÿՌ¿򁀿ÿռ¿ÿÿÿÿֆfpÿÿÿÿם򂀿ÿÿ؁|򞹒 i ~ !I}"g¡ #)_$G %|&'e &񜎨G (рq־LMTCDTCST
CST-8
[root@localhost yff]# cat /usr/share/zoneinfo/Asia/Shanghai 
TZif ¢¡y񇘞	񊓽ˊ񊻀л>񓊻ӂ­񔃢Ռ¿񕼿ֆfpם򁘁|򞹒 i ~ !I}"g¡ #)_$G %|&'e &񜎨G (р~pCDTCSTTZif2 
                                                                              ÿÿÿÿ~6C)ÿÿÿÿ ¢ÿÿÿÿ¡y򁀿ÿǙ^ÿÿÿÿ	򁀿ÿʓ½ÿÿÿÿˊ򁀿ÿʼ@ÿÿÿÿл>򁀿ÿӋ{ÿÿÿÿӂ­򁀿ÿԅ"ÿÿÿÿՌ¿򁀿ÿռ¿ÿÿÿÿֆfpÿÿÿÿם򂀿ÿÿ؁|򞹒 i ~ !I}"g¡ #)_$G %|&'e &񜎨G (рq־LMTCDTCST
CST-8

    下面给出了几中种命令,在执行命令后,进入容器中,使用date命令,查看容器内的时区是否与服务器本地时区一致(查看是CST还是UTC,且是否与服务器本地一致)。时区一致为CST就可以了。
在这里插入图片描述

  • 宿主机执行(/etc/localtime)
//将本地的localtime文件复制到node-chrome容器(b5352282c931为node-chrome的id)中
docker cp /etc/localtime b5352282c931:/etc/localtime
  • 宿主机执行(/usr/share/zoneinfo/Asia/Shanghai)
//将本地的/usr/share/zoneinfo/Asia/Shanghai文件复制到node-chrome容器中
docker cp  /usr/share/zoneinfo/Asia/Shanghai 6e5178698ed7:/etc/localtime
  • 容器中执行(/usr/share/zoneinfo/Asia/Shanghai)
//在node-chrome容器中执行下面命令,链接宿主机localtime
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

三、Rancher环境变量

    如果是使用Rancher管理镜像并生成容器搭建情况下,配置jenkins、hub、node-chrome三个镜像生成容器时,添加环境变量:TZ=Asia/Shanghai
在这里插入图片描述
在这里插入图片描述

四、扩展

    在Jenkins中,可以针对不同登录用户设置时区,操作步骤如下图。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐