-
-
Notifications
You must be signed in to change notification settings - Fork 9.8k
[JENKINS-70059] Improve Safe Restart interface and user information #7355
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
timja
merged 61 commits into
jenkinsci:master
from
meiswjn:feature/improve-safe-restart-messages
Jul 7, 2023
Merged
Changes from 13 commits
Commits
Show all changes
61 commits
Select commit
Hold shift + click to select a range
24be93a
Allow custom message and more user information for safe restarts
meiswjn dbf0194
Merge branch 'master' into feature/improve-safe-restart-messages
meiswjn 3c4b989
Fix linting
meiswjn 4beaa7b
Merge branch 'feature/improve-safe-restart-messages' of https://githu…
meiswjn 7121f6d
Fix linter issues and deprecations
meiswjn 9980d18
Minor changes to formulations and style
meiswjn feaf3a1
Minor changes to formulations and style
meiswjn 4fc22a2
Fix CI issues
meiswjn b5b35f5
Merge branch 'master' into feature/improve-safe-restart-messages
meiswjn 650eed0
Use TODO tag in javadoc since-param
meiswjn a344b08
Merge branch 'jenkinsci:master' into feature/improve-safe-restart-mes…
meiswjn 99d5ed6
Merge branch 'feature/improve-safe-restart-messages' of https://githu…
meiswjn c7f7795
Merge branch 'master' into feature/improve-safe-restart-messages
meiswjn bcbffe1
Restrict isPreparingSafeRestart()
meiswjn 8635553
Merge branch 'master' into feature/improve-safe-restart-messages
NotMyFault fb4eecd
Merge branch 'master' into feature/improve-safe-restart-messages
meiswjn 402b30c
Remove duplicate code
meiswjn 6e1b715
Merge branch 'feature/improve-safe-restart-messages' of https://githu…
meiswjn d4fe2b7
Add conditional jelly tag for safe restart
meiswjn 5abd8c0
Adapt translation
meiswjn 0f1fba9
Merge branch 'master' into feature/improve-safe-restart-messages
meiswjn 8a4ff7c
Fix spotbugs and checkstyle
meiswjn ea7bc73
Merge branch 'feature/improve-safe-restart-messages' of https://githu…
meiswjn b0178b1
Another try for spotbugs null path
meiswjn 25ce12e
Another try for spotbugs null path
meiswjn 12e0483
Apply suggestions from code review
meiswjn 09243fc
Adapt comments, messages and translations
meiswjn 1e5074e
Adapt translation
meiswjn 989d836
Update translations and move messages to dedicated file
meiswjn 7f792a3
Apply suggestions from @timja
meiswjn 5c4b20f
Merge branch 'feature/improve-safe-restart-messages' of https://githu…
meiswjn 0ec3323
Fix message display logic
meiswjn 75710c0
Use pre-defined colors
meiswjn 612aa46
Update core/src/main/resources/hudson/util/HudsonIsRestarting/index_d…
meiswjn f961cd7
Replace br tag with css
meiswjn 6b16167
Merge branch 'master' into feature/improve-safe-restart-messages
meiswjn 33681e1
Use pre-defined color
meiswjn c9dd18d
Merge branch 'feature/improve-safe-restart-messages' of https://githu…
meiswjn 326ebfb
Apply yarn fix
meiswjn 67b92a2
Fix spotbugs
meiswjn 9446037
Add SafeRestart CLI Command
meiswjn c6ffe16
Merge branch 'master' into feature/improve-safe-restart-messages
meiswjn ebb285d
Fix spotbugs issues
meiswjn bd250a2
Merge branch 'feature/improve-safe-restart-messages' of https://githu…
meiswjn 4779b46
Update SafeRestartCommand.java
meiswjn 459ec06
Update SafeRestartCommand.java
meiswjn 8571d73
Merge branch 'master' into feature/improve-safe-restart-messages
meiswjn 773b1bd
Update SafeRestartCommand.java
meiswjn 2d82089
Merge branch 'master' into feature/improve-safe-restart-messages
NotMyFault 7730051
Merge branch 'master' into feature/improve-safe-restart-messages
timja f11d5eb
Merge branch 'master' into feature/improve-safe-restart-messages
daniel-beck 66900a3
Merge branch 'jenkinsci:master' into feature/improve-safe-restart-mes…
meiswjn de78fce
chore: answer review comments
meiswjn 1553c03
fix: undo translation change
meiswjn b80928c
Improve UI
timja b6f78bb
UI improvements (and simplified translating of page)
timja e177791
Merge branch 'master' into feature/improve-safe-restart-messages
NotMyFault 8b657f4
Merge branch 'master' into feature/improve-safe-restart-messages
meiswjn 85dc1bd
chore: fix description
meiswjn 23107ec
Merge branch 'master' into feature/improve-safe-restart-messages
NotMyFault 1bee860
Merge branch 'master' into feature/improve-safe-restart-messages
meiswjn File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -280,6 +280,7 @@ | |
| import jenkins.security.stapler.StaplerFilteredActionListener; | ||
| import jenkins.security.stapler.TypedFilter; | ||
| import jenkins.slaves.WorkspaceLocator; | ||
| import jenkins.util.JenkinsIsSafeRestarting; | ||
| import jenkins.util.JenkinsJVM; | ||
| import jenkins.util.Listeners; | ||
| import jenkins.util.SystemProperties; | ||
|
|
@@ -482,6 +483,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve | |
|
|
||
| @CheckForNull | ||
| private transient volatile QuietDownInfo quietDownInfo; | ||
|
|
||
| private transient volatile boolean terminating; | ||
| @GuardedBy("Jenkins.class") | ||
| private transient boolean cleanUpStarted; | ||
|
|
@@ -2923,6 +2925,18 @@ public boolean isQuietingDown() { | |
| return quietDownInfo != null; | ||
| } | ||
|
|
||
| /** | ||
| * Returns if the quietingDown is a safe restart. | ||
| * @since TODO | ||
| */ | ||
| public boolean isPreparingSafeRestart() { | ||
|
meiswjn marked this conversation as resolved.
|
||
| if (quietDownInfo == null) { | ||
| return false; | ||
| } | ||
| return quietDownInfo.isSafeRestart(); | ||
|
|
||
| } | ||
|
|
||
| /** | ||
| * Returns quiet down reason if it was indicated. | ||
| * @return | ||
|
|
@@ -2933,7 +2947,7 @@ public boolean isQuietingDown() { | |
| @CheckForNull | ||
| public String getQuietDownReason() { | ||
| final QuietDownInfo info = quietDownInfo; | ||
| return info != null ? info.reason : null; | ||
| return info != null ? info.message : null; | ||
| } | ||
|
|
||
| /** | ||
|
|
@@ -4070,7 +4084,7 @@ public synchronized HttpRedirect doQuietDown() { | |
| * | ||
| * @param block Block until the system really quiets down and no builds are running | ||
| * @param timeout If non-zero, only block up to the specified number of milliseconds | ||
| * @deprecated since 2.267; use {@link #doQuietDown(boolean, int, String)} instead. | ||
| * @deprecated since 2.267; use {@link #doQuietDown2(boolean, int, String, boolean)} instead. | ||
|
meiswjn marked this conversation as resolved.
Outdated
|
||
| */ | ||
| @Deprecated | ||
| public synchronized HttpRedirect doQuietDown(boolean block, int timeout) { | ||
|
|
@@ -4086,16 +4100,33 @@ public synchronized HttpRedirect doQuietDown(boolean block, int timeout) { | |
| * | ||
| * @param block Block until the system really quiets down and no builds are running | ||
| * @param timeout If non-zero, only block up to the specified number of milliseconds | ||
| * @param reason Quiet reason that will be visible to user | ||
| * @since 2.267 | ||
| * @param message Quiet reason that will be visible to user | ||
| * @deprecated since TODO; use {@link #doQuietDown2(boolean, int, String, boolean)} instead. | ||
| */ | ||
| @RequirePOST | ||
| @Deprecated | ||
| public HttpRedirect doQuietDown(@QueryParameter boolean block, | ||
| @QueryParameter int timeout, | ||
| @QueryParameter @CheckForNull String reason) throws InterruptedException, IOException { | ||
| @QueryParameter @CheckForNull String message) throws InterruptedException, IOException { | ||
|
|
||
| return doQuietDown2(block, timeout, message, false); | ||
| } | ||
|
|
||
| /** | ||
| * Quiet down Jenkins - preparation for a restart | ||
| * | ||
| * @param block Block until the system really quiets down and no builds are running | ||
| * @param timeout If non-zero, only block up to the specified number of milliseconds | ||
| * @param message Quiet reason that will be visible to user | ||
| * @param safeRestart If the quietDown is for a safeRestart | ||
| * @since TODO | ||
| */ | ||
| @RequirePOST | ||
| public HttpRedirect doQuietDown2(@QueryParameter boolean block, | ||
|
meiswjn marked this conversation as resolved.
Outdated
|
||
| @QueryParameter int timeout, | ||
| @QueryParameter @CheckForNull String message, @QueryParameter boolean safeRestart) throws InterruptedException, IOException { | ||
|
meiswjn marked this conversation as resolved.
Outdated
|
||
| synchronized (this) { | ||
| checkPermission(MANAGE); | ||
| quietDownInfo = new QuietDownInfo(reason); | ||
| quietDownInfo = new QuietDownInfo(message, safeRestart); | ||
| } | ||
| if (block) { | ||
| long waitUntil = timeout; | ||
|
|
@@ -4494,16 +4525,29 @@ public void doRestart(StaplerRequest req, StaplerResponse rsp) throws IOExceptio | |
| * | ||
| * This first replaces "app" to {@link HudsonIsRestarting} | ||
| * | ||
| * @since 1.332 | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please keep
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @meiswjn ⬆️ |
||
| * @deprecated since TODO; use {@link #doSafeRestart2(StaplerRequest, String)} instead. | ||
| * | ||
| */ | ||
| @CLIMethod(name = "safe-restart") | ||
| @Deprecated | ||
|
meiswjn marked this conversation as resolved.
Outdated
|
||
| public HttpResponse doSafeRestart(StaplerRequest req) throws IOException, ServletException, RestartNotSupportedException { | ||
| return doSafeRestart2(req, null); | ||
| } | ||
|
|
||
| /** | ||
| * Queues up a restart of Jenkins for when there are no builds running, if we can. | ||
| * | ||
| * This first replaces "app" to {@link HudsonIsRestarting} | ||
|
meiswjn marked this conversation as resolved.
Outdated
|
||
| * | ||
| * @since TODO | ||
| */ | ||
| @CLIMethod(name = "safe-restart") | ||
|
meiswjn marked this conversation as resolved.
Outdated
|
||
| public HttpResponse doSafeRestart2(StaplerRequest req, @QueryParameter("message") String message) throws IOException, ServletException, RestartNotSupportedException { | ||
| checkPermission(MANAGE); | ||
| if (req != null && req.getMethod().equals("GET")) | ||
| return HttpResponses.forwardToView(this, "_safeRestart.jelly"); | ||
|
|
||
| if (req == null || req.getMethod().equals("POST")) { | ||
| safeRestart(); | ||
| safeRestart(message); | ||
| } | ||
|
|
||
| return HttpResponses.redirectToDot(); | ||
|
|
@@ -4548,12 +4592,22 @@ public void run() { | |
|
|
||
| /** | ||
| * Queues up a restart to be performed once there are no builds currently running. | ||
| * @since 1.332 | ||
|
meiswjn marked this conversation as resolved.
|
||
| * @deprecated since TODO; use {@link #safeRestart(String)} instead. | ||
| */ | ||
| @Deprecated | ||
|
meiswjn marked this conversation as resolved.
Outdated
|
||
| public void safeRestart() throws RestartNotSupportedException { | ||
| safeRestart(null); | ||
| } | ||
|
|
||
| /** | ||
| * Queues up a restart to be performed once there are no builds currently running. | ||
| * @param message the message to show to users in the shutdown banner. | ||
| * @since TODO | ||
| */ | ||
| public void safeRestart(String message) throws RestartNotSupportedException { | ||
| final Lifecycle lifecycle = restartableLifecycle(); | ||
| // Quiet down so that we won't launch new builds. | ||
| quietDownInfo = new QuietDownInfo(); | ||
| quietDownInfo = new QuietDownInfo(message, true); | ||
|
|
||
| new Thread("safe-restart thread") { | ||
| final String exitUser = getAuthentication2().getName(); | ||
|
|
@@ -4562,11 +4616,10 @@ public void run() { | |
| try (ACLContext ctx = ACL.as2(ACL.SYSTEM2)) { | ||
|
|
||
| // Wait 'til we have no active executors. | ||
| doQuietDown(true, 0, null); | ||
|
|
||
| doQuietDown2(true, 0, message, true); | ||
| // Make sure isQuietingDown is still true. | ||
| if (isQuietingDown()) { | ||
| servletContext.setAttribute("app", new HudsonIsRestarting()); | ||
| servletContext.setAttribute("app", new JenkinsIsSafeRestarting()); | ||
|
meiswjn marked this conversation as resolved.
Outdated
|
||
| // give some time for the browser to load the "reloading" page | ||
| lifecycle.onStatusUpdate("Restart in 10 seconds"); | ||
| Thread.sleep(TimeUnit.SECONDS.toMillis(10)); | ||
|
|
@@ -5742,16 +5795,31 @@ private static void _setJenkinsJVM(boolean jenkinsJVM) { | |
| } | ||
|
|
||
| private static final class QuietDownInfo { | ||
|
|
||
| @CheckForNull | ||
| final String reason; | ||
| final String message; | ||
|
|
||
| @NonNull | ||
| private boolean safeRestart; | ||
|
|
||
| QuietDownInfo() { | ||
| this(null); | ||
| this(null, false); | ||
| } | ||
|
|
||
| QuietDownInfo(final String message) { | ||
| this(message, false); | ||
| } | ||
|
|
||
| QuietDownInfo(final String message, final boolean safeRestart) { | ||
| this.message = message; | ||
| this.safeRestart = safeRestart; | ||
| } | ||
|
|
||
| boolean isSafeRestart() { | ||
| return safeRestart; | ||
| } | ||
|
|
||
| QuietDownInfo(final String reason) { | ||
| this.reason = reason; | ||
| void setSafeRestart(boolean safeRestart) { | ||
| this.safeRestart = safeRestart; | ||
| } | ||
| } | ||
| } | ||
48 changes: 48 additions & 0 deletions
48
core/src/main/java/jenkins/util/JenkinsIsSafeRestarting.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| /* | ||
| * The MIT License | ||
| * | ||
| * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi | ||
| * | ||
| * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| * of this software and associated documentation files (the "Software"), to deal | ||
| * in the Software without restriction, including without limitation the rights | ||
| * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| * copies of the Software, and to permit persons to whom the Software is | ||
| * furnished to do so, subject to the following conditions: | ||
| * | ||
| * The above copyright notice and this permission notice shall be included in | ||
| * all copies or substantial portions of the Software. | ||
| * | ||
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
| * THE SOFTWARE. | ||
| */ | ||
|
|
||
| package jenkins.util; | ||
|
|
||
| import static javax.servlet.http.HttpServletResponse.SC_SERVICE_UNAVAILABLE; | ||
|
|
||
| import java.io.IOException; | ||
| import javax.servlet.ServletContext; | ||
| import javax.servlet.ServletException; | ||
| import org.kohsuke.stapler.StaplerRequest; | ||
| import org.kohsuke.stapler.StaplerResponse; | ||
|
|
||
| /** | ||
| * Model object used to display "Hudson is restarting". | ||
| * <p> | ||
| * Set this object to {@link ServletContext#setAttribute(String, Object)} "app" while | ||
| * the loading activity is taking place. | ||
| * | ||
| * @author Kohsuke Kawaguchi | ||
| */ | ||
| public class JenkinsIsSafeRestarting { | ||
| public void doDynamic(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, InterruptedException { | ||
| rsp.setStatus(SC_SERVICE_UNAVAILABLE); | ||
| req.getView(this, "index.jelly").forward(req, rsp); | ||
| } | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
68 changes: 68 additions & 0 deletions
68
core/src/main/resources/jenkins/util/JenkinsIsSafeRestarting/index.jelly
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,68 @@ | ||
| <!-- | ||
|
meiswjn marked this conversation as resolved.
Outdated
|
||
| The MIT License | ||
|
|
||
| Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi | ||
|
|
||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| of this software and associated documentation files (the "Software"), to deal | ||
| in the Software without restriction, including without limitation the rights | ||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| copies of the Software, and to permit persons to whom the Software is | ||
| furnished to do so, subject to the following conditions: | ||
|
|
||
| The above copyright notice and this permission notice shall be included in | ||
| all copies or substantial portions of the Software. | ||
|
|
||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
| THE SOFTWARE. | ||
| --> | ||
| <?jelly escape-by-default='true'?> | ||
| <j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:x="jelly:xml"> | ||
| <j:new var="h" className="hudson.Functions" /> | ||
| <st:statusCode value="503" /><!-- SERVICE NOT AVAILABLE --> | ||
| <st:header name="Expires" value="0" /> | ||
| <st:header name="Cache-Control" value="no-cache,no-store,must-revalidate" /> | ||
| <!-- response contentType header --> | ||
| <st:contentType value="text/html;charset=UTF-8" /> | ||
| <!-- get default/common page variable --> | ||
| ${h.initPageVariables(context)} | ||
| <x:doctype name="html" /> | ||
| <html lang="${request.getLocale().toLanguageTag()}"> | ||
| <head data-rooturl="${rootURL}" data-resurl="${resURL}" data-imagesurl="${imagesURL}" resURL="${resURL}"> | ||
| <title>${%Restarting Jenkins}</title> | ||
| <!-- we do not want bots on this page --> | ||
| <meta name="ROBOTS" content="NOFOLLOW" /> | ||
| <!-- mobile friendly layout --> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <link rel="stylesheet" href="${resURL}/jsbundles/simple-page.css" type="text/css" /> | ||
| <link rel="stylesheet" href="${resURL}/css/loading.css" type="text/css" /> | ||
| </head> | ||
| <body> | ||
| <div class="simple-page" role="main"> | ||
| <div class="modal signup"> | ||
| <div class="signupIntroDefault"> | ||
| <div class="logo"> | ||
| <img src="${imagesURL}/svgs/logo.svg" alt="Jenkins logo" /> | ||
| </div> | ||
| <h1 class="loading"> | ||
| ${%Please wait while the Jenkins Controller is restarting} | ||
| <span>.</span><span>.</span><span>.</span> | ||
| </h1> | ||
| <p class="restarting"> | ||
| ${%Your browser will reload automatically when Jenkins is ready.} | ||
| </p> | ||
| <p class="safe-restarting"> | ||
| <b>${%Safe Restart}</b><br/> ${%Jobs on agents can usually continue.} | ||
| </p> | ||
| </div> | ||
| </div> | ||
| </div> | ||
| <script src="${resURL}/scripts/loading.js" type="text/javascript" /> | ||
| </body> | ||
| </html> | ||
| </j:jelly> | ||
26 changes: 26 additions & 0 deletions
26
core/src/main/resources/jenkins/util/JenkinsIsSafeRestarting/index_bg.properties
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,26 @@ | ||
| # The MIT License | ||
| # | ||
| # Bulgarian translation: Copyright (c) 2016, Alexander Shopov <ash@kambanaria.org> | ||
| # | ||
| # Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| # of this software and associated documentation files (the "Software"), to deal | ||
| # in the Software without restriction, including without limitation the rights | ||
| # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| # copies of the Software, and to permit persons to whom the Software is | ||
| # furnished to do so, subject to the following conditions: | ||
| # | ||
| # The above copyright notice and this permission notice shall be included in | ||
| # all copies or substantial portions of the Software. | ||
| # | ||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
| # THE SOFTWARE. | ||
|
|
||
| Please\ wait\ while\ Jenkins\ is\ restarting=\ | ||
| Изчакайте докато Jenkins рестартира | ||
| Your\ browser\ will\ reload\ automatically\ when\ Jenkins\ is\ ready.=\ | ||
| Браузър ви автоматично ще презареди страницата, когато Jenkins е готов. |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.