summaryrefslogtreecommitdiff
path: root/lib/gitlab/ci
diff options
context:
space:
mode:
authorKamil Trzciński <ayufan@ayufan.eu>2017-04-06 18:55:34 +0000
committerKamil Trzciński <ayufan@ayufan.eu>2017-04-06 18:55:34 +0000
commit1815d44a7ffd86f8eefd42ae0eac59a6ade66e7f (patch)
tree6b61d8de4b0d6ff912b5ed6343922758447330e9 /lib/gitlab/ci
parentbef1aca8837f2306ecbd8ff70deb2204bf1da539 (diff)
parent9441c01484e668892d06f387fc0f85fe2d4ff4b4 (diff)
downloadgitlab-ce-1815d44a7ffd86f8eefd42ae0eac59a6ade66e7f.tar.gz
Merge branch '2989-run-cicd-pipelines-on-a-schedule-idea1-basic-backend-implementation' into 'master'
Resolve "Run CI/CD pipelines on a schedule" - "Basic backend implementation" See merge request !10133
Diffstat (limited to 'lib/gitlab/ci')
-rw-r--r--lib/gitlab/ci/cron_parser.rb34
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/gitlab/ci/cron_parser.rb b/lib/gitlab/ci/cron_parser.rb
new file mode 100644
index 00000000000..a3cc350ef22
--- /dev/null
+++ b/lib/gitlab/ci/cron_parser.rb
@@ -0,0 +1,34 @@
+module Gitlab
+ module Ci
+ class CronParser
+ VALID_SYNTAX_SAMPLE_TIME_ZONE = 'UTC'.freeze
+ VALID_SYNTAX_SAMPLE_CRON = '* * * * *'.freeze
+
+ def initialize(cron, cron_timezone = 'UTC')
+ @cron = cron
+ @cron_timezone = cron_timezone
+ end
+
+ def next_time_from(time)
+ @cron_line ||= try_parse_cron(@cron, @cron_timezone)
+ @cron_line.next_time(time).in_time_zone(Time.zone) if @cron_line.present?
+ end
+
+ def cron_valid?
+ try_parse_cron(@cron, VALID_SYNTAX_SAMPLE_TIME_ZONE).present?
+ end
+
+ def cron_timezone_valid?
+ try_parse_cron(VALID_SYNTAX_SAMPLE_CRON, @cron_timezone).present?
+ end
+
+ private
+
+ def try_parse_cron(cron, cron_timezone)
+ Rufus::Scheduler.parse("#{cron} #{cron_timezone}")
+ rescue
+ # noop
+ end
+ end
+ end
+end