Использование Groovy + HTTP requests в Unix/Linux

На работе, используют Дженкинс и по этому, таска упала — написать ( переписать использующий код шел-экзеков) 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» завершена.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.