{"id":4615,"date":"2018-02-13T08:35:07","date_gmt":"2018-02-13T16:35:07","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4615"},"modified":"2025-06-13T22:49:05","modified_gmt":"2025-06-14T05:49:05","slug":"continuously-deploying-golang-application-using-travis-ci","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/continuously-deploying-golang-application-using-travis-ci\/","title":{"rendered":"Despliegue continuo de una aplicaci\u00f3n Golang usando Travis CI"},"content":{"rendered":"<p>As\u00ed que has estado desarrollando una aplicaci\u00f3n utilizando el lenguaje de programaci\u00f3n Go con un equipo de desarrolladores para tu organizaci\u00f3n. Las mejores pr\u00e1cticas dir\u00edan que necesitas crear pruebas adecuadas y desarrollar una estrategia de integraci\u00f3n y despliegue continuos.<\/p>\n<p>Si te has mantenido al d\u00eda con mis tutoriales, recordar\u00e1s que escrib\u00ed sobre la creaci\u00f3n de un <a href=\"https:\/\/www.couchbase.com\/blog\/es\/create-continuous-deployment-pipeline-nodejs-jenkins\/\" target=\"_blank\" rel=\"noopener\">pipeline de despliegue continuo con Node.js y Jenkins<\/a>. Esta vez vamos a cambiar las cosas con la tecnolog\u00eda de desarrollo y el servicio CI \/ CD.<\/p>\n<p>Vamos a ver c\u00f3mo desplegar de forma continua una aplicaci\u00f3n Golang que interact\u00faa con <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\" target=\"_blank\" rel=\"noopener\">Couchbase<\/a> con el popular <a href=\"https:\/\/travis-ci.org\" target=\"_blank\" rel=\"noopener\">Travis CI<\/a> servicio.<\/p>\n<p><!--more--><\/p>\n<p>El objetivo de este tutorial es ayudarte a crear una aplicaci\u00f3n Golang que se comunique con Couchbase. Esta aplicaci\u00f3n tendr\u00e1 pruebas unitarias apropiadas que se utilizar\u00e1n cuando se active Travis CI. Si las pruebas tienen \u00e9xito en Travis CI, la aplicaci\u00f3n se desplegar\u00e1 autom\u00e1ticamente en alg\u00fan servidor remoto con SSH.<\/p>\n<p>Como prerrequisito, necesitar\u00e1s tener al menos una instancia de Couchbase Server disponible. Esta instancia de Couchbase Server se utilizar\u00e1 durante el despliegue.<\/p>\n<h2>Desarrollo de una aplicaci\u00f3n con Go y Couchbase NoSQL<\/h2>\n<p>Vamos a crear un nuevo proyecto Golang para este ejemplo. En alg\u00fan lugar de tu\u00a0<strong>$GOPATH<\/strong> crear un archivo llamado\u00a0<strong>main.go<\/strong> e incluyen lo siguiente:<\/p>\n<pre class=\"lang:default decode:true\">package main\r\n\r\nimport (\r\n\t\"fmt\"\r\n\t\"os\"\r\n\r\n\tgocb \"gopkg.in\/couchbase\/gocb.v1\"\r\n)\r\n\r\ntype Person struct {\r\n\tType      string `json:\"type\"`\r\n\tFirstname string `json:\"firstname\"`\r\n\tLastname  string `json:\"lastname\"`\r\n}\r\n\r\nvar bucket *gocb.Bucket\r\n\r\nfunc GetPersonDocument(key string) (interface{}, error) {\r\n\tvar data interface{}\r\n\t_, err := bucket.Get(key, &amp;data)\r\n\tif err != nil {\r\n\t\treturn nil, err\r\n\t}\r\n\treturn data, nil\r\n}\r\n\r\nfunc CreatePersonDocument(key string, data interface{}) (interface{}, error) {\r\n\t_, err := bucket.Insert(key, data, 0)\r\n\tif err != nil {\r\n\t\treturn nil, err\r\n\t}\r\n\treturn data, nil\r\n}\r\n\r\nfunc main() {\r\n\tfmt.Println(\"Starting the application...\")\r\n\tcluster, _ := gocb.Connect(\"couchbase:\/\/\" + os.Getenv(\"DB_HOST\"))\r\n\tcluster.Authenticate(gocb.PasswordAuthenticator{Username: os.Getenv(\"DB_USER\"), Password: os.Getenv(\"DB_PASS\")})\r\n\tbucket, _ = cluster.OpenBucket(os.Getenv(\"DB_BUCKET\"), \"\")\r\n\tfmt.Println(GetPersonDocument(\"8eaf1065-5bc7-49b5-8f04-c6a33472d9d5\"))\r\n\tCreatePersonDocument(\"blawson\", Person{Type: \"person\", Firstname: \"Brett\", Lastname: \"Lawson\"})\r\n}<\/pre>\n<p>El c\u00f3digo anterior es simple, pero cambiar\u00e1 significativamente a medida que avancemos en este tutorial. Por ahora, vamos a averiguar lo que hace.<\/p>\n<p>Como estamos usando Couchbase, necesitamos haber obtenido el Go SDK. Esto se puede instalar ejecutando lo siguiente:<\/p>\n<pre class=\"lang:default decode:true\">go get gopkg.in\/couchbase\/gocb.v1<\/pre>\n<p>Con el Go SDK instalado, podemos a\u00f1adirlo a las importaciones de nuestro proyecto.<\/p>\n<p>El proyecto tendr\u00e1 dos funciones muy simples. Habr\u00e1 una funci\u00f3n para recuperar un documento y una funci\u00f3n para crear un documento. Cada documento tendr\u00e1 la funci\u00f3n <code>Persona<\/code> tal como se define en el <code>struct<\/code>.<\/p>\n<pre class=\"lang:default decode:true\">func main() {\r\n\tfmt.Println(\"Starting the application...\")\r\n\tcluster, _ := gocb.Connect(\"couchbase:\/\/\" + os.Getenv(\"DB_HOST\"))\r\n\tcluster.Authenticate(gocb.PasswordAuthenticator{Username: os.Getenv(\"DB_USER\"), Password: os.Getenv(\"DB_PASS\")})\r\n\tbucket, _ = cluster.OpenBucket(os.Getenv(\"DB_BUCKET\"), \"\")\r\n\tfmt.Println(GetPersonDocument(\"8eaf1065-5bc7-49b5-8f04-c6a33472d9d5\"))\r\n\tCreatePersonDocument(\"blawson\", Person{Type: \"person\", Firstname: \"Brett\", Lastname: \"Lawson\"})\r\n}<\/pre>\n<p>Cuando la aplicaci\u00f3n se inicie, se conectar\u00e1 a un cluster de Couchbase seg\u00fan lo especificado por las variables de entorno. Asimismo, se autenticar\u00e1 una cuenta RBAC y se abrir\u00e1 un bucket.<\/p>\n<p>Una vez que la base de datos est\u00e1 lista, primero obtenemos un documento basado en un id:<\/p>\n<pre class=\"lang:default decode:true\">func GetPersonDocument(key string) (interface{}, error) {\r\n\tvar data interface{}\r\n\t_, err := bucket.Get(key, &amp;data)\r\n\tif err != nil {\r\n\t\treturn nil, err\r\n\t}\r\n\treturn data, nil\r\n}<\/pre>\n<p>Suponiendo que el documento exista, ser\u00e1 devuelto. Una vez recuperado el documento, insertamos un nuevo documento en la base de datos.<\/p>\n<pre class=\"lang:default decode:true\">func CreatePersonDocument(key string, data interface{}) (interface{}, error) {\r\n\t_, err := bucket.Insert(key, data, 0)\r\n\tif err != nil {\r\n\t\treturn nil, err\r\n\t}\r\n\treturn data, nil\r\n}<\/pre>\n<p>Ahora te estar\u00e1s preguntando por qu\u00e9 estamos creando funciones para esto. Quiero decir que no estamos haciendo nada especial m\u00e1s all\u00e1 de utilizar el SDK real.<\/p>\n<p>Usa tu imaginaci\u00f3n con estas funciones. Asume que son algo complejas porque escribiremos casos de prueba para ellas. En este ejemplo son simples para que sean f\u00e1ciles de entender.<\/p>\n<h2>Dise\u00f1o de pruebas unitarias con datos simulados<\/h2>\n<p>Tenemos una base para nuestro proyecto, as\u00ed que podemos empezar a pensar en escribir casos de prueba para nuestra aplicaci\u00f3n. Antes de empezar a escribir pruebas, vamos a hacer algunos cambios en el archivo\u00a0<strong>main.go<\/strong> que acabamos de crear.<\/p>\n<p>Abra el\u00a0<strong>main.go<\/strong> e incluya lo siguiente:<\/p>\n<pre class=\"lang:default decode:true\">package main\r\n\r\nimport (\r\n\t\"fmt\"\r\n\t\"os\"\r\n\r\n\tgocb \"gopkg.in\/couchbase\/gocb.v1\"\r\n)\r\n\r\ntype BucketInterface interface {\r\n\tGet(key string, value interface{}) (gocb.Cas, error)\r\n\tInsert(key string, value interface{}, expiry uint32) (gocb.Cas, error)\r\n}\r\n\r\ntype Database struct {\r\n\tbucket BucketInterface\r\n}\r\n\r\ntype Person struct {\r\n\tType      string `json:\"type\"`\r\n\tFirstname string `json:\"firstname\"`\r\n\tLastname  string `json:\"lastname\"`\r\n}\r\n\r\nvar bucket BucketInterface\r\n\r\nfunc (d Database) GetPersonDocument(key string) (interface{}, error) {\r\n\tvar data interface{}\r\n\t_, err := d.bucket.Get(key, &amp;data)\r\n\tif err != nil {\r\n\t\treturn nil, err\r\n\t}\r\n\treturn data, nil\r\n}\r\n\r\nfunc (d Database) CreatePersonDocument(key string, data interface{}) (interface{}, error) {\r\n\t_, err := d.bucket.Insert(key, data, 0)\r\n\tif err != nil {\r\n\t\treturn nil, err\r\n\t}\r\n\treturn data, nil\r\n}\r\n\r\nfunc main() {\r\n\tfmt.Println(\"Starting the application...\")\r\n\tvar database Database\r\n\tcluster, _ := gocb.Connect(\"couchbase:\/\/\" + os.Getenv(\"DB_HOST\"))\r\n\tcluster.Authenticate(gocb.PasswordAuthenticator{Username: os.Getenv(\"DB_USER\"), Password: os.Getenv(\"DB_PASS\")})\r\n\tdatabase.bucket, _ = cluster.OpenBucket(os.Getenv(\"DB_BUCKET\"), \"\")\r\n\tfmt.Println(database.GetPersonDocument(\"8eaf1065-5bc7-49b5-8f04-c6a33472d9d5\"))\r\n\tdatabase.CreatePersonDocument(\"blawson\", Person{Type: \"person\", Firstname: \"Brett\", Lastname: \"Lawson\"})\r\n}<\/pre>\n<p>Observa que hay algunos ligeros cambios en el c\u00f3digo anterior.<\/p>\n<p>Cuando escribimos pruebas para funciones que interact\u00faan con nuestra base de datos, probablemente no es una buena idea probar contra nuestra base de datos real. En su lugar vamos a querer utilizar datos simulados. Sin embargo, vamos a querer escribir pruebas sin saltar a trav\u00e9s de demasiados aros.<\/p>\n<p>Para realizar pruebas f\u00e1cilmente, podemos crear una interfaz que represente nuestro bucket de Couchbase. En nuestro c\u00f3digo principal, usaremos un bucket real y en nuestro c\u00f3digo de prueba usaremos un bucket falso.<\/p>\n<pre class=\"lang:default decode:true\">type BucketInterface interface {\r\n\tGet(key string, value interface{}) (gocb.Cas, error)\r\n\tInsert(key string, value interface{}, expiry uint32) (gocb.Cas, error)\r\n}\r\n\r\ntype Database struct {\r\n\tbucket BucketInterface\r\n}<\/pre>\n<p>En nuestro ejemplo, la interfaz para nuestro cubo s\u00f3lo incluye dos de las muchas funciones posibles del SDK. Esta interfaz coincide con lo que ver\u00edamos en el SDK real.<\/p>\n<p>Las dos funciones que hab\u00edamos creado ahora forman parte del m\u00f3dulo <code>Base de datos<\/code> clase.<\/p>\n<p>Crear un\u00a0<strong>main_test.go<\/strong> en tu proyecto y aseg\u00farate de que contiene el siguiente c\u00f3digo:<\/p>\n<pre class=\"lang:default decode:true\">package main\r\n\r\nimport (\r\n\t\"encoding\/json\"\r\n\t\"os\"\r\n\t\"testing\"\r\n\r\n\t\"github.com\/mitchellh\/mapstructure\"\r\n\tgocb \"gopkg.in\/couchbase\/gocb.v1\"\r\n)\r\n\r\ntype MockBucket struct{}\r\n\r\nvar testdatabase Database\r\n\r\nfunc convert(start interface{}, end interface{}) error {\r\n\tbytes, err := json.Marshal(start)\r\n\tif err != nil {\r\n\t\treturn err\r\n\t}\r\n\terr = json.Unmarshal(bytes, end)\r\n\tif err != nil {\r\n\t\treturn err\r\n\t}\r\n\treturn nil\r\n}\r\n\r\nfunc (b MockBucket) Get(key string, value interface{}) (gocb.Cas, error) {\r\n\tswitch key {\r\n\tcase \"nraboy\":\r\n\t\terr := convert(Person{Type: \"person\", Firstname: \"Nic\", Lastname: \"Raboy\"}, value)\r\n\t\tif err != nil {\r\n\t\t\treturn 0, err\r\n\t\t}\r\n\tdefault:\r\n\t\treturn 0, gocb.ErrKeyNotFound\r\n\t}\r\n\treturn 1, nil\r\n}\r\n\r\nfunc (b MockBucket) Insert(key string, value interface{}, expiry uint32) (gocb.Cas, error) {\r\n\tswitch key {\r\n\tcase \"nraboy\":\r\n\t\treturn 0, gocb.ErrKeyExists\r\n\t}\r\n\treturn 1, nil\r\n}\r\n\r\nfunc TestMain(m *testing.M) {\r\n\ttestdatabase.bucket = &amp;MockBucket{}\r\n\tos.Exit(m.Run())\r\n}\r\n\r\nfunc TestGetPersonDocument(t *testing.T) {\r\n\tdata, err := testdatabase.GetPersonDocument(\"nraboy\")\r\n\tif err != nil {\r\n\t\tt.Fatalf(\"Expected `err` to be `%s`, but got `%s`\", \"nil\", err)\r\n\t}\r\n\tvar person Person\r\n\tmapstructure.Decode(data, &amp;person)\r\n\tif person.Type != \"person\" {\r\n\t\tt.Fatalf(\"Expected `type` to be %s, but got %s\", \"person\", person.Type)\r\n\t}\r\n}\r\n\r\nfunc TestCreatePersonDocument(t *testing.T) {\r\n\t_, err := testdatabase.CreatePersonDocument(\"blawson\", Person{Type: \"person\", Firstname: \"Brett\", Lastname: \"Lawson\"})\r\n\tif err != nil {\r\n\t\tt.Fatalf(\"Expected `err` to be `%s`, but got `%s`\", \"nil\", err)\r\n\t}\r\n}<\/pre>\n<p>El c\u00f3digo anterior es realmente donde la magia entra en nuestro proyecto. Utiliza una mezcla de c\u00f3digo del archivo principal y c\u00f3digo de prueba personalizado.<\/p>\n<p>Tomemos como ejemplo lo siguiente:<\/p>\n<pre class=\"lang:default decode:true\">type MockBucket struct{}\r\n\r\nvar testdatabase Database<\/pre>\n<p>Al realizar las pruebas, no vamos a trabajar con un bucket Couchbase real, por lo que tenemos que crear nuestro propio bucket ficticio <code>struct<\/code>. Utilizaremos el <code>Base de datos<\/code>\u00a0del archivo principal y utiliza la estructura de datos <code>BucketInterface<\/code>.<\/p>\n<p>Cuando comiencen las pruebas, podremos crear nuestro cubo ficticio:<\/p>\n<pre class=\"lang:default decode:true\">func TestMain(m *testing.M) {\r\n\ttestdatabase.bucket = &amp;MockBucket{}\r\n\tos.Exit(m.Run())\r\n}<\/pre>\n<p>Ahora, como nuestro cubo simulado no tiene funciones como el cubo real, tenemos que crear las funciones definidas en nuestra interfaz. En otras palabras, tenemos que crear un <code>Inserte<\/code> y un <code>Visite<\/code> funci\u00f3n.<\/p>\n<p>Empezando por el <code>Inserte<\/code> funci\u00f3n:<\/p>\n<pre class=\"lang:default decode:true\">func (b MockBucket) Insert(key string, value interface{}, expiry uint32) (gocb.Cas, error) {\r\n\tswitch key {\r\n\tcase \"nraboy\":\r\n\t\treturn 0, gocb.ErrKeyExists\r\n\t}\r\n\treturn 1, nil\r\n}<\/pre>\n<p>Nuestra prueba va a ser sencilla. Vamos a intentar insertar cualquier documento excepto uno con una clave de <code>nraboy<\/code>. La prueba tendr\u00e1 \u00e9xito o fracasar\u00e1 en funci\u00f3n de la clave.<\/p>\n<p>En <code>Visite<\/code> funciona de forma similar.<\/p>\n<pre class=\"lang:default decode:true\">func convert(start interface{}, end interface{}) error {\r\n\tbytes, err := json.Marshal(start)\r\n\tif err != nil {\r\n\t\treturn err\r\n\t}\r\n\terr = json.Unmarshal(bytes, end)\r\n\tif err != nil {\r\n\t\treturn err\r\n\t}\r\n\treturn nil\r\n}\r\n\r\nfunc (b MockBucket) Get(key string, value interface{}) (gocb.Cas, error) {\r\n\tswitch key {\r\n\tcase \"nraboy\":\r\n\t\terr := convert(Person{Type: \"person\", Firstname: \"Nic\", Lastname: \"Raboy\"}, value)\r\n\t\tif err != nil {\r\n\t\t\treturn 0, err\r\n\t\t}\r\n\tdefault:\r\n\t\treturn 0, gocb.ErrKeyNotFound\r\n\t}\r\n\treturn 1, nil\r\n}<\/pre>\n<p>Al intentar obtener un documento, esperamos una clave de <code>nraboy<\/code>. Si se ha proporcionado la clave correcta, devuelve algunos datos marshalled por nuestro <code>convertir<\/code> de lo contrario devolver\u00e1 un error.<\/p>\n<p>De nuevo, estas son versiones simuladas de lo que encontrar\u00edamos en el SDK de Go para operaciones de cubo. Con las funciones de interfaz creadas, podemos escribir nuestras dos funciones de prueba.<\/p>\n<pre class=\"lang:default decode:true\">func TestGetPersonDocument(t *testing.T) {\r\n\tdata, err := testdatabase.GetPersonDocument(\"nraboy\")\r\n\tif err != nil {\r\n\t\tt.Fatalf(\"Expected `err` to be `%s`, but got `%s`\", \"nil\", err)\r\n\t}\r\n\tvar person Person\r\n\tmapstructure.Decode(data, &amp;person)\r\n\tif person.Type != \"person\" {\r\n\t\tt.Fatalf(\"Expected `type` to be %s, but got %s\", \"person\", person.Type)\r\n\t}\r\n}<\/pre>\n<p>En <code>TestGetPersonDocument<\/code> utilizar\u00e1 nuestro <code>base de datos de pruebas<\/code> que utiliza el cubo simulado. Sin embargo, utiliza la variable <code>GetPersonDocument<\/code> del\u00a0<strong>main.go<\/strong> archivo. Recuerde, nuestra funci\u00f3n padre podr\u00eda ser mucho m\u00e1s compleja, pero el tema de la base de datos es ahora un simulacro.<\/p>\n<p>El resultado de nuestra funci\u00f3n se decodificar\u00e1 en el archivo <code>Persona<\/code> utilizando la estructura de datos <a href=\"https:\/\/github.com\/mitchellh\/mapstructure\" target=\"_blank\" rel=\"noopener\">mapaestructura<\/a> paquete. Puede obtener m\u00e1s informaci\u00f3n sobre el uso del paquete mapstructure en <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2017\/04\/decode-map-values-native-golang-structures\/\" target=\"_blank\" rel=\"noopener\">aqu\u00ed<\/a>.<\/p>\n<pre class=\"lang:default decode:true\">func TestCreatePersonDocument(t *testing.T) {\r\n\t_, err := testdatabase.CreatePersonDocument(\"blawson\", Person{Type: \"person\", Firstname: \"Brett\", Lastname: \"Lawson\"})\r\n\tif err != nil {\r\n\t\tt.Fatalf(\"Expected `err` to be `%s`, but got `%s`\", \"nil\", err)\r\n\t}\r\n}<\/pre>\n<p>En <code>TestCreatePersonDocument<\/code> sigue la misma estrategia. Estamos utilizando el cubo falso, pero el muy real <code>CrearDocumentoPersona<\/code> funci\u00f3n. En <code>Inserte<\/code> utilizar\u00e1 lo que hab\u00edamos creado en nuestra prueba.<\/p>\n<p>No hay mucho para probar una aplicaci\u00f3n Golang que incluya interacci\u00f3n con la base de datos. Tu mejor opci\u00f3n es crear una interfaz y utilizar tus propias versiones simuladas personalizadas de las funciones y los datos.<\/p>\n<h2>Creaci\u00f3n de una configuraci\u00f3n YAML para Travis CI<\/h2>\n<p>As\u00ed que tenemos nuestra aplicaci\u00f3n Go con algunas pruebas unitarias. Ahora tenemos que ser capaces de utilizar Travis CI para probar autom\u00e1ticamente nuestra aplicaci\u00f3n y desplegarla si tiene \u00e9xito.<\/p>\n<p>Travis CI funciona a partir de un archivo de configuraci\u00f3n YAML. Tomemos como ejemplo la siguiente configuraci\u00f3n:<\/p>\n<pre class=\"lang:default decode:true\">language: go\r\ngo:\r\n    - 1.8\r\nbefore_script:\r\n    - sudo apt-get install -qq sshpass\r\nscript:\r\n    - go test -v\r\n    - go build\r\nafter_success:\r\n    - sshpass -p $SSH_PASS scp -o stricthostkeychecking=no golang-ci-example $SSH_USER@$SSH_HOST:~\/\r\n    - sshpass -p $SSH_PASS ssh -o StrictHostKeyChecking=no $SSH_USER@$SSH_HOST DB_HOST=$DB_HOST DB_USER=$DB_USER DB_PASS=$DB_PASS DB_BUCKET=$DB_BUCKET .\/golang-ci-example\r\nenv:\r\n    global:\r\nnotifications:\r\n    on_success: never\r\n    on_failure: never<\/pre>\n<p>La configuraci\u00f3n anterior indica que estamos utilizando Go 1.8. Antes de empezar a ejecutar scripts, necesitamos descargar un paquete necesario. Necesitamos <code>sshpass<\/code> que nos permite SSH con contrase\u00f1as en texto plano. Al final probablemente querr\u00e1s usar claves, pero para este ejemplo est\u00e1 bien.<\/p>\n<p>En <code>sshpass<\/code> se ha descargado, tenemos que ejecutar nuestras pruebas. Esto se hace en el <code>guiones<\/code> secci\u00f3n. Despu\u00e9s de que el primer script termine, podemos construir nuestro proyecto.<\/p>\n<p>Asumiendo que ambos scripts se han completado con \u00e9xito, queremos centrarnos en el despliegue.<\/p>\n<pre class=\"lang:default decode:true\">after_success:\r\n    - sshpass -p $SSH_PASS scp -o stricthostkeychecking=no golang-ci-example $SSH_USER@$SSH_HOST:~\/\r\n    - sshpass -p $SSH_PASS ssh -o StrictHostKeyChecking=no $SSH_USER@$SSH_HOST DB_HOST=$DB_HOST DB_USER=$DB_USER DB_PASS=$DB_PASS DB_BUCKET=$DB_BUCKET .\/golang-ci-example<\/pre>\n<p>Se ejecutan dos comandos diferentes para el despliegue. El primer comando copiar\u00e1 el binario a un servidor remoto y el segundo comando ejecutar\u00e1 ese archivo en el servidor remoto.<\/p>\n<p>Ambos comandos de despliegue hacen referencia a variables de entorno en el proceso CI \/ CD que posteriormente se pasan al servidor.<\/p>\n<p>Ahora, notar\u00e1s que no hemos establecido ninguna variable de entorno. Estas variables son sensibles y no deber\u00edan ser texto plano dentro de nuestro repositorio Git. En su lugar podemos utilizar secretos con Travis CI.<\/p>\n<p>Descargar el <a href=\"https:\/\/docs.travis-ci.com\/user\/encryption-keys\/#Usage\" target=\"_blank\" rel=\"noopener\">travis<\/a> CLI siguiendo la documentaci\u00f3n de Travis CI. Con la herramienta instalada, ejecute lo siguiente:<\/p>\n<pre class=\"lang:default decode:true\">travis encrypt SSH_HOST=YOUR_REMOTE_SERVER --add\r\ntravis encrypt SSH_USER=YOUR_REMOTE_SERVER_USER --add\r\ntravis encrypt SSH_PASS=YOUR_REMOTE_SERVER_PASS --add\r\n\r\ntravis encrypt DB_HOST=YOUR_COUCHBASE_SERVER --add\r\ntravis encrypt DB_USER=YOUR_COUCHBASE_SERVER_USER --add\r\ntravis encrypt DB_PASS=YOUR_COUCHBASE_SERVER_PASS --add\r\ntravis encrypt DB_BUCKET=YOUR_COUCHBASE_BUCKET --add<\/pre>\n<p>En lugar de a\u00f1adir toda su informaci\u00f3n como texto plano en el archivo YAML, se cifra y puede ser entendido por Travis CI. La configuraci\u00f3n YAML que a\u00f1ada tendr\u00e1 este aspecto:<\/p>\n<pre class=\"lang:default decode:true\">env:\r\n    global:\r\n        - secure: C\/5OS6jDmcubVA\/AKmapQDON9YH4+eK31geLzcCz6DjoG0zDCWX3qas+y3thij3sQ6E+54fUGZO\/8AeoVykfyEfhLRICgVw4d7RjGbjPFqDABVOFTB+HXxRNk5mNWGz\/V07r4N\/tnM+XMzUBKxOtgNNL7G0SjEPS9ormJGUbH3pYwnlTpzOUXHzvJ0x8Ynk7vC3Bfg5X0ALpNtjK7Wc0WCOCxhnDraUcWiBR3kp43QPac9nw\/eiSicLz1Y88ToxrXF2o6aPJqCrP0cpEDAMmtB89j14OIUDmaULssPk6WWWAeE4CvaqOlRG+gr5j2z9UgEfO6DoaIcL6TZQDCOQQix1f+5AMfexOFVn6oUO8O4x1wtfYwZwnajZ+O4R3ZKb1nHg1rY16m8O61yB0wdoaSP6NVn\/lyGkwmz7tNWGhGoxMgvG9U6yZuOYqwseP67y2y99zg94kR4WNF7NeH5YvaZo53d5pgPRMy\/0w15wJRJFgK3ef87EgMRWCJqVTEOw0bo+SQRPvDZRa7MgraxoZRkW2FKqYShWb7Ch0FlTTAY3ZCfynG+mXcDjMbaDWaUkea8KIfb7r7\/a8vDF5bXwNGDkQkbcZEMh46CnZxiLWgqsviBlISWuQAN1VgBLSI\/O\/uhJPHJzNGyhotDQf9W6Y+DiKqW40z3rAf4ZB9Li4+b4=\r\n        - secure: Pcv4MzEb0LD3LV9dtfevGwdI8wgkSAkgSq+lMByx6eQOLvA9mc4PVFin6A2Dc1FpObSuZfDLhr\/eGuFg8TbaY7KncPc7r\/OrPsSb9xCN9xPRlHP7mC+3t1NWjdGt6lVI647hlFQBs+MO8OHEyUquE6XHUZ8mnYe13TychlOM1VG+M2luyA46hEBMrUTId6CgsytqqCGWNqqZ5HBY01\/ne4qxQUX3LI3dPUThFjpKqYqLBx2S7FlMDhOYL01XPQ+yQ2CWWCzCau876IM5Mzey73brj4XE6SerFi6tBxLFtk7LxVa+6JvSi5tLZZ91kf6o6P7WD6O0q4T48BeUg5ewGFbX0+JF5YO7OA0ZAT3n8rKsfZCjiAO4GtHRcG0wV1Uh+etJSoWqR0+dZk4g7L9lIOOKwQiTl+7PoMYW3yhvbilLjcJ\/yektQJe\/NjSJFHqYH7EqeqbR3IAzjkxepZl6vwY08acoTdW918E27Lj7+mjUuUJSxT8aY8+DWQg6+RLSYXjLXsZ1m77VsYQ6gpEyXJYrnPnybVHX57GC7kXGonM4UAbtN3D80Qr37\/OX7i06MnJTa2xgkUVl\/HK7HfFlQsaX8yIC1zzaNHwNVKxIIGu\/hLM6GAPpF49y2ictmVbu0UKABcak4GdiF7zhrOF91p0Qui\/xcIcz2\/f+XBFU6vE=\r\n        - secure: KHaZKnIBoJmsVMYQUFAFAFbbqquM\/Stht0AZdsB6sbBvYnz2XLAaxpL89tBGp7IEibXW9\/C4t034oAQPaeF6AuODboetgvtjxGTOi+vcBqAj9l07IlajH89yi2Tx6zTq8DvyCKBjaNu0ocD70rplqEBZwa\/mttqw+YXKv29C4eunusho\/2Jcq+uztTJdiGZsy73NRAFFSLLezzTEQ4sLYc9v\/PYOiP\/BwcPzemj1DpQr8awly7LtQSj6QdTrjLotQmVTvdXsFHUcPsQdRlLKcy781Q5oP95inujB37vcusOjTru6bXYUzS8hMz\/JkUX4bocvd4yf1SLEmBbocHu6X4wmuI+JxD8WSBnkbJHjnWDPyEm5VRzq2rT+9hoe83XN9wm+im+bEfQUmYmyttCDmCogl+vaX337JaHrKESVtBlBRPUOlS6xM\/6gi8HT7EbG4Ir1qqNVGVbbdKemD+odcQqNQDVREkqSCOD0rdmXjJSpb8BSH5ftqF3lvfsVyO9fUkzxZfhL7O6pkiH4LGqwU1RaMKhlixQBhrjtRTLfluHR3\/9tZxKhyQHc\/pXV+wWHig2ziKVhk02c82fNAD5J4lpf8QK5wzWqBBnsPQ20\/gRXoqi3QkF66ZUKTy8r\/03NHeJtSraWOYE5\/6kzNSCcnL245l6r73fc5IJCa1+Ijmc=\r\n        - secure: o\/N\/\/U7qZJyERaGi89H00rdgma1ACL2O1vEgn\/qZdJx0OQk02Sj1w9H0pMawMcWlLCAlZZzwdnwkH604p76iSiTffknEZ0kfr\/YWise1ACeO2NLxMcn\/o+ch9Hjpuc9vWkMsFRqDv9WFYd6xRcAz8BRAeavhe3kykcBOacY7ZLGIc2NQarlhKXPY4xpPEhAhjnCrmsMq1ppCbnINAu8dLx4lyTCGF4FHYwPsCUylfgGI4Kr5gO1ikg7mLV1rL0RYmKm0MQrQbOuUrlnXdRaTbsBKhMBWDUjlmg+aeC4DPOcSTEvJ3YEhDk8bLDttr8RRhEUlgGkNNN21cpCBvbhSD6OaZdwFF6PFyd63CBSgi\/abv36iewjgGwjKoHdptkSiMQzYBe4qzjD4MupYwrgj8TibfW+Y21vzNtY6BnpXnuetCD41NgY5PZyLfQkvi6YcIi6MW9x4vc87EPhO8JcTMvchoQgg9LVv+BoA3Wf8qz1aRiLnctEeOwAdix6bGxh3JZqR+5HYvLSCdWrnwhKbWBgju3icYZ9odDnLfrDqPhcsPfU4BBUh+xU1khuv\/n3Vy27y81iqpWBb+iGH59IL+FPZDMeGETGZiAkDHiJxu9s3fr1VtK\/B8WGKqrGbKU3GOOm0JEfZJHDRmchDLOJoRlbubcljDnfSAFEMy19XWEI=\r\n        - secure: l0\/Z0FTznp9w2pmr1QxjTxtQsnaVUHZNDk+EBWyiTepxkkgH8ohDqM5jocaZQyMZmV3WUNG1phBD1S+MaF+ou1BIfHGKmnOm7OXujskgdvtvNzqFKCfkh30qcaipzM653VrZdatnU9zwzbgURWSkPXQ5B05yrs\/AH0sBOaIgl1J7JOXV6RZAOLkBahjMTSKc34ckBNt1Q6WpIKnzYqPdYpLpS8nmDZVszC7Fo4ykXsm7lloFJ43Ii+5D9culyGpq6z2eFvpALEYnixSkl3zUFNwuf1CIdsFBJThWdbYMlO6R2vi0N8QszMSLMc+Ry+HHm54E6IhbrReKCV8Rnho1DF4+0bmAbj7xNIl9uAFOOhuONLYzQLH+x7FxyjKJx8EiirgofO8EUdfEkXauIr+hufYboepMGjGIcUiO+VUXHo1w+o6GIHVGddxtnBU8ryctiZwUOkLJpR6ex6tltuJCFw5YzXvcLOf0+ZYoNZAFctc0DA0hpIAyv1ZoVGEpX+3Mi14zv7LYkLhPKnjc4MIm6mkQfMcBsVjK1aGow6ypDpQFcHKTNXOxNepD8uM9afoR11hhy8jPD8VtWNTn9vW+Szocoe65EbWmz3V0YDLmfCgm0Ltg4IanJOH6cEV8uUNYjHuj4X731dnmBa\/vlGDyhSeLCjzcuSkukmqVZhLUpMI=\r\n        - secure: VQE+9BAya6XAUBsGKF5kqCm1L6eO2mmaM9VmEx0u+xObUygjq32FN3i\/mQ6cs26SQJQ07XDBnwsnAhTY3\/u9ZP6hJrpY\/2Q2dOMuUHU6kx5gJhAGfnza8yv4cedCl54dSRf5zH5YdO7kb8jwhBFvjMJrbzCmnCuFrWbFKgLqOCqqykL51o48Q33kIbkbj+t8tmVu0JyyQ8kpBpgVgpilPWWeR2xtKkKEskU4Shpywjy02maOxgt6BHQFumdzPIT\/h2Bwb8qh74k8CrqQwvmA9Vxcg2qHCH9G8NEXbwd4BFxncET8FJfgqvCuuu3EWiT46EhG2xgI9\/1cgzlf16ZMnQIzhuSs6fnOlNlK2PJtijovVlQDxVpXJ863oWVpln5V3vfqGllJ9lEaF4TVuVQG3jsXGfX5j2BMwiLMvMF+o0Ym\/YUne84jCoJ5+ImJa9o0I+8qC32QV+OElJ\/BtCuB1koiCYz4cKcl5i\/6+0J0TSQKzj3\/RlZKndAgnAoT1qBQwL4oHG5ZWXJWO85BYwy\/9jBroGLASHR70oDPkmGR4Msgm+B\/qq520LljG72jA220IBnNK8LKXQpzn0rPaN9VwHz2HoSb0O7x6eagKzEoL0AiMOsIMyD1kA1xLWX6RAP8T1Mo1PP2Gv8lzcRCKcj5SMlw5I3ZLcT14EW4gxW1l8s=\r\n        - secure: RDgyGNdr2kpQzYT4hsCLH\/UyoxdIG83r37Fqg0J6rc7mY3u6sj62Btp20Z1f7Hh9R2e6tPZJcSY6NtT4fj6OcGQgHASAPjmYl6Fn+MFOcwIfS6Y2Pu8BGQlzTpDzeSqg\/JHNeStD29yervJuPGshrrZKeTECkV1PwHQMbRS+uENVoO4VM11dQXa+GWTznyrjItIKUabHSJ520QbheAnHJ1\/NkUnc824nTvwZoQ4zw9YgAE\/UvvHfyAZ4+3HjUsUaI1ZiD\/UHk2VjZsllp7dTPlW33a1MZL2MJD+wWtPmi6xVeNF2pIvX4TnhQYpQZ1oP5U6UZrFgLxe9doIpSgswPObR2pHUySg\/Ts\/jAY0O\/JfZH+SH0tyzrUrllLm4KirkHgiLbjcHGlzvjuGAOdwUgrEmVser7x3kKnj6IQiE9iAqm\/jzGsbS1M3zSY6Um1vyjyqPFXwF10HP7cvdA290Wrjrqov6o+H4N21ldBvZp1EQuyRsE8cPaVt8ik5ti0ZN9P\/8\/oZmvJsLHHGOoIkkusDy7m61H9GSNr1d52cPHiVJyEdKtQJPTRdoMirgz1wpJiY\/OCHzifxkuVuf1bBo1IjVbC5aG+5Halx2NPX5QW8Lfl2xJMprA1rvNnFLXiaX8hZUVDrvhA\/zNJFY8yu23pW0OInsJ7HAggUw+EHpaXM=<\/pre>\n<p>Esto es algo que puedes guardar en tu repositorio Git y sentirte seguro. Un enfoque a\u00fan m\u00e1s seguro ser\u00eda utilizar claves p\u00fablicas y privadas para SSH, pero esto est\u00e1 bien para este ejemplo.<\/p>\n<p>Cuando empujes tu proyecto, asumiendo que lo has vinculado en tu cuenta de Travis CI, la aplicaci\u00f3n se probar\u00e1 y desplegar\u00e1 autom\u00e1ticamente.<\/p>\n<h2>La importancia de NoSQL en la implantaci\u00f3n continua<\/h2>\n<p>Hemos visto c\u00f3mo crear pruebas que utilizan datos simulados como base de datos. Sin embargo, lo que es realmente conveniente es que no necesitamos crear scripts de actualizaci\u00f3n cuando nuestros datos cambian. En una base de datos relacional tendr\u00edas que crear scripts de alteraci\u00f3n para tu tabla. Con Couchbase, si tu modelo de datos necesita cambiar, simplemente cambia a <code>struct<\/code> para <code>Persona<\/code> en el c\u00f3digo.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Acaba de ver c\u00f3mo utilizar Travis CI para desplegar continuamente su proyecto Golang que utiliza un archivo <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\" target=\"_blank\" rel=\"noopener\">Couchbase<\/a> Base de datos NoSQL. Durante la fase de integraci\u00f3n continua, la aplicaci\u00f3n se prueba utilizando datos simulados. Cuando se superan las pruebas y se construye el proyecto, se env\u00eda a un servidor remoto y se ejecuta.<\/p>\n<p>El ejemplo utilizado en este tutorial se encuentra en <a href=\"https:\/\/github.com\/couchbaselabs\/golang-ci-example\" target=\"_blank\" rel=\"noopener\">GitHub<\/a>. Tenga en cuenta que el servidor remoto al que se env\u00eda el proyecto ha sido eliminado.<\/p>\n<p>Si est\u00e1 interesado en saber m\u00e1s sobre Go con Couchbase, consulte la p\u00e1gina <a href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/\" target=\"_blank\" rel=\"noopener\">Portal para desarrolladores de Couchbase<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>So you&#8217;ve been developing an application using the Go programming language with a team of developers for your organization. Best practice would say that you need to create proper tests and develop a continuous integration and deployment strategy. If you&#8217;ve [&hellip;]<\/p>","protected":false},"author":63,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1820],"tags":[1919,2031,1920,1567,2150,1413,1725],"ppma_author":[9032],"class_list":["post-4615","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-golang","tag-cd","tag-ci","tag-continuous-delivery","tag-continuous-deployment","tag-continuous-integration","tag-github","tag-nosql-database"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Continuously Deploying a Golang Application Using Travis CI<\/title>\n<meta name=\"description\" content=\"Learn how to create a Go application that interacts with the NoSQL database, Couchbase, and how to use Travis CI for continuous integration and deployment.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/continuously-deploying-golang-application-using-travis-ci\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Continuously Deploying a Golang Application Using Travis CI\" \/>\n<meta property=\"og:description\" content=\"Learn how to create a Go application that interacts with the NoSQL database, Couchbase, and how to use Travis CI for continuous integration and deployment.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/continuously-deploying-golang-application-using-travis-ci\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2018-02-13T16:35:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T05:49:05+00:00\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Continuously Deploying a Golang Application Using Travis CI\",\"datePublished\":\"2018-02-13T16:35:07+00:00\",\"dateModified\":\"2025-06-14T05:49:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/\"},\"wordCount\":1478,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"cd\",\"ci\",\"continuous delivery\",\"Continuous Deployment\",\"continuous integration\",\"GitHub\",\"NoSQL Database\"],\"articleSection\":[\"Best Practices and Tutorials\",\"GoLang\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/\",\"name\":\"Continuously Deploying a Golang Application Using Travis CI\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2018-02-13T16:35:07+00:00\",\"dateModified\":\"2025-06-14T05:49:05+00:00\",\"description\":\"Learn how to create a Go application that interacts with the NoSQL database, Couchbase, and how to use Travis CI for continuous integration and deployment.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Continuously Deploying a Golang Application Using Travis CI\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Despliegue continuo de una aplicaci\u00f3n Golang usando Travis CI","description":"Aprenda a crear una aplicaci\u00f3n Go que interact\u00fae con la base de datos NoSQL, Couchbase, y a utilizar Travis CI para la integraci\u00f3n y el despliegue continuos.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/continuously-deploying-golang-application-using-travis-ci\/","og_locale":"es_MX","og_type":"article","og_title":"Continuously Deploying a Golang Application Using Travis CI","og_description":"Learn how to create a Go application that interacts with the NoSQL database, Couchbase, and how to use Travis CI for continuous integration and deployment.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/continuously-deploying-golang-application-using-travis-ci\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2018-02-13T16:35:07+00:00","article_modified_time":"2025-06-14T05:49:05+00:00","author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Continuously Deploying a Golang Application Using Travis CI","datePublished":"2018-02-13T16:35:07+00:00","dateModified":"2025-06-14T05:49:05+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/"},"wordCount":1478,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["cd","ci","continuous delivery","Continuous Deployment","continuous integration","GitHub","NoSQL Database"],"articleSection":["Best Practices and Tutorials","GoLang"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/","url":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/","name":"Despliegue continuo de una aplicaci\u00f3n Golang usando Travis CI","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2018-02-13T16:35:07+00:00","dateModified":"2025-06-14T05:49:05+00:00","description":"Aprenda a crear una aplicaci\u00f3n Go que interact\u00fae con la base de datos NoSQL, Couchbase, y a utilizar Travis CI para la integraci\u00f3n y el despliegue continuos.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Continuously Deploying a Golang Application Using Travis CI"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, Defensor del Desarrollador, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y m\u00f3vil m\u00e1s f\u00e1cil de entender.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","author_category":"","last_name":"Raboy","first_name":"Nic","job_title":"","user_url":"https:\/\/www.thepolyglotdeveloper.com","description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y m\u00f3vil m\u00e1s f\u00e1cil de entender."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4615","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=4615"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4615\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=4615"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=4615"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=4615"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=4615"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}