Openshift, Go: Fazendo o deploy de uma aplicação Web

Esse post tem como objetivo mostrar como é feito o deploy deu ma aplicação em Go dentro do Openshift.

A primeira coisa que vou explicar é um framework chamado Beego, que te auxilia no desenvolvimento de aplicações Web em Go.

Antes de iniciar o desenvolvimento de uma aplicação utilizando o Beego, é necessário fazer a instalação de 2 pré requisitos, sendo eles o próprio framework e uma outra chamada Bee, que serve para criar a estrutura inicial da sua aplicação Go.

Estou considerando que você já tem o Go instalado na sua máquina, então para fazer a instalação desses dois itens é necessário digitar os comandos abaixo:

go get -u github.com/astaxie/beego
go get -u github.com/beego/bee

Um ponto importante é que ao instalar o Go na sua máquina, nem sempre é mapeada a variavel GOPATH no seu ambiente, então é importante definir onde o binário Bee por exemplo pode ser encontrado, para isso digite o comando abaixo:

echo 'export PATH="$GOPATH/bin:$PATH"' >> ~/.profile
source ~/.profile

Então entre em:

cd $GOPATH/src
ls

Agora que você já tem o ambiente pronto, crie um novo projeto chamado hello.

bee new blog

Veja que uma estrutura inicial de diretórios já foi criada, já é possível testar o framework utilizando o comando abaixo:

bee run blog

Ao executar esse comando será iniciado um servidor web na porta 8080, que você pode acessar por:

http://localhost:8080

Será aberta uma página parecida com essa:

Será tudo ocorreu bem podemos criar nossa página, para isso edite o arquivo main.go e deixe-o da seguinte forma:

package main
 
import (
	"github.com/astaxie/beego"
)
 
type MainController struct {
	beego.Controller
}
 
func (this *MainController) Get(){
	this.Ctx.WriteString("<h1>Hello Go!</h1>")
}
 
func main() {
	beego.Router("/", &MainController{})
	beego.Run()
}

Salve o arquivo e faça a compilação.

go build -o blog main.go

Ao rodar a compilação será gerado um executável chamado blog, execute da seguinte forma:

./blog

Acesse http://localhost:8080 .

Pronto! Temos o nosso application pronto.

Agora vamos fazer o deploy dessa aplicação no Openshift.

Primeiro vamos criar um arquivo de template, crie um arquivo chamado beego.json com o conteúdo abaixo:

{
  "kind": "Template",
  "apiVersion": "v1",
  "metadata": {
    "name": "beego-openshift",
    "annotations": {
      "description": "An example Beego (http://beego.me/) application written in Golang",
      "tags": "quickstart,golang",
      "iconClass": "icon-golang"
    }
  },
  "labels": {
      "template": "beego-openshift",
      "app": "beego-openshift"
  },
  "objects": [
    {
      "kind": "Service",
      "apiVersion": "v1",
      "metadata": {
        "name": "beego-openshift",
        "annotations": {
          "description": "Exposes and load balances the application pods"
        }
      },
      "spec": {
        "ports": [
          {
            "name": "web",
            "port": 8080,
            "targetPort": 8080
          }
        ],
        "selector": {
          "name": "beego-openshift"
        }
      }
    },
    {
      "kind": "Route",
      "apiVersion": "v1",
      "metadata": {
        "name": "beego-openshift"
      },
      "spec": {
        "host": "${APPLICATION_DOMAIN}",
        "to": {
          "kind": "Service",
          "name": "beego-openshift"
        }
      }
    },
    {
      "kind": "ImageStream",
      "apiVersion": "v1",
      "metadata": {
        "name": "beego-openshift",
        "annotations": {
          "description": "Keeps track of changes in the application image"
        }
      }
    },
    {
      "kind": "BuildConfig",
      "apiVersion": "v1",
      "metadata": {
        "name": "beego-openshift",
        "annotations": {
          "description": "Defines how to build the application"
        }
      },
      "spec": {
        "source": {
          "type": "Git",
          "git": {
            "uri": "${SOURCE_REPOSITORY_URL}",
            "ref": "${SOURCE_REPOSITORY_REF}"
          },
          "contextDir": "${CONTEXT_DIR}"
        },
        "strategy": {
          "type": "Docker"
        },
        "output": {
          "to": {
            "kind": "ImageStreamTag",
            "name": "beego-openshift:latest"
          }
        },
        "triggers": [
          {
            "type": "ConfigChange"
          },
          {
            "type": "GitHub",
            "github": {
              "secret": "${GITHUB_WEBHOOK_SECRET}"
            }
          }
        ]
      }
    },
    {
      "kind": "DeploymentConfig",
      "apiVersion": "v1",
      "metadata": {
        "name": "beego-openshift",
        "annotations": {
          "description": "Defines how to deploy the application server"
        }
      },
      "spec": {
        "strategy": {
          "type": "Recreate"
        },
        "triggers": [
          {
            "type": "ImageChange",
            "imageChangeParams": {
              "automatic": true,
              "containerNames": [
                "beego-openshift"
              ],
              "from": {
                "kind": "ImageStreamTag",
                "name": "beego-openshift:latest"
              }
            }
          },
          {
            "type": "ConfigChange"
          }
        ],
        "replicas": 1,
        "selector": {
          "name": "beego-openshift"
        },
        "template": {
          "metadata": {
            "name": "beego-openshift",
            "labels": {
              "name": "beego-openshift"
            }
          },
          "spec": {
            "containers": [
              {
                "name": "beego-openshift",
                "image": "beego-openshift",
                "ports": [
                  {
                    "containerPort": 8080
                  }
                ]
              }
            ]
          }
        }
      }
    }
  ],
  "parameters": [
    {
      "name": "SOURCE_REPOSITORY_URL",
      "description": "The URL of the repository with your application source code",
      "value": "https://github.com/AlissonMMenezes/go-openshift.git"
    },
    {
      "name": "SOURCE_REPOSITORY_REF",
      "description": "Set this to a branch name, tag or other ref of your repository if you are not using the default branch"
    },
    {
      "name": "CONTEXT_DIR",
      "description": "Set this to the relative path to your project if it is not in the root of your repository"
    },
    {
      "name": "APPLICATION_DOMAIN",
      "description": "The exposed hostname that will route to the Beego service",
      "value": "go.alissonmachado.com.br"
    },
    {
      "name": "GITHUB_WEBHOOK_SECRET",
      "description": "Github trigger secret.  A difficult to guess string encoded as part of the webhook URL.  Not encrypted.",
      "generate": "expression",
      "from": "[a-zA-Z0-9]{40}"
    }
  ]
}

Agora faça o login no seu openshift e crie um projeto.

oc login -u developer
oc new-project alissonmachado

Agora é só fazer o deploy da aplicação:

oc new-app beego.json -p SOURCE_REPOSITORY_URL=https://github.com/AlissonMMenezes/go-openshift

E acompanhe na interface o deploy na interface que deve ficar da seguinte forma:

Qualquer dúvida em como subir o openshift eu tenho esse artigo: Minishift

Qualquer dúvida chama que é nóis!