Revert "Remove support for Sauce labs" This reverts commit abae192cfdebe179aaf3be1923dad745fc0fa78c.
diff --git a/docs/owner.md b/docs/owner.md index 64d62cd..8958ea8 100644 --- a/docs/owner.md +++ b/docs/owner.md
@@ -61,6 +61,12 @@ concurrently; otherwise runs the job's configurations one after the other + Useful if the job uses some exclusive resource such as [Sauce + Labs](https://wiki.saucelabs.com/). + +* `sauce_enabled`: activates or deactivates [Sauce + Labs](https://wiki.saucelabs.com/) support + ### `bazel_git_job` parameters The `bazel_git_job` rule takes the same parameters as `bazel_github_job`, but
diff --git a/jenkins/base/plugins.bzl b/jenkins/base/plugins.bzl index c269e39..2993768 100644 --- a/jenkins/base/plugins.bzl +++ b/jenkins/base/plugins.bzl
@@ -182,6 +182,8 @@ '666cbc579d82849bef8d0396a57335c9994222e8b0ba52f07be76dab9fb56c40'], 'run-condition': ['1.0', '4e55ebf4bde1202784404d856f98f7de85470ed145cde06feb45f641891780fb'], + 'sauce-ondemand': ['1.171', + '5a7a1e1eccb199d82227e41e9bce655d33b2e33219f40a9cd0c884780cc26ae8'], 'scm-api': ['2.2.6', 'be7cb7c513ebeb361a8ccb5c636541313c1c54b3119566b969fe10a3552cca14'], 'script-security': ['1.39',
diff --git a/jenkins/build_defs/bazel-job-Gerrit.xml.tpl b/jenkins/build_defs/bazel-job-Gerrit.xml.tpl index 538b531..c008779 100644 --- a/jenkins/build_defs/bazel-job-Gerrit.xml.tpl +++ b/jenkins/build_defs/bazel-job-Gerrit.xml.tpl
@@ -60,6 +60,9 @@ bazel_version: "latest", configuration: '''{{ raw_imports['JSON_CONFIGURATION'].replace('\\', '\\\\').replace("'", "\\'") }}''', workspace: "{{ variables.WORKSPACE }}", + {% if variables.SAUCE_ENABLED == "true" %} + sauce: "61b4846b-279d-4369-ae20-31e9d8b9bc66", + {% endif %} run_sequentially: {{ variables.RUN_SEQUENTIAL }}, restrict_configuration: {{ variables.RESTRICT_CONFIGURATION }} )
diff --git a/jenkins/build_defs/bazel-job-Global.xml.tpl b/jenkins/build_defs/bazel-job-Global.xml.tpl index a01efd0..6826b74 100644 --- a/jenkins/build_defs/bazel-job-Global.xml.tpl +++ b/jenkins/build_defs/bazel-job-Global.xml.tpl
@@ -60,6 +60,9 @@ extra_bazelrc: params.EXTRA_BAZELRC, configuration: '''{{ raw_imports['JSON_CONFIGURATION'].replace('\\', '\\\\').replace("'", "\\'") }}''', workspace: "{{ variables.WORKSPACE }}", + {% if variables.SAUCE_ENABLED == "true" %} + sauce: "61b4846b-279d-4369-ae20-31e9d8b9bc66", + {% endif %} run_sequentially: {{ variables.RUN_SEQUENTIAL }}, restrict_configuration: {{ variables.RESTRICT_CONFIGURATION }} )
diff --git a/jenkins/build_defs/bazel-job-PR.xml.tpl b/jenkins/build_defs/bazel-job-PR.xml.tpl index fd62b3a..bf7eea5 100644 --- a/jenkins/build_defs/bazel-job-PR.xml.tpl +++ b/jenkins/build_defs/bazel-job-PR.xml.tpl
@@ -66,6 +66,9 @@ bazel_version: "latest", configuration: '''{{ raw_imports['JSON_CONFIGURATION'].replace('\\', '\\\\').replace("'", "\\'") }}''', workspace: "{{ variables.WORKSPACE }}", + {% if variables.SAUCE_ENABLED == "true" %} + sauce: "61b4846b-279d-4369-ae20-31e9d8b9bc66", + {% endif %} run_sequentially: {{ variables.RUN_SEQUENTIAL }}, restrict_configuration: {{ variables.RESTRICT_CONFIGURATION }} )
diff --git a/jenkins/build_defs/bazel-job.xml.tpl b/jenkins/build_defs/bazel-job.xml.tpl index 389bb2a..8d7bf8b 100644 --- a/jenkins/build_defs/bazel-job.xml.tpl +++ b/jenkins/build_defs/bazel-job.xml.tpl
@@ -47,6 +47,9 @@ bazel_version: "latest", configuration: '''{{ raw_imports['JSON_CONFIGURATION'].replace('\\', '\\\\').replace("'", "\\'") }}''', workspace: "{{ variables.WORKSPACE }}", + {% if variables.SAUCE_ENABLED == "true" %} + sauce: "61b4846b-279d-4369-ae20-31e9d8b9bc66", + {% endif %} run_sequentially: {{ variables.RUN_SEQUENTIAL }}, restrict_configuration: {{ variables.RESTRICT_CONFIGURATION }} )
diff --git a/jenkins/build_defs/jenkins_job.bzl b/jenkins/build_defs/jenkins_job.bzl index 2d09db9..dc09f0a 100644 --- a/jenkins/build_defs/jenkins_job.bzl +++ b/jenkins/build_defs/jenkins_job.bzl
@@ -119,6 +119,7 @@ pr_enabled=True, github_enabled=True, run_sequential=False, + sauce_enabled=False, use_upstream_branch=False): """Create a generic github job configuration to build against Bazel head.""" if poll == None: @@ -137,6 +138,7 @@ "github": str(github_enabled), "GERRIT_PROJECT": str(gerrit_project) if gerrit_project else "", "RUN_SEQUENTIAL": str(run_sequential).lower(), + "SAUCE_ENABLED": str(sauce_enabled).lower(), "GLOBAL_USE_UPSTREAM_BRANCH": str(use_upstream_branch) }
diff --git a/jenkins/config/credentials.xml b/jenkins/config/credentials.xml index 8065814..a5f664e 100644 --- a/jenkins/config/credentials.xml +++ b/jenkins/config/credentials.xml
@@ -13,6 +13,13 @@ <username>bazel-io</username> <password>##SECRET:github.bazel-io.jenkins.password##</password> </com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl> + <hudson.plugins.sauce_ondemand.credentials.SauceCredentials> + <scope>GLOBAL</scope> + <id>61b4846b-279d-4369-ae20-31e9d8b9bc66</id> + <description>bazel_rules_webtesting @ Sauce Labs</description> + <username>bazel_rules_webtesting</username> + <apiKey>##SECRET:saucelabs.bazel_rules_webtesting.access_key##</apiKey> + </hudson.plugins.sauce_ondemand.credentials.SauceCredentials> <org.jenkinsci.plugins.plaincredentials.impl.FileCredentialsImpl plugin="plain-credentials@1.4"> <scope>GLOBAL</scope> <id>remote-execution</id>
diff --git a/jenkins/jobs/BUILD b/jenkins/jobs/BUILD index 455d7ca..2e206ae 100644 --- a/jenkins/jobs/BUILD +++ b/jenkins/jobs/BUILD
@@ -132,6 +132,7 @@ config = ":configs/rules_webtesting.json", project = "rules_webtesting", run_sequential = True, + sauce_enabled = True, ) bazel_github_job(
diff --git a/jenkins/lib/vars/bazelCiConfiguredJob.groovy b/jenkins/lib/vars/bazelCiConfiguredJob.groovy index edccd5a..f4b1fe3 100644 --- a/jenkins/lib/vars/bazelCiConfiguredJob.groovy +++ b/jenkins/lib/vars/bazelCiConfiguredJob.groovy
@@ -44,7 +44,8 @@ extra_bazelrc: config.extra_bazelrc, build_tag_filters: params.get("build_tag_filters", []), test_tag_filters: params.get("test_tag_filters", []), - workspace: config.workspace + workspace: config.workspace, + sauce: config.sauce ) }) } @@ -69,6 +70,7 @@ * - repository: git repository to clone. * - branch: branch of the repository to clone (default: master). * - refspec: specification of the references to fetch + * - sauce: identifier of the crendentials to connect to SauceLabs. * - run_sequentially: run each configuration sequentially rather than in parallel */ def call(config = [:]) { @@ -80,6 +82,7 @@ config["repository"] = config.get("repository", "") config["branch"] = config.get("branch", "master") config["refspec"] = config.get("refspec", "+refs/heads/*:refs/remotes/origin/*") + config["sauce"] = config.get("sauce", "") config["run_sequentially"] = config.get("run_sequentially", false) // Remove special characters from bazel_version (which can be coming from a URL post):
diff --git a/jenkins/lib/vars/bazelCiJob.groovy b/jenkins/lib/vars/bazelCiJob.groovy index 49b8633..a4553be 100644 --- a/jenkins/lib/vars/bazelCiJob.groovy +++ b/jenkins/lib/vars/bazelCiJob.groovy
@@ -31,6 +31,7 @@ * - repository: git repository to clone. * - branch: branch of the repository to clone (default: master). * - refspec: specification of the references to fetch + * - sauce: identifier of the credentials to connect to SauceLabs. * - node_label: label of the node to run on */ def call(config = [:]) { @@ -46,6 +47,7 @@ config["test_tag_filters"] = config.get("test_tag_filters", []) config["workspace"] = config.get("workspace", "") config["repository"] = config.get("repository", "") + config["sauce"] = config.get("sauce", "") config["branch"] = config.get("branch", "master") config["refspec"] = config.get("refspec", "+refs/heads/*:refs/remotes/origin/*") @@ -63,34 +65,36 @@ ] + config.test_opts machine(config.node_label) { ws("workspace/${currentBuild.fullProjectName}-${prefix}") { - // Checkout the code - echo "Checkout ${config.repository}" - recursiveGit(repository: config.repository, - refspec: config.refspec, - branch: config.branch) + maybeSauce(config.sauce) { + // Checkout the code + echo "Checkout ${config.repository}" + recursiveGit(repository: config.repository, + refspec: config.refspec, + branch: config.branch) - // And build - maybeDir(config.workspace) { - def bazel = bazelPath(config.bazel_version, config.node_label) - def extrarc = config.extra_bazelrc - if (config.bazel_version.startsWith("custom")) { - // Make the server dies after 10 minutes on custom bazel version. - // Other bazel servers stays alive for 3 hours, which is ok for - // release but not for custom binaries used for Global tests. We - // do not set the max_idle_secs to 1 because we still want the - // server to survive between steps. - extrarc += "\nstartup --max_idle_secs 600\n" + // And build + maybeDir(config.workspace) { + def bazel = bazelPath(config.bazel_version, config.node_label) + def extrarc = config.extra_bazelrc + if (config.bazel_version.startsWith("custom")) { + // Make the server dies after 10 minutes on custom bazel version. + // Other bazel servers stays alive for 3 hours, which is ok for + // release but not for custom binaries used for Global tests. We + // do not set the max_idle_secs to 1 because we still want the + // server to survive between steps. + extrarc += "\nstartup --max_idle_secs 600\n" + } + bazelJob(binary: bazel, + build_opts: build_options, + test_opts: test_options, + startup_opts: config.startup_opts, + extra_bazelrc: extrarc, + targets: config.targets, + tests: config.tests, + configuration: config.configuration, + stage_name: prefix + ) } - bazelJob(binary: bazel, - build_opts: build_options, - test_opts: test_options, - startup_opts: config.startup_opts, - extra_bazelrc: extrarc, - targets: config.targets, - tests: config.tests, - configuration: config.configuration, - stage_name: prefix - ) } } }
diff --git a/jenkins/lib/vars/maybeSauce.groovy b/jenkins/lib/vars/maybeSauce.groovy new file mode 100644 index 0000000..d40f503 --- /dev/null +++ b/jenkins/lib/vars/maybeSauce.groovy
@@ -0,0 +1,30 @@ +// Copyright (C) 2017 The Bazel Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * Define a step "maybeSauce" that executes its body under the SauceLabs wrapper with the + * credentials identifier given in argument, except if that argument is empty (in which + * case the body is executed directly). + */ +def call(String id, Closure body) { + if (id.isEmpty()) { + body() + } else { + sauce(id) { + sauceconnect(useGeneratedTunnelIdentifier: true) { + body() + } + } + } +}