DEV Community

Jorge
Jorge

Posted on • Originally published at jorge.aguilera.soy on

JBake + Gradle + Mastodon

INFO

Para poder replicar esta funcionalidad necesitaras una cuenta en una instancia Mastodon o Pleroma y crear un Token con ella

Se me ha ocurrido (idea nada brillante) hacerme una tarea Gradle en el proyecto del blog para poder tootear el enlace a un post

No es nada del otro mundo. Mi blog es un static site hecho con JBake usando Gradle y Asciidoctor así que básicamente es crear una tarea nueva en el buildSrc

buildSrc/src/main/groovy/MastodonTask.groovy

import org.gradle.api.DefaultTask
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import groovy.xml.XmlSlurper
import groovy.json.JsonOutput
import java.net.http.*

abstract class MastodonTask extends DefaultTask{

    @Input
    abstract Property<String> getInstance()

    @Input
    abstract Property<String> getToken()

    @Input
    abstract Property<String> getPostId()

    @TaskAction
    def runTask() {
        def xml = new XmlSlurper().parse("https://jorge.aguilera.soy/feed.xml")
        def entry = xml.entry.find{ "$it.id".endsWith( postId.get()+".html")}
        if( !entry ) {
            println("Post no encontrado")
            return
        }
        def hashtags = entry.category.collect{ "#"+it."@term"}.join(' ')
        def toot = """
🗣️ Nuevo post en el blog

$entry.title

📖 ${entry.summary}

$hashtags

${entry.id}
"""
        def json = JsonOutput.toJson([status: toot])

        def client = HttpClient.newHttpClient()
        def request = HttpRequest.newBuilder()
                .header("Content-Type", "application/json; charset=UTF-8")
                .header("Authorization", "Bearer ${token.get()}")
                .uri(URI.create(instance.get()+'/api/v1/statuses'))
                .POST(HttpRequest.BodyPublishers.ofString(json))
                .build()
        client.send(request, HttpResponse.BodyHandlers.ofString())
    }
}
Enter fullscreen mode Exit fullscreen mode

y crear una task en el build.gradle para llamarla en nuestro pipeline

build.gradle

tasks.register('tootea', MastodonTask){
    instance = "https://jvm.social"
    token = findProperty("BLOG_ACCESS_TOKEN")
    postId = findProperty("postId")
}
Enter fullscreen mode Exit fullscreen mode

Simplemente, una vez que hemos generado y publicado el blog con el ultimo post, ejecutaremos la tarea de gradle para que tootee por nosotros

./gradlew tootea mi-ultimo-post

Top comments (0)