执行[等待tomcat7]动作运行,

时间:2015-10-05 14:00:06

标签: tomcat jenkins amazon-ec2 chef knife

我正在建立一个连续的交付渠道,

  1. 创建一个新的aws实例,
  2. 安装运行Web应用程序所需的所有软件,
  3. 将Web应用程序部署到tomcat和
  4. 运行从GitHub测试仓库部署的一些Rake测试。
  5. 到目前为止一切都很好。我已经设置Jenkins使用以下命令

    执行shell脚本
     sudo knife ec2 server create -r 'recipe[apt],recipe[java],recipe[mysql_install],recipe[tomcat],recipe[deploy_tests_from_github],recipe[configure_db],recipe[deploy-app],recipe[start_tests]' -V
    

    部署顺利。唯一的问题是,当测试开始时,Chef似乎已关闭tomcat,因此Watir无法浏览到Web应用程序。

    大部分食谱都是直接从Chef Supermarket克隆而来,我正在使用这本食谱来进行tomcat https://supermarket.chef.io/cookbooks/tomcat

    我的start_test配方很简单

    execute "start_test" do
        command '/usr/local/bin/rake'
        cwd '/Watir_tests/test'
    end
    

    这是我输出的一部分,

    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0mRecipe: Deploy_App
    
    ::default[0m
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com   * service[tomcat7] action stop
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com     [32m- stop service service[tomcat7][0m
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m  * execute[wait for tomcat7] action run
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com     [32m- execute sleep 5[0m
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m  * remote_file[MyApp.war] action create
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com     [32m- create new file /var/lib/tomcat7/webapps/MyApp.war[0m
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com     [32m- update content in file /var/lib/tomcat7/webapps/MyApp.war from none to cd2ac4[0m
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com     [37m(file sizes exceed 10000000 bytes, diff output suppressed)[0m
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m  * service[tomcat7] action start
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com     [32m- start service service[tomcat7][0m
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m  * execute[wait for tomcat7] action run
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com     [32m- execute sleep 5[0m
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0mRecipe: start_tests::default[0m
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com   * execute[start_test] action run
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com     [0m
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com     ================================================================================[0m
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com     [31mError executing action `run` on resource 'execute[start_test]'[0m
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com     ================================================================================[0m
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com     
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m    Mixlib::ShellOut::ShellCommandFailed[0m
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com     ------------------------------------[0m
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com     Expected process to exit with [0], but received '1'
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m    ---- Begin output of /usr/local/bin/rake ----
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m    STDOUT: Run options: --seed 62510
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m    
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m    # Running:
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m    
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m    EEEEEE
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m    
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m    Finished in 330.793031s, 0.0181 runs/s, 0.0000 assertions/s.
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m    
        Error:
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m    LogInWithWrongPasswordTest#test_log_in_with_wrong_credentials:
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m    **Watir::Exception::UnknownObjectException: unable to locate element, using {:id=>"logInform:userName", :tag_name=>"input or textarea", :type=>"(any text type)"}**
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m        /var/lib/gems/1.9.1/gems/watir-webdriver-0.8.0/lib/watir-webdriver/elements/element.rb:533:in `assert_element_found'
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m        /var/lib/gems/1.9.1/gems/watir-webdriver-0.8.0/lib/watir-webdriver/elements/element.rb:505:in `assert_exists'
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m        /var/lib/gems/1.9.1/gems/watir-webdriver-0.8.0/lib/watir-webdriver/user_editable.rb:32:in `clear'
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m        /var/lib/gems/1.9.1/gems/watir-webdriver-0.8.0/lib/watir-webdriver/user_editable.rb:11:in `set'
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m        /Watir_tests/Pages/LogInPage.rb:14:in `login'
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m        /Watrit_tests/test/log_in_with_wrong_password_test.rb:15:in `test_log_in_with_wrong_credentials'
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m    
    ec2-52-88-49-226.us-west-2.compute.amazonaws.com [0m    
    

    如您所见,Watir无法找到网页元素,因为此时tomcat没有运行。

    有没有其他人遇到这样的事情?有解决方案吗?

    另请注意是否建议从Jenkins调用Knife ec2服务器创建命令。

    谢谢。

2 个答案:

答案 0 :(得分:0)

上面我的评论的长版本我会做(未经测试的代码,可能有拼写错误):

bash "Wait tomcat started" do
  code << -EOH
    for i in {1..10}; do
       tail -n 100 /path/to/catalina.out | grep "Server Startup" && exit 0
       sleep 20 
    done
    exit 1
  EOH
 notifies :run,"execute[start_test]", :immediately
end

我们的想法是检查服务器是否已经完成启动(如果您的应用程序在日志中有问题,请在100最后一行日志中查看启动行),如果是,则通知测试启动,或者在200秒后通知测试失败( 10次​​,间隔20秒)

我认为(仍然未经测试)这样的事情也可以做得更清楚:

execute "tail -n 100 /path/to/catalina.out | grep "Server Startup" do
  retries 10 
  retry_delay 20 
  notifies :run,'execute[start_test]', :immediately
end

答案 1 :(得分:0)

Or you can add test page and wait when tomcat has started

until (curl http://localhost:8080/status/ | grep "READY")
    do sleep 10
done
相关问题