На работе, используют Дженкинс и по этому, таска упала — написать ( переписать использующий код шел-экзеков) groovy сприпты для shared library (кто не знает что это — это библиотека которую можно подключить и вызывать написанный код в ваших пайплайнах). Вопрос зачем юзать Дженкинс — я не стал спрашивать на данном этапе конечно, возможно и стоило. Но работа — есть работа.
Если кому интересно, то я бы не стал юзать Дженкинс в нынешнее время из-за того что сложно его поддерживать. Сейчас имеется большое количество CI/CD инструментов куда лучшим функционалом, с менее затратным супортингом (GoCD, Concourse-CI, Gitlab CI, TeamCity и еще много-много других утилит).
Нанимать челов которые знают Java/Groovy + Python (без него никуда) + DevOps часть сложнее нежели DevOps с возможным знанием Python/Go. Ну не суть, приступим к делу…
Использование Groovy + HTTP requests в Unix/linux
Задача заключается в том, чтобы выполнять запросы (GET, POST, PUT, DELETE) к различным сервисам ( В моем случае это Vault & Consul). Шел-экзеки я не могу забрать с работы и выложить в качестве примера, но нормальный код на груви — могу.
Пример подключения к Vault (POST запрос):
import groovy.json.JsonOutput
import groovy.json.JsonSlurper
import java.io.BufferedWriter
import java.io.OutputStreamWriter
import java.net.URL
import java.util.Scanner
def vault_query(String vault_host, String vault_path, String creds) {
def String vault_token = null
def String user = creds.split(":")[0]
def String user_password = creds.split(":")[1]
try {
// Create connection
def post = new URL(vault_host + vault_path).openConnection();
def message = '{"password":' + '"' + user_password + '"}'
post.setRequestMethod("POST")
post.setDoOutput(true)
post.setRequestProperty("Content-Type", "application/json")
post.getOutputStream().write(message.getBytes("UTF-8"));
def postRC = post.getResponseCode();
if (postRC.equals(200)) {
resp = post.getInputStream().getText()
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText(resp)
vault_token = object['auth']['client_token']
}
} catch(Exception e) {
println("ERROR: " + e.toString());
}
println("vault_host: " + vault_host)
println("vault_token: " + vault_token)
return vault_token
}
Или еще один пример, но с GET запросом:
def vault_query(String vault_host, String vault_path, String vault_field, String creds) {
def String query = null
def String vault_token = "vault_token_HERE"
try {
// Create connection
def get = new URL(vault_host + "${vault_path}").openConnection();
get.setRequestMethod("GET")
get.setRequestProperty("Content-Type", "application/json")
get.setRequestProperty("X-Vault-Token", vault_token)
def getRC = get.getResponseCode();
if (getRC.equals(200)) {
def resp = get.getInputStream().getText()
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText(resp)
query = object['data'][vault_field]
}
} catch(Exception e) {
println("ERROR: " + e.toString());
}
println("query: " + query)
return query
}
Пример GET запроса в Consul:
def consul_query(String consul_host, String consul_path, String creds) {
def String query = null
def String consul_token = "consul_token_HERE"
try {
// Create connection
def get = new URL(consul_host + "${consul_path}").openConnection();
get.setRequestProperty("Content-Type", "application/json")
get.setRequestProperty("X-Consul-Token", consul_token)
def getRC = get.getResponseCode();
if (getRC.equals(200)) {
def resp = get.getInputStream().getText()
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText(resp)
query = object
}
} catch(Exception e) {
println("ERROR: " + e.toString());
}
println("query: " + query)
return query
}
Пример PUT запроса в Consul:
def consul_update(String consul_host, String consul_path, String consul_data, String creds) {
def String update_key = null
def String consul_token = "consul_token_HERE"
try {
// Create connection
def put = new URL(consul_host + "${consul_path}").openConnection();
put.setDoOutput(true)
put.setRequestMethod('PUT')
put.setRequestProperty("Accept", "application/json")
put.setRequestProperty("Content-Type", "application/json")
put.setRequestProperty("X-Consul-Token", consul_token)
def out = new OutputStreamWriter(put.outputStream)
out.write(consul_data)
out.close()
def getRC = put.getResponseCode();
if (getRC.equals(200)) {
def resp = put.getInputStream().getText()
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText(resp)
update_key = object
}
} catch(Exception e) {
println("ERROR: " + e.toString());
}
println("update_key: " + update_key)
return update_key
}
Пример DELETE запроса в Consul:
def consul_delete(String consul_host, String consul_path, String creds) {
def String delete_key = null
def String consul_token = "consul_token"
try {
// Create connection
def delete = new URL(consul_host + "${consul_path}").openConnection();
delete.setDoOutput(true)
delete.setRequestMethod('DELETE')
delete.setRequestProperty("Accept", "application/json")
delete.setRequestProperty("Content-Type", "application/json")
delete.setRequestProperty("X-Consul-Token", consul_token)
def getRC = delete.getResponseCode();
if (getRC.equals(200)) {
def resp = delete.getInputStream().getText()
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText(resp)
delete_key = object
}
} catch(Exception e) {
println("ERROR: " + e.toString());
}
println("delete_key: " + delete_key)
return delete_key
}
Запускать данные скрипты можно локально, но для этого нужно поставить groovy.
PS: Весь код положил https://github.com/SebastianUA/groovy-http-requests . Может кому-то и сгодиться еще 🙂
Вот и все, статья «Использование Groovy + HTTP requests в Unix/Linux» завершена.