{"id":9940,"date":"2025-09-11T09:00:52","date_gmt":"2025-09-11T12:00:52","guid":{"rendered":"https:\/\/www.fernandoquadro.com.br\/html\/?p=9940"},"modified":"2025-09-08T18:30:24","modified_gmt":"2025-09-08T21:30:24","slug":"geoserver-em-ambientes-devops-ci-cd-para-dados-geoespaciais","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2025\/09\/11\/geoserver-em-ambientes-devops-ci-cd-para-dados-geoespaciais\/","title":{"rendered":"GeoServer em Ambientes DevOps: CI\/CD para Dados Geoespaciais"},"content":{"rendered":"<p>Prezado leitor,<\/p>\n<p>Integrar o GeoServer a um ambiente DevOps permite transformar a publica\u00e7\u00e3o e manuten\u00e7\u00e3o de dados geoespaciais em um processo <strong>automatizado, rastre\u00e1vel e seguro<\/strong>. Com pipelines CI\/CD (Continuous Integration \/ Continuous Deployment), \u00e9 poss\u00edvel validar, versionar e publicar camadas geoespaciais de forma confi\u00e1vel, garantindo que novas vers\u00f5es de dados e estilos cheguem ao servidor sem interven\u00e7\u00e3o manual.<\/p>\n<p><strong>1. Conceito de CI\/CD para GeoServer<\/strong><\/p>\n<p>O objetivo do CI\/CD \u00e9 automatizar a entrega de software ou dados. No contexto do GeoServer, podemos aplicar CI\/CD para:<\/p>\n<ul>\n<li>Publica\u00e7\u00e3o autom\u00e1tica de camadas vetoriais e rasters.<\/li>\n<li>Aplica\u00e7\u00e3o de estilos (SLD\/SE) versionados em reposit\u00f3rios Git.<\/li>\n<li>Valida\u00e7\u00e3o de dados antes do deploy.<\/li>\n<li>Rollback autom\u00e1tico em caso de falhas.<\/li>\n<\/ul>\n<p>Combinando REST API do GeoServer e pipelines CI\/CD, conseguimos ter <strong>controle total sobre a atualiza\u00e7\u00e3o de dados geoespaciais<\/strong>.<\/p>\n<p><strong>2. Estrutura do pipeline DevOps<\/strong><\/p>\n<p>Um pipeline t\u00edpico para GeoServer + PostGIS em CI\/CD inclui:<\/p>\n<ul>\n<li><strong>Reposit\u00f3rio Git:<\/strong> versionamento de SLDs, scripts de publica\u00e7\u00e3o e, quando aplic\u00e1vel, dados GeoJSON ou shapefiles pequenos.<\/li>\n<li><strong>Servi\u00e7o de CI\/CD:<\/strong> GitHub Actions, GitLab CI\/CD ou Jenkins para executar scripts de publica\u00e7\u00e3o.<\/li>\n<li><strong>Servidor GeoServer:<\/strong> alvo do deploy autom\u00e1tico, com REST API habilitada e credenciais de acesso seguras.<\/li>\n<li><strong>Banco PostGIS:<\/strong> para integra\u00e7\u00e3o de dados vetoriais, garantindo consist\u00eancia com o GeoServer.<\/li>\n<\/ul>\n<p>Visualmente, o fluxo pode ser resumido assim:<\/p>\n<pre>\r\nGit Repo (dados e SLDs) \r\n      \u2502\r\n      \u25bc\r\nCI\/CD Pipeline (GitHub Actions \/ GitLab CI \/ Jenkins)\r\n      \u2502\r\n      \u25bc\r\nScripts de automa\u00e7\u00e3o \u2192 GeoServer REST API\r\n      \u2502\r\n      \u25bc\r\nPublica\u00e7\u00e3o autom\u00e1tica de camadas e estilos\r\n<\/pre>\n<p><strong>3. Exemplo de GitHub Actions para publicar SLDs<\/strong><\/p>\n<p>Podemos criar um workflow simples que envia estilos ao GeoServer sempre que houver uma atualiza\u00e7\u00e3o no reposit\u00f3rio:<\/p>\n<pre>\r\nname: Deploy GeoServer Styles\r\n\r\non:\r\n  push:\r\n    paths:\r\n      - 'styles\/**'\r\n\r\njobs:\r\n  deploy:\r\n    runs-on: ubuntu-latest\r\n    steps:\r\n      - uses: actions\/checkout@v3\r\n\r\n      - name: Enviar SLDs para GeoServer\r\n        run: |\r\n          for file in styles\/*.sld; do\r\n            curl -u ${{ secrets.GEOSERVER_USER }}:${{ secrets.GEOSERVER_PASS }} \\\r\n                 -XPUT -H \"Content-type: application\/vnd.ogc.sld+xml\" \\\r\n                 --data-binary @$file \\\r\n                 http:\/\/localhost:8080\/geoserver\/rest\/workspaces\/cite\/styles\/$(basename $file .sld)\r\n          done\r\n<\/pre>\n<p>Esse workflow garante que qualquer atualiza\u00e7\u00e3o de estilo seja aplicada automaticamente no GeoServer sem interven\u00e7\u00e3o manual.<\/p>\n<p><strong>4. Automa\u00e7\u00e3o de publica\u00e7\u00e3o de camadas<\/strong><\/p>\n<p>Al\u00e9m de estilos, podemos publicar camadas vetoriais e rasters via scripts Python ou Bash integrados ao CI\/CD:<\/p>\n<ul>\n<li>Verifica\u00e7\u00e3o de novos arquivos em pastas espec\u00edficas ou reposit\u00f3rios de dados.<\/li>\n<li>Valida\u00e7\u00e3o de CRS, atributos e integridade dos dados.<\/li>\n<li>Uso da REST API para criar <em>stores<\/em>, <em>featureTypes<\/em> e <em>coverages<\/em>.<\/li>\n<\/ul>\n<p>Exemplo r\u00e1pido em Python para publicar um shapefile:<\/p>\n<pre>\r\nimport requests\r\nimport json\r\n\r\nGEOSERVER_URL = \"http:\/\/localhost:8080\/geoserver\/rest\"\r\nAUTH = (\"admin\", \"geoserver\")\r\n\r\n# Criar ou atualizar store\r\nstore_json = {\"dataStore\": {\"name\": \"biomas_postgis\", \"connectionParameters\":{\"entry\":[{\"@key\":\"url\",\"$\":\"file:data\/biomas.shp\"}]}}}\r\nrequests.post(f\"{GEOSERVER_URL}\/workspaces\/cite\/datastores\", auth=AUTH, headers={\"Content-type\":\"application\/json\"}, data=json.dumps(store_json))\r\n\r\n# Publicar camada\r\nlayer_json = {\"featureType\":{\"name\":\"biomas\",\"title\":\"Biomas do Brasil\",\"srs\":\"EPSG:4674\"}}\r\nrequests.post(f\"{GEOSERVER_URL}\/workspaces\/cite\/datastores\/biomas_postgis\/featuretypes\", auth=AUTH, headers={\"Content-type\":\"application\/json\"}, data=json.dumps(layer_json))\r\n<\/pre>\n<p><strong>5. Boas pr\u00e1ticas em pipelines CI\/CD para GeoServer<\/strong><\/p>\n<ul>\n<li>Versionamento de estilos e scripts em Git, permitindo rollback f\u00e1cil.<\/li>\n<li>Testes autom\u00e1ticos antes de publicar novos dados ou estilos.<\/li>\n<li>Seguran\u00e7a: use vari\u00e1veis de ambiente ou <em>secrets<\/em> para credenciais da API.<\/li>\n<li>Monitoramento de logs do GeoServer para detectar erros em tempo real.<\/li>\n<li>Divis\u00e3o de ambientes: dev, staging e produ\u00e7\u00e3o para evitar impactos em servi\u00e7os cr\u00edticos.<\/li>\n<\/ul>\n<p><strong>Conclus\u00e3o<\/strong><\/p>\n<p>Integrar o GeoServer a pipelines DevOps transforma o gerenciamento de dados geoespaciais em um processo confi\u00e1vel, repet\u00edvel e rastre\u00e1vel. CI\/CD permite aplicar estilos, publicar camadas e atualizar dados automaticamente, mantendo servi\u00e7os WMS e WFS sempre consistentes e dispon\u00edveis.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Prezado leitor, Integrar o GeoServer a um ambiente DevOps permite transformar a publica\u00e7\u00e3o e manuten\u00e7\u00e3o de dados geoespaciais em um processo automatizado, rastre\u00e1vel e seguro. Com pipelines CI\/CD (Continuous Integration \/ Continuous Deployment), \u00e9 poss\u00edvel validar, versionar e publicar camadas&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2025\/09\/11\/geoserver-em-ambientes-devops-ci-cd-para-dados-geoespaciais\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":9926,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[208,327],"class_list":["post-9940","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-geoserver","tag-rest-api"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/9940","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/users\/275"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/comments?post=9940"}],"version-history":[{"count":11,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/9940\/revisions"}],"predecessor-version":[{"id":9951,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/9940\/revisions\/9951"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/9926"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=9940"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=9940"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=9940"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}