áá±á¬ááºážáá±á¬áá±á·, áá¬ááá¬!
áá®áá±á·ááŸá¬áá±á¬á· á¡áá¯á¶ážááŒá¯áááºážááœá±áá²á áá
áºáá¯ááᯠáá»áŸáá±áá±ážáá»ááºáá«áááºá
áááá«ááºáž
DevOps áá²á·ááá¯á· á¡ááá¯áá±á¬ááºááẠIT á¡ááá¯ááºážá¡ááá¯ááºážá¡ááœáẠá¡áá áºá¡áááºážááá¯ááºáá±á¬á·áá«á áá°áá»á¬ážá áœá¬á¡ááœááºá âdo DevOpsâ ááẠááŸá±á¬áºááá¯ááºáá áºáá»áá¯ážáá»áá¯ážááŸáá·áº áááºá ááºáá±áááºá ááŸáááºááá¯ááºáá±á¬á¡áá«ááœááºá á¡ááá®áá±ážááŸááºážáá¯ááºááẠáááºááœá±á·á¡áá¯á¶ážáá»ááŒá®áž á ááºážáááºáá¬ážáá±á¬ á¡ááá®áá±ážááŸááºážá¡ááŒá áºááá¯á· ááŒá±á¬ááºážáá²ááœá¬ážááẠ(á¡áá¬á¡á¬ážáá¯á¶ážááẠá¡ááŸááºáááẠááá¯ááá¯ááŸá¯ááºááœá±ážáá±á¬áºáááºáž áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºáááºážá ááºá¡á¬ážáá¯á¶ážá០áá¯ááºááœááºáá±áááº)á
ááá¯á·ááŒá±á¬áá·áºá á á®áá¶ááá·áºááœá²áá°áá»á¬ážááẠááá áºáá áºáá»ááºááŸáááºáá¯á¶ááŒáá·áº á¡ááºááá®áá±ážááŸááºážááᯠá¡áá¯á¶ážáá»ááá¯ááºááẠááŸá±á¬áºááá¯ááºáá áºáᯠááŒá¯áá¯ááºááẠááŸá¬ááŒá¬ážáá¬ážáááºá á€áá¯ááºáááºážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá¬ááœáẠá¡áá»áá¯ážá¡á á¬ážá¡áá»áá¯ážáá»áá¯ážááŸááá«áááº- áááºáááºážááááºážááá¯á·áá°ááá¯ááºážá¡ááœáẠbot áá áºáá¯áá±ážááŒááºážá០áá®ážááŒá¬ážá¡ááá®áá±ážááŸááºážáá áºáá¯áááºáá®ážááŒááºážá¡ááá áááºááá¯á·áááºááá¯á á±áá¬áá°á á€á¡áá¬á¡á¬ážáá¯á¶ážááẠáá°áá®áá±á¬áááºááŸááºážáá»ááºááŸáááẠ- áá»áŸá±á¬ááºááœáŸá¬ááᯠá áááºáááºáá±á¬ááºááŒááºážááŸáá·áº ááŒáá·áºáá»ááºááŒááºážááá¯á·ááᯠáááºááá¯ááºááá»áŸ ááœáá·áºáááºážááŒááºáá¬á áœá¬ááŸáá·áº á¡áááºááŒá±á á±ááẠáá¯ááºáá±á¬ááºáááºá
áá«ááá¯á·ááá á¹á ááŸá¬ áá«ááá¯á·áá¯á¶ážáááºá Jenkins.
áá¯ááºáááºáž
áááºááŸááºáá¬ážáá±á¬ áá¬ážááŸááºážáá áºáá¯á á¡áá±ážá á¬ážáááºáá±á¬ááºááŸá¯ááᯠáááºáá±á¬ááºááŒááºážááŸáá·áº (ááá¯á·ááá¯ááº) ááŒáá·áºáá»ááºááŒááºážááá¯á·ááᯠá áááºááá·áº á¡áááºááŒá±áá±á¬ Jenkins á¡áá¯ááºáá áºáᯠáááºáá®ážáá«á
áá±áá¬ááá·áºááœááºážáá«á
áá»áœááºá¯ááºááá¯á·ááœáẠá¡áá»áá¯ážáá»áá¯ážáá±á¬ microservices áá»á¬ážá source code áá«áááºáá±á¬ repositories á¡áá»á¬ážá¡ááŒá¬ážááŸááááºá
ááá·áºáááºáá»ááºáá»á¬ážáááºááŸááºááŒááºážá
áá»áœááºá¯ááºááá¯á·áá¡áá¯ááºá¡ááœáẠá¡á±á¬ááºáá«áá±á¬ááºáá»á¬ážááᯠááá·áºááœááºážááá·áºáááº-
- á¡áá¯ááºááá¯áááºáááºáá±á¬á¡áá«ááœáẠáá»áœááºá¯ááºááá¯á·áááºáá±á¬ááºááŒá®áž á¡áá¯á¶ážááŒá¯ááá¯áá±á¬ microservice áá¯ááºááŸáá·áºá¡áá° ááá¯ááŸá±á¬ááºáá¬á URL á
- áááºáá±á¬ááºááŸá¯ááŒá áºáá±á«áºáá¬ááá·áº áááááááºá IDá
IS á¡ááá¯ááºáž
á€áá¬áááºááᯠááŒá®ážááŒá±á¬ááºááẠá¡ááœááºáá¯á¶ážáááºážáááºážááŸá¬ String á¡áá»áá¯ážá¡á á¬áž áá±á¬ááºááŸá áºáá¯ááᯠáááºáá®ážáááºááŒá áºáááºá
á€ááá á¹á ááœááºá á¡áá¯á¶ážááŒá¯áá°ááẠrepository ááá¯á·áááºážááŒá±á¬ááºážááᯠááá¯ááºááá¯ááºááá¯ááºááá·áºááẠááá¯á¡ááºááŒá®áž commit id ááẠáá¯á¶ážáá¡áááºááŒá±áááºááá¯ááºááŒá±á¬ááºáž áááºááŒááºáá«áááºá
ááŒá áºáááº
ááᯠáááºážá á¡á¬ážáá¬áá»ááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠááá·áºááœááºážá
ááºážá
á¬ážááẠá¡ááŒá¬ážáá±á¬ ááá·áºáááºáá±á¬ááºáá»á¬ážááᯠá
ááºážááŒáá·áºááŒáá«á
áá¯á·á
ááœá±ážáá»ááºááŸá¯ áá«áá¬áá®áᬠá¡áá»áá¯ážá¡á
á¬ážá áá¯ááá- Active Choices Reactive Reference Parameter ááŒáá·áº ááááá±á¬ááºááᯠáááºáá®ážááŒáá«á
áá¯á·á ááœá±ážáá»ááºááŸá¯á¡áá»áá¯ážá¡á
á¬ážááŸáá·áºá¡áá° áá«áá¬áá®áá¬ááœááºá áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·á microservices ááá¯ááºááᯠááááºážáááºážáá¬ážááá·áº repositories á¡áááºáá»á¬ážááᯠááœá±ážáá»ááºááŸá¯á¡ááœááºááœáẠááá¯ááºááá¯ááºááá·áºááœááºážáá«áááºá
ááááááºáá»á¬ážááẠá€áá±á¬ááºážáá«ážááᯠááŒáá¯ááºááŸá áºáááºáá«áá áá±á¬ááºáá±á¬ááºážáá«ážááœáẠáá¯áẠ(Configuration as code) ááá¯á¡áá¯á¶ážááŒá¯á áá±á¬áºááŒáá»ááºá¡á¬áž á¡áá¯á¶ážááŒá¯á Jenkins ááœáẠáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠááŒááºáááºááŒááºážáá¯ááºáááºážá ááºááᯠáá±á¬áºááŒáá«áááºá áá»áœááºá¯ááºááá¯á·ááẠááá¯ááŸá±á¬ááºááŸá¯á¡áááºáá»á¬ážááᯠááá¯ááºááá¯ááºááá·áºááœááºážááŒá®áž ááá·áºáááºáá±á¬ááºáá»á¬ážááᯠáááºáá®ážááẠáááá¯á¡ááºáá²á á¡áá¬á¡á¬ážáá¯á¶ážááẠá¡ááá¯á¡áá»á±á¬áẠááŒá áºááœá¬ážáááá·áºááẠ(áá»áœááºá¯ááºááá¯á·á áá¯ááºááẠSCM áá¶á០ááá¯ááŸá±á¬ááºááŸá¯á á¬áááºážááᯠáááºáá¶áááŸáááŒá®áž á€á á¬áááºážáá« ááá·áºáááºáá»ááºáá áºáᯠáááºáá®ážáááº)á
ááá¯ááŸá±á¬ááºááŸá¯áá áºáá¯á á®ááœáẠáááºážáááá¯ááºááá¯áẠááœááºááá·áºáá»á¬ážá á¬áááºážáá«ááŸááá±á¬ááŒá±á¬áá·áºá ááá¯ááŸá±á¬ááºááŸá¯áá áºáá¯á á®ááœáẠáááºážáááá¯ááºááá¯áẠááœááºááá·áºáá»á¬ážá á¬áááºážááŸááá±á¬ááŒá±á¬áá·áº áá¯ááááá±á¬ááºááááºááá¯ážáá»á¬ážááẠáááááá·áºáááºáá»ááºááŸááá°ááá·áºáááºááá¯ážáá±á«áºáá°áááºá ááá¯ááºááá áºááŒáá·áº ááŒáá·áºáá±ážáááºááŒá áºáááºá
Active Choices Reactive Reference Parameter ááŒáá·áºááẠá¡á±á¬ááºáá« ááœááºáááºáá»á¬áž ááŸááááºá
- á¡ááẠ- áááºááŸááºáá»ááºá¡áááºá
- script - áááºááœáŸááºážáá¬ážáá±á¬ ááá·áºáááºáá±á¬ááºá¡ááœááºá០áá«áá¬áá®áá¬ááááºááá¯ážááᯠááŒá±á¬ááºážáá²ááá·áºá¡áá«ááá¯ááºáž áá¯ááºáá±á¬ááºááá·áºáá¯áẠ(áá»áœááºá¯ááºááá¯á·áááá á¹á ááœááºá áá»áœááºá¯ááºááá¯á·ááẠtest1 ááŸáá·áº test2 ááŒá¬ážááœáẠááœá±ážáá»ááºáá±á¬á¡áá«)á
- áá±á«áºááŒáá»áẠ- parameter áá¡áá»ááºážáá»á¯ááºáá±á¬áºááŒáá»ááºá
- ááœá±ážáá»ááºááŸá¯á¡áá»áá¯ážá¡á á¬áž - script ááŸááŒááºáá±ážááá·áºá¡áá¬ááá¹áá¯á¡áá»áá¯ážá¡á á¬áž (áá»áœááºá¯ááºááá¯á·áááá á¹á ááœááºá áá»áœááºá¯ááºááá¯á·ááẠhtml áá¯ááºááá¯ááŒááºáá±ážáááº)á
- áááºááœáŸááºážáá¬ážáá±á¬ ááá·áºáááºáá»áẠ- áá«áá¬áá®áá¬áá¡áááºá áááºááá¯ážááá¯ááŒá±á¬ááºážáá²áá±á¬á¡áá«á Script ááá¹áááŸáá¯ááºááá¯áá¯ááºáá±á¬ááºáááá·áºáááºá
á€ááá·áºáááºáá»ááºááŸá á¡áá±ážááŒá®ážáá¯á¶ážá¡ááœááºááᯠááŒáá·áºááẠááá¯ááºááá¯ááºááœá¬ážááŒáá«á
áá¯á·á á¡áá¯á¶ážááŒá¯ááŒááºážá០ááœá±ážáá»ááºááẠá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ ááŸá
áºáá»áá¯ážááᯠáá»áœááºá¯ááºááá¯á· áááºážááŸááºážáá¬ážáá«áááºá Groovy Script ááá¯á·ááá¯áẠScriptler Script.
Scriptler ááẠáááºááááºááá±ážáá¬ážáá¬ážáá±á¬ script áá»á¬ážááᯠááááºážáááºážááŒá®áž áá±á¬áºáá®áá°ážááá·áºááŒááºážáááŒá¯áá² á¡ááŒá¬ážáá¯ááºáá±á¬ááºá
áá¬áá»á¬ážááœáẠáááºážááá¯á·ááᯠá¡áá¯á¶ážááŒá¯ááœáá·áºáá±ážááá·áº ááááºá¡ááºáá
áºáá¯áá¬ááŒá
áºáá±á¬ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠááááá¯á¶ážááœá±ážáá»ááºáá«áááºá
ááœá±ážáá»ááºáá¬ážáá±á¬ ááá¯ááŸá±á¬ááºááŸá¯á០áá¯ááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠááá°ááẠGroovy áá¯ááº
AUTH = "лПгОМ О паÑÐŸÐ»Ñ Ð² Base64"
GIT_URL = "url ЎП ваÑей SCM (https://bitbucket.org/)"
PROJECT_NAME = "ÐžÐŒÑ Ð¿ÑПекÑМПй ПблаÑÑО, гЎе МаÑ
ПЎÑÑÑÑ ÑепПзОÑПÑОО"
def htmlBuild() {
html = """
<html>
<head>
<meta charset="windows-1251">
<style type="text/css">
div.grayTable {
text-align: left;
border-collapse: collapse;
}
.divTable.grayTable .divTableCell, .divTable.grayTable .divTableHead {
padding: 0px 3px;
}
.divTable.grayTable .divTableBody .divTableCell {
font-size: 13px;
}
</style>
</head>
<body>
"""
def commitOptions = ""
getCommitsForMicroservice(MICROSERVICE_NAME).each {
commitOptions += "<option style='font-style: italic' value='COMMIT=${it.getKey()}'>${it}</option>"
}
html += """<p style="display: inline-block;">
<select id="commit_id" size="1" name="value">
${commitOptions}
</select></p></div>"""
html += """
</div>
</div>
</div>
</body>
</html>
"""
return html
}
def getCommitsForMicroservice(microserviceRepo) {
def commits = [:]
def endpoint = GIT_URL + "/rest/api/1.0/projects/${PROJECT_NAME}/repos/${microserviceRepo}/commits"
def conn = new URL(endpoint).openConnection()
conn.setRequestProperty("Authorization", "Basic ${AUTH}")
def response = new groovy.json.JsonSlurper().parseText(conn.content.text)
response.values.each {
commits.put(it.displayId, it.message)
}
return commits
}
return htmlBuild()
á¡áá±ážá
áááºá¡áá»ááºá¡áááºáá»á¬ážááᯠááá±á¬áºááŒáá²á á€áá¯ááºááẠááá·áºááœááºážááŸá¯á¡ááŒá
Ạááá¯ááºáááá¯áá¬ážáá
áºá¡ááẠ(MICROSERVICE_NAME) ááᯠáááºáá¶áááŸáááŒá®áž áá±á¬ááºážááá¯áá»ááºáá
áºáᯠáá±ážááá¯á·áááºá Bitbucket (áááºážáááºáž getCommitsForMicroservice) áááºážá API ááᯠá¡áá¯á¶ážááŒá¯á áá±ážáá¬ážáá±á¬ microservice á¡ááœáẠcommits á¡á¬ážáá¯á¶ážá id ááŸáá·áº commit message ááᯠááá°áááºá
á¡á
á±á¬ááá¯ááºážááœáẠáá±á¬áºááŒáá²á·ááá·áºá¡ááá¯ááºáž á€áá¯ááºááẠá
á¬áá»ááºááŸá¬áá±á«áºááœáẠááŒáááá·áº html ááᯠááŒááºáá±ážááá·áºáááºá ááá·áºáááºáá»ááºáá»á¬ážááŒáá·áºáááºáá±á¬ááºáá«á Jenkins ááœááºá ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠá
á¬áááºážáá
áºáá¯ááœáẠBitbucket ááŸáááŸááá¬ážáá±á¬áááºááá¯ážáá»á¬ážá¡á¬ážáá¯á¶ážááᯠááŒá¯á¶ááŒá®ážááœá±ážáá»ááºááẠáááºážááá¯á·ááá¯ááá·áºáááºá
á¡ááá·áºááœá± á¡á¬ážáá¯á¶ážááŒá®ážááœá¬ážáááºáá±á¬á· ááŸááá²á· á á¬áá»ááºááŸá¬ááᯠáááá·áºáá«áááºá ááá·áºáááºáá»ááºáá»á¬ážááŒáá·áºáááºáá±á¬ááºáá«á.
áááºááẠtest1 microservice ááá¯ááœá±ážáá»ááºáá«á-
áááºááẠtest2 microservice ááá¯ááœá±ážáá»ááºáá«á-
url ááᯠá¡áá»áááºááá¯ááºážáá°ážáá°ááŒá®áž ááá¯á¡ááºáá±á¬ commit id ááá¯ááŸá¬ááœá±ááŒááºážááẠá€áááºážááŒáá·áº ááá·áºáá¯ááºáááºážááŸáá·áº á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááẠá¡áá¯á¶ážááŒá¯áá°á¡ááœáẠááá¯ááá¯á¡áááºááŒá±áááºááŒá áºááŒá±á¬ááºáž ááá±á¬áá°áá«áááºá
PS á€áá±á¬ááºážáá«ážááœáẠá ááºážáá±ážááœá²áá»á¬ážááœáẠááá°áá®áá±á¬áá±á¬ááºáá»á¬ážá áœá¬ááŸááá±á¬ááŒá±á¬áá·áº á€áá¯á¶á á¶ááœáẠáááºááœá±á·á¡áá¯á¶ážáááŒá¯ááá¯ááºáá±á¬ á¡ááœááºááá¯ážááŸááºážáá±á¬ á¥ááá¬ááᯠáá±ážáá±á¬ááºáá¬ážáá«áááºá ááá¯á·áá±á¬áº á€áá±á¬ááºážáá«ážááááºááœááºáá»ááºááŸá¬ á¡áá¯ááºáá¯ááºááá·áºááŒá±ááŸááºážáá»ááºááá¯áá±ážáá±á¬ááºáááºááá¯ááºáá² áááááá¬áá¡áá¯ááºáá¯ááºáá¯á¶ááá¯ááŒááááºááŒá áºáááºá
PSS á á±á¬á á±á¬á áá»áœááºáá±á¬áºáá±ážáá²á·áááá¯áá² áá®áá±á¬ááºážáá«ážá á¡áá¯á¶ážáááºáááºááá¯ááẠáá±á¬ááºáá áºáá¯ááºááᯠááŒá±á¬ááŒáá«áááºá áá¯ááºááŸáá áºááá·áº Jenkins áá¯ááºáá±á¬ááºá áá¬áá»á¬ážá ááá¯ááºážááá áºááœá²á·á ááºážááŸá¯.
source: www.habr.com