{"id":4615,"date":"2018-02-13T08:35:07","date_gmt":"2018-02-13T16:35:07","guid":{"rendered":"http:\/\/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\/ko\/continuously-deploying-golang-application-using-travis-ci\/","title":{"rendered":"Travis CI\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc9c0\uc18d\uc801\uc73c\ub85c Golang \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc30\ud3ec\ud558\uae30"},"content":{"rendered":"<p>\uc870\uc9c1\uc5d0\uc11c \uac1c\ubc1c\uc790 \ud300\uacfc \ud568\uaed8 Go \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uac1c\ubc1c\ud558\uace0 \uc788\ub2e4\uace0 \uac00\uc815\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \ubaa8\ubc94 \uc0ac\ub840\uc5d0 \ub530\ub974\uba74 \uc801\uc808\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc0dd\uc131\ud558\uace0 \uc9c0\uc18d\uc801\uc778 \ud1b5\ud569 \ubc0f \ubc30\ud3ec \uc804\ub7b5\uc744 \uac1c\ubc1c\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc81c \ud29c\ud1a0\ub9ac\uc5bc\uc744 \uafb8\uc900\ud788 \ub530\ub77c\uac00\uc168\ub2e4\uba74, \uc81c\uac00 \uc791\uc131\ud55c \uae00\uc5d0\uc11c <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/create-continuous-deployment-pipeline-nodejs-jenkins\/\" target=\"_blank\" rel=\"noopener\">Node.js \ubc0f Jenkins\ub97c \uc0ac\uc6a9\ud55c \uc5f0\uc18d \ubc30\ud3ec \ud30c\uc774\ud504\ub77c\uc778<\/a>. \uc774\ubc88\uc5d0\ub294 \uac1c\ubc1c \uae30\uc220\uacfc CI\/CD \uc11c\ube44\uc2a4\ub85c \ubcc0\ud654\ub97c \uc2dc\ub3c4\ud569\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uacfc \uc0c1\ud638 \uc791\uc6a9\ud558\ub294 Golang \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc9c0\uc18d\uc801\uc73c\ub85c \ubc30\ud3ec\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/\" target=\"_blank\" rel=\"noopener\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4<\/a> \uc778\uae30 \uc788\ub294 <a href=\"https:\/\/travis-ci.org\" target=\"_blank\" rel=\"noopener\">\ud2b8\ub798\ube44\uc2a4 CI<\/a> \uc11c\ube44\uc2a4.<\/p>\n<p><!--more--><\/p>\n<p>\uc774 \ud29c\ud1a0\ub9ac\uc5bc\uc758 \ubaa9\ud45c\ub294 Couchbase\uc640 \ud1b5\uc2e0\ud558\ub294 Golang \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ub9cc\ub4dc\ub294 \ub370 \ub3c4\uc6c0\uc744 \uc8fc\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\ub294 Travis CI\uac00 \ud2b8\ub9ac\uac70\ub420 \ub54c \uc0ac\uc6a9\ub418\ub294 \uc801\uc808\ud55c \ub2e8\uc704 \ud14c\uc2a4\ud2b8\uac00 \uc788\uc2b5\ub2c8\ub2e4. Travis CI\uc5d0\uc11c \ud14c\uc2a4\ud2b8\uac00 \uc131\uacf5\ud558\uba74 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 SSH\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc6d0\uaca9 \uc11c\ubc84\uc5d0 \uc790\ub3d9\uc73c\ub85c \ubc30\ud3ec\ub429\ub2c8\ub2e4.<\/p>\n<p>\uc804\uc81c \uc870\uac74\uc73c\ub85c, \uc0ac\uc6a9 \uac00\ub2a5\ud55c Couchbase Server \uc778\uc2a4\ud134\uc2a4\uac00 \ud558\ub098 \uc774\uc0c1 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc774 Couchbase Server \uc778\uc2a4\ud134\uc2a4\ub294 \ubc30\ud3ec \uc911\uc5d0 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.<\/p>\n<h2>Go\uc640 Couchbase NoSQL\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\ud558\uae30<\/h2>\n<p>\uc774 \uc608\uc81c\ub97c \uc704\ud574 \uc0c8\ub85c\uc6b4 Golang \ud504\ub85c\uc81d\ud2b8\ub97c \ub9cc\ub4e4\uaca0\uc2b5\ub2c8\ub2e4. \ud504\ub85c\uc81d\ud2b8\uc758 \uc5b4\ub518\uac00\uc5d0\u00a0<strong>$GOPATH<\/strong> \ub77c\ub294 \ud30c\uc77c\uc744 \ub9cc\ub4ed\ub2c8\ub2e4.\u00a0<strong>main.go<\/strong> \ub97c \ud074\ub9ad\ud558\uace0 \ub2e4\uc74c\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4:<\/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>\uc704\uc758 \ucf54\ub4dc\ub294 \uac04\ub2e8\ud558\uc9c0\ub9cc \uc774 \ud29c\ud1a0\ub9ac\uc5bc\uc744 \uc9c4\ud589\ud558\uba74\uc11c \ud06c\uac8c \ubcc0\uacbd\ub420 \uac83\uc785\ub2c8\ub2e4. \uc9c0\uae08\uc740 \uc774 \ucf54\ub4dc\uac00 \uc5b4\ub5a4 \uae30\ub2a5\uc744 \ud558\ub294\uc9c0 \uc54c\uc544\ubd05\uc2dc\ub2e4.<\/p>\n<p>Couchbase\ub97c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 Go SDK\ub97c \uad6c\ud574\uc57c \ud569\ub2c8\ub2e4. \ub2e4\uc74c\uc744 \uc2e4\ud589\ud558\uc5ec \uc124\uce58\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">go get gopkg.in\/couchbase\/gocb.v1<\/pre>\n<p>Go SDK\ub97c \uc124\uce58\ud558\uba74 \ud504\ub85c\uc81d\ud2b8 \uac00\uc838\uc624\uae30\uc5d0 \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774 \ud504\ub85c\uc81d\ud2b8\uc5d0\ub294 \ub9e4\uc6b0 \uac04\ub2e8\ud55c \ub450 \uac00\uc9c0 \ud568\uc218\uac00 \uc788\uc2b5\ub2c8\ub2e4. \ubb38\uc11c\ub97c \uac80\uc0c9\ud558\ub294 \ud568\uc218\uc640 \ubb38\uc11c\ub97c \ub9cc\ub4dc\ub294 \ud568\uc218\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uac01 \ubb38\uc11c\uc5d0\ub294 <code>\uc0ac\ub78c<\/code> \ubaa8\ub378\uc5d0 \uc815\uc758\ub41c \ub300\ub85c <code>\uad6c\uc870\uccb4<\/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>\uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uc2dc\uc791\ub418\uba74 \ud658\uacbd \ubcc0\uc218\uc5d0 \uc9c0\uc815\ub41c \ub300\ub85c Couchbase \ud074\ub7ec\uc2a4\ud130\uc5d0 \uc5f0\uacb0\ub429\ub2c8\ub2e4. \ub9c8\ucc2c\uac00\uc9c0\ub85c RBAC \uacc4\uc815\uc774 \uc778\uc99d\ub418\uace0 \ubc84\ud0b7\uc774 \uc5f4\ub9bd\ub2c8\ub2e4.<\/p>\n<p>\ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc900\ube44\ub418\uba74 \uba3c\uc800 ID\ub97c \uae30\ubc18\uc73c\ub85c \ud55c \ubb38\uc11c\ub97c \uac00\uc838\uc635\ub2c8\ub2e4:<\/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>\ubb38\uc11c\uac00 \uc874\uc7ac\ud55c\ub2e4\uace0 \uac00\uc815\ud558\uba74 \ubb38\uc11c\uac00 \ubc18\ud658\ub429\ub2c8\ub2e4. \ubb38\uc11c\uac00 \uac80\uc0c9\ub41c \ud6c4\uc5d0\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc0c8 \ubb38\uc11c\ub97c \uc0bd\uc785\ud569\ub2c8\ub2e4.<\/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>\uc774\uc81c \uc65c \uc774\ub7f0 \ud568\uc218\ub97c \ub9cc\ub4dc\ub294\uc9c0 \uad81\uae08\ud558\uc2e4 \uac83\uc785\ub2c8\ub2e4. \uc800\ud76c\ub294 \uc2e4\uc81c SDK\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83 \uc678\uc5d0 \ud2b9\ubcc4\ud55c \uc791\uc5c5\uc744 \ud558\uace0 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub7ec\ud55c \ud568\uc218\uc5d0 \ub300\ud574 \uc0c1\uc0c1\ub825\uc744 \ubc1c\ud718\ud574 \ubcf4\uc138\uc694. \uc774 \ud568\uc218\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4\ub97c \uc791\uc131\ud560 \uac83\uc774\ubbc0\ub85c \ubcf5\uc7a1\ud55c \ud568\uc218\ub77c\uace0 \uac00\uc815\ud574 \ubcf4\uc138\uc694. \uc774 \uc608\uc81c\uc5d0\uc11c\ub294 \uc774\ud574\ud558\uae30 \uc27d\ub3c4\ub85d \ub2e8\uc21c\ud558\uac8c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>\ubaa8\uc758 \ub370\uc774\ud130\ub85c \ub2e8\uc704 \ud14c\uc2a4\ud2b8 \uc124\uacc4\ud558\uae30<\/h2>\n<p>\ud504\ub85c\uc81d\ud2b8\uc758 \uae30\ucd08\uac00 \ub9c8\ub828\ub418\uc5c8\uc73c\ubbc0\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4 \uc791\uc131\uc5d0 \ub300\ud574 \uc0dd\uac01\ud574 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud14c\uc2a4\ud2b8 \uc791\uc131\uc744 \uc2dc\uc791\ud558\uae30 \uc804\uc5d0, \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758\u00a0<strong>main.go<\/strong> \ud30c\uc77c\uc744 \uc0dd\uc131\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc5f4\uae30\u00a0<strong>main.go<\/strong> \ud30c\uc77c\uc744 \uc5f4\uace0 \ub2e4\uc74c\uc744 \ud3ec\ud568\ud558\uc138\uc694:<\/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>\uc704\uc758 \ucf54\ub4dc\uc5d0 \uc57d\uac04\uc758 \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc788\uc74c\uc744 \uc54c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc0c1\ud638 \uc791\uc6a9\ud558\ub294 \ud568\uc218\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud560 \ub54c \uc2e4\uc81c \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \ub300\uc0c1\uc73c\ub85c \ud14c\uc2a4\ud2b8\ud558\ub294 \uac83\uc740 \uc88b\uc740 \uc0dd\uac01\uc774 \uc544\ub2d0 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub300\uc2e0 \ubaa8\uc758 \ub370\uc774\ud130\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ub108\ubb34 \ub9ce\uc740 \ub2e8\uacc4\ub97c \uac70\uce58\uc9c0 \uc54a\uace0 \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\uace0 \uc2f6\uc744 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc27d\uac8c \ud14c\uc2a4\ud2b8\ud558\uae30 \uc704\ud574 Couchbase \ubc84\ud0b7\uc744 \ub098\ud0c0\ub0b4\ub294 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uba54\uc778 \ucf54\ub4dc\uc5d0\uc11c\ub294 \uc2e4\uc81c \ubc84\ud0b7\uc744 \uc0ac\uc6a9\ud558\uace0 \ud14c\uc2a4\ud2b8 \ucf54\ub4dc\uc5d0\uc11c\ub294 \ubaa8\uc758 \ubc84\ud0b7\uc744 \uc0ac\uc6a9\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/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>\uc774 \uc608\uc81c\uc5d0\uc11c\ub294 \ubc84\ud0b7\uc758 \uc778\ud130\ud398\uc774\uc2a4\uc5d0 \uac00\ub2a5\ud55c \ub9ce\uc740 SDK \uae30\ub2a5 \uc911 \ub450 \uac00\uc9c0 \uae30\ub2a5\ub9cc \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc778\ud130\ud398\uc774\uc2a4\ub294 \uc2e4\uc81c SDK\uc5d0\uc11c \ubcfc \uc218 \uc788\ub294 \uac83\uacfc \uc77c\uce58\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc6b0\ub9ac\uac00 \ub9cc\ub4e0 \ub450 \uac00\uc9c0 \uae30\ub2a5\uc740 \uc774\uc81c <code>\ub370\uc774\ud130\ubca0\uc774\uc2a4<\/code> \ud074\ub798\uc2a4.<\/p>\n<p>\ub9cc\ub4e4\uae30\u00a0<strong>main_test.go<\/strong> \ud30c\uc77c\uc744 \uc5f4\uace0 \ub2e4\uc74c \ucf54\ub4dc\uac00 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4:<\/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>\uc704\uc758 \ucf54\ub4dc\uac00 \ubc14\ub85c \uc6b0\ub9ac \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \ub9c8\ubc95\uc758 \ud798\uc744 \ubc1c\ud718\ud558\ub294 \ubd80\ubd84\uc785\ub2c8\ub2e4. \ubd80\ubaa8 \ud30c\uc77c\uc758 \ucf54\ub4dc\uc640 \uc0ac\uc6a9\uc790 \uc815\uc758 \ud14c\uc2a4\ud2b8 \ucf54\ub4dc\ub97c \ud63c\ud569\ud558\uc5ec \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc744 \uc608\ub85c \ub4e4\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">type MockBucket struct{}\r\n\r\nvar testdatabase Database<\/pre>\n<p>\ud14c\uc2a4\ud2b8\ud560 \ub54c\ub294 \uc2e4\uc81c Couchbase \ubc84\ud0b7\uc73c\ub85c \uc791\uc5c5\ud558\uc9c0 \uc54a\uc744 \uac83\uc774\ubbc0\ub85c \uc790\uccb4 \ub354\ubbf8\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud569\ub2c8\ub2e4. <code>\uad6c\uc870\uccb4<\/code>. \uc6b0\ub9ac\ub294 <code>\ub370\uc774\ud130\ubca0\uc774\uc2a4<\/code>\u00a0\ub370\uc774\ud130 \uad6c\uc870\ub97c \uc0ac\uc6a9\ud558\uba70, \uc0c1\uc704 \ud30c\uc77c\uc5d0\uc11c <code>\ubc84\ud0b7 \uc778\ud130\ud398\uc774\uc2a4<\/code>.<\/p>\n<p>\ud14c\uc2a4\ud2b8\uac00 \uc2dc\uc791\ub418\uba74 \ub354\ubbf8 \ubc84\ud0b7\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/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>\uc774\uc81c \ubaa8\uc758 \ubc84\ud0b7\uc5d0\ub294 \uc2e4\uc81c \ubc84\ud0b7\uacfc \uac19\uc740 \ud568\uc218\uac00 \uc5c6\uc73c\ubbc0\ub85c \uc778\ud130\ud398\uc774\uc2a4\uc5d0 \uc815\uc758\ub41c \ub300\ub85c \ud568\uc218\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud569\ub2c8\ub2e4. \ub2e4\uc2dc \ub9d0\ud574 <code>\uc0bd\uc785<\/code> \ubc0f <code>Get<\/code> \ud568\uc218\uc785\ub2c8\ub2e4.<\/p>\n<p>\ubd80\ud130 \uc2dc\uc791\ud558\uc5ec <code>\uc0bd\uc785<\/code> \ud568\uc218\uc785\ub2c8\ub2e4:<\/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>\ud14c\uc2a4\ud2b8\ub294 \uac04\ub2e8\ud569\ub2c8\ub2e4. \ud0a4\uac00 \ub2e4\uc74c\uacfc \uac19\uc740 \ubb38\uc11c\ub97c \uc81c\uc678\ud55c \ubaa8\ub4e0 \ubb38\uc11c\ub97c \uc0bd\uc785\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. <code>nraboy<\/code>. \ud0a4\uc5d0 \ub530\ub77c \ud14c\uc2a4\ud2b8\uac00 \uc131\uacf5\ud558\uac70\ub098 \uc2e4\ud328\ud569\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub9ac\uace0 <code>Get<\/code> \ud568\uc218\ub3c4 \ube44\uc2b7\ud55c \ubc29\uc2dd\uc73c\ub85c \uc791\ub3d9\ud569\ub2c8\ub2e4.<\/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>\ubb38\uc11c\ub97c \ubc1b\uc73c\ub824\uace0 \ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc740 \ud0a4\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. <code>nraboy<\/code>. \uc62c\ubc14\ub978 \ud0a4\uac00 \uc81c\uacf5\ub41c \uacbd\uc6b0, \ub9c8\uc0ec\ub9c1\ub41c \uc77c\ubd80 \ub370\uc774\ud130\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. <code>\ubcc0\ud658<\/code> \ud568\uc218\ub97c \ubc18\ud658\ud558\uace0, \uadf8\ub807\uc9c0 \uc54a\uc73c\uba74 \uc624\ub958\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc2dc \ub9d0\ud558\uc9c0\ub9cc, \uc774\uac83\uc740 \ubc84\ud0b7 \uc791\uc5c5\uc744 \uc704\ud574 Go SDK\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\ub294 \ubaa8\uc758 \ubc84\uc804\uc785\ub2c8\ub2e4. \uc778\ud130\ud398\uc774\uc2a4 \ud568\uc218\uac00 \uc0dd\uc131\ub418\uc5c8\uc73c\ubbc0\ub85c \ub450 \uac1c\uc758 \ud14c\uc2a4\ud2b8 \ud568\uc218\ub97c \uc791\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/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>\uadf8\ub9ac\uace0 <code>TestGetPersonDocument<\/code> \ub294 <code>\ud14c\uc2a4\ud2b8 \ub370\uc774\ud130\ubca0\uc774\uc2a4<\/code> \ubcc0\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubaa8\uc758 \ubc84\ud0b7\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc774 \ubc84\ud0b7\uc740 <code>GetPersonDocument<\/code> \uc5d0\uc11c\u00a0<strong>main.go<\/strong> \ud30c\uc77c\uc5d0 \uc800\uc7a5\ud569\ub2c8\ub2e4. \ubd80\ubaa8 \ud568\uc218\ub294 \ud6e8\uc52c \ub354 \ubcf5\uc7a1\ud560 \uc218 \uc788\uc9c0\ub9cc \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub294 \uc774\uc81c \ubaa8\uc758 \ud568\uc218\ub77c\ub294 \uc810\uc744 \uae30\uc5b5\ud558\uc138\uc694.<\/p>\n<p>\ud568\uc218 \uacb0\uacfc\uac00 \ub514\ucf54\ub529\ub418\uba74 <code>\uc0ac\ub78c<\/code> \ub370\uc774\ud130 \uad6c\uc870\ub97c \uc0ac\uc6a9\ud558\uc5ec <a href=\"https:\/\/github.com\/mitchellh\/mapstructure\" target=\"_blank\" rel=\"noopener\">\uc9c0\ub3c4 \uad6c\uc870<\/a> \ud328\ud0a4\uc9c0\ub97c \uc0ac\uc6a9\ud558\uc138\uc694. \ub9f5\uad6c\uc870 \ud328\ud0a4\uc9c0 \uc0ac\uc6a9\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2017\/04\/decode-map-values-native-golang-structures\/\" target=\"_blank\" rel=\"noopener\">\uc5ec\uae30<\/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>\uadf8\ub9ac\uace0 <code>TestCreatePersonDocument<\/code> \ud568\uc218\ub3c4 \ub3d9\uc77c\ud55c \uc804\ub7b5\uc744 \ub530\ub985\ub2c8\ub2e4. \uc6b0\ub9ac\ub294 \ubaa8\uc758 \ubc84\ud0b7\uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\uc9c0\ub9cc \uc2e4\uc81c <code>\uc0ac\ub78c \ubb38\uc11c \ub9cc\ub4e4\uae30<\/code> \ud568\uc218\uc785\ub2c8\ub2e4. \uae30\ub2a5 <code>\uc0bd\uc785<\/code> \ub294 \ud14c\uc2a4\ud2b8\uc5d0\uc11c \uc0dd\uc131\ud55c \ub0b4\uc6a9\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<p>\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0c1\ud638 \uc791\uc6a9\uc774 \ud3ec\ud568\ub41c Golang \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ud14c\uc2a4\ud2b8\ud558\ub294 \ub370\ub294 \uadf8\ub9ac \ub9ce\uc740 \uac83\uc774 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uac00\uc7a5 \uc88b\uc740 \ubc29\ubc95\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub9cc\ub4e4\uace0 \ud568\uc218\uc640 \ub370\uc774\ud130\uc758 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ubaa8\uc758 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<h2>\ud2b8\ub798\ube44\uc2a4 CI\ub97c \uc704\ud55c YAML \uad6c\uc131 \ub9cc\ub4e4\uae30<\/h2>\n<p>\uc774\uc81c \uba87 \uac00\uc9c0 \ub2e8\uc704 \ud14c\uc2a4\ud2b8\uac00 \ud3ec\ud568\ub41c Go \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc774\uc81c Travis CI\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc790\ub3d9\uc73c\ub85c \ud14c\uc2a4\ud2b8\ud558\uace0 \uc131\uacf5\ud558\uba74 \ubc30\ud3ec\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\ud2b8\ub798\ube44\uc2a4 CI\ub294 YAML \uad6c\uc131 \ud30c\uc77c\uc5d0\uc11c \uc791\ub3d9\ud569\ub2c8\ub2e4. \ub2e4\uc74c \uad6c\uc131\uc744 \uc608\ub85c \ub4e4\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4:<\/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>\uc704\uc758 \uad6c\uc131\uc5d0\uc11c\ub294 Go 1.8\uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc2a4\ud06c\ub9bd\ud2b8 \uc2e4\ud589\uc744 \uc2dc\uc791\ud558\uae30 \uc804\uc5d0 \ud544\uc694\ud55c \ud328\ud0a4\uc9c0\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud574\uc57c \ud569\ub2c8\ub2e4. \ud544\uc694\ud55c \ud328\ud0a4\uc9c0\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. <code>sshpass<\/code> \ub97c \uc0ac\uc6a9\ud558\uc5ec \uc77c\ubc18 \ud14d\uc2a4\ud2b8 \ube44\ubc00\ubc88\ud638\ub85c SSH\ub97c \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uacb0\uad6d\uc5d0\ub294 \ud0a4\ub97c \uc0ac\uc6a9\ud558\uace0 \uc2f6\uaca0\uc9c0\ub9cc \uc774 \uc608\uc81c\uc5d0\uc11c\ub294 \ud0a4\ub97c \uc0ac\uc6a9\ud574\ub3c4 \uad1c\ucc2e\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ud6c4 <code>sshpass<\/code> \uac00 \ub2e4\uc6b4\ub85c\ub4dc\ub418\uc5c8\uc73c\uba74 \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud574\uc57c \ud569\ub2c8\ub2e4. \uc774 \uc791\uc5c5\uc740 <code>\uc2a4\ud06c\ub9bd\ud2b8<\/code> \uc139\uc158\uc73c\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4. \uccab \ubc88\uc9f8 \uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc644\ub8cc\ub418\uba74 \ud504\ub85c\uc81d\ud2b8\ub97c \ube4c\ub4dc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub450 \uc2a4\ud06c\ub9bd\ud2b8\uac00 \ubaa8\ub450 \uc131\uacf5\uc801\uc73c\ub85c \uc644\ub8cc\ub418\uc5c8\ub2e4\uace0 \uac00\uc815\ud558\uba74 \uc774\uc81c \ubc30\ud3ec\uc5d0 \uc9d1\uc911\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/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>\ubc30\ud3ec\ub97c \uc704\ud574 \ub450 \uac1c\uc758 \ub2e4\ub978 \uba85\ub839\uc774 \uc2e4\ud589\ub429\ub2c8\ub2e4. \uccab \ubc88\uc9f8 \uba85\ub839\uc740 \ubc14\uc774\ub108\ub9ac\ub97c \uc6d0\uaca9 \uc11c\ubc84\ub85c \ubcf5\uc0ac\ud558\uace0 \ub450 \ubc88\uc9f8 \uba85\ub839\uc740 \uc6d0\uaca9 \uc11c\ubc84\uc5d0\uc11c \ud574\ub2f9 \ud30c\uc77c\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/p>\n<p>\ub450 \ubc30\ud3ec \uba85\ub839 \ubaa8\ub450 \ub098\uc911\uc5d0 \uc11c\ubc84\ub85c \uc804\ub2ec\ub418\ub294 CI\/CD \ud504\ub85c\uc138\uc2a4\uc758 \ud658\uacbd \ubcc0\uc218\ub97c \ucc38\uc870\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c \ud658\uacbd \ubcc0\uc218\ub97c \uc124\uc815\ud558\uc9c0 \uc54a\uc740 \uac83\uc744 \uc54c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ubcc0\uc218\ub294 \ubbfc\uac10\ud558\ubbc0\ub85c Git \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \ub0b4\uc5d0\uc11c \uc77c\ubc18 \ud14d\uc2a4\ud2b8\ub85c \uc124\uc815\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4. \ub300\uc2e0 \ud2b8\ub798\ube44\uc2a4 CI\uc5d0 \uc2dc\ud06c\ub9bf\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc6b4\ub85c\ub4dc <a href=\"https:\/\/docs.travis-ci.com\/user\/encryption-keys\/#Usage\" target=\"_blank\" rel=\"noopener\">travis<\/a> CLI \ub3c4\uad6c\ub97c \uc124\uce58\ud569\ub2c8\ub2e4. \ub3c4\uad6c\uac00 \uc124\uce58\ub41c \uc0c1\ud0dc\uc5d0\uc11c \ub2e4\uc74c\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4:<\/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>\ubaa8\ub4e0 \uc815\ubcf4\ub97c YAML \ud30c\uc77c\uc5d0 \uc77c\ubc18 \ud14d\uc2a4\ud2b8\ub85c \ucd94\uac00\ud558\ub294 \ub300\uc2e0 \uc554\ud638\ud654\ud558\uc5ec \ud2b8\ub798\ube44\uc2a4 CI\uac00 \uc774\ud574\ud560 \uc218 \uc788\ub3c4\ub85d \ud569\ub2c8\ub2e4. \ucd94\uac00\ub418\ub294 YAML \uad6c\uc131\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4:<\/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>\uc774 \ud0a4\ub294 Git \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc5d0 \ubcf4\uad00\ud558\uace0 \uc548\uc804\ud558\ub2e4\uace0 \ub290\ub084 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub354 \uc548\uc804\ud55c \ubc29\ubc95\uc740 SSH\uc5d0 \uacf5\uac1c \ud0a4\uc640 \uac1c\uc778 \ud0a4\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc774\uc9c0\ub9cc, \uc774 \uc608\uc81c\uc5d0\uc11c\ub294 \uc774 \ubc29\ubc95\ub3c4 \uad1c\ucc2e\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud504\ub85c\uc81d\ud2b8\ub97c \ud478\uc2dc\ud560 \ub54c \ud2b8\ub798\ube44\uc2a4 CI \uacc4\uc815\uc5d0 \ud504\ub85c\uc81d\ud2b8\ub97c \uc5f0\uacb0\ud588\ub2e4\uace0 \uac00\uc815\ud558\uba74 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uc790\ub3d9\uc73c\ub85c \ud14c\uc2a4\ud2b8 \ubc0f \ubc30\ud3ec\ub429\ub2c8\ub2e4.<\/p>\n<h2>\uc9c0\uc18d\uc801 \ubc30\ud3ec\ub97c \ud1b5\ud55c NoSQL\uc758 \uc911\uc694\uc131<\/h2>\n<p>\ubaa8\uc758 \ub370\uc774\ud130\ub97c \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub85c \uc0ac\uc6a9\ud558\ub294 \ud14c\uc2a4\ud2b8\ub97c \ub9cc\ub4dc\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubd24\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc815\ub9d0 \ud3b8\ub9ac\ud55c \uc810\uc740 \ub370\uc774\ud130\uac00 \ubcc0\uacbd\ub420 \ub54c \uc5c5\uadf8\ub808\uc774\ub4dc \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ub9cc\ub4e4 \ud544\uc694\uac00 \uc5c6\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \uad00\uacc4\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c\ub294 \ud14c\uc774\ube14\uc5d0 \ub300\ud55c \ubcc0\uacbd \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud569\ub2c8\ub2e4. Couchbase\uc5d0\uc11c\ub294 \ub370\uc774\ud130 \ubaa8\ub378\uc744 \ubcc0\uacbd\ud574\uc57c \ud558\ub294 \uacbd\uc6b0, \uadf8\ub0e5 <code>\uad6c\uc870\uccb4<\/code> \uc5d0 \ub300\ud55c <code>\uc0ac\ub78c<\/code> \ub97c \ucf54\ub4dc\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<h2>\uacb0\ub860<\/h2>\n<p>\ubc29\uae08 Travis CI\ub97c \uc0ac\uc6a9\ud558\uc5ec Golang \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c0\uc18d\uc801\uc73c\ub85c \ubc30\ud3ec\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcf4\uc168\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/\" target=\"_blank\" rel=\"noopener\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4<\/a> NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4. \uc9c0\uc18d\uc801 \ud1b5\ud569 \ub2e8\uacc4\uc5d0\uc11c\ub294 \ubaa8\uc758 \ub370\uc774\ud130\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ud14c\uc2a4\ud2b8\ud569\ub2c8\ub2e4. \ud14c\uc2a4\ud2b8\uac00 \ud1b5\uacfc\ub418\uace0 \ud504\ub85c\uc81d\ud2b8\uac00 \ube4c\ub4dc\ub418\uba74 \uc6d0\uaca9 \uc11c\ubc84\ub85c \ud478\uc2dc\ub418\uc5b4 \uc2e4\ud589\ub429\ub2c8\ub2e4.<\/p>\n<p>\uc774 \ud29c\ud1a0\ub9ac\uc5bc\uc5d0 \uc0ac\uc6a9\ub41c \uc608\uc81c\ub294 \ub2e4\uc74c\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/github.com\/couchbaselabs\/golang-ci-example\" target=\"_blank\" rel=\"noopener\">GitHub<\/a>. \ud504\ub85c\uc81d\ud2b8\uac00 \ud478\uc2dc\ub418\ub294 \uc6d0\uaca9 \uc11c\ubc84\uac00 \uc81c\uac70\ub418\uc5c8\ub2e4\ub294 \uc810\uc5d0 \uc720\uc758\ud558\uc138\uc694.<\/p>\n<p>Couchbase\ub97c \uc0ac\uc6a9\ud55c Go\uc5d0 \ub300\ud574 \ub354 \uc790\uc138\ud788 \uc54c\uc544\ubcf4\uc2dc\ub824\uba74 <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/developers\/\" target=\"_blank\" rel=\"noopener\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uac1c\ubc1c\uc790 \ud3ec\ud138<\/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>\n","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"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\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\/ko\/continuously-deploying-golang-application-using-travis-ci\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\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\/ko\/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\ubd84\" \/>\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\":\"ko-KR\",\"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\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/continuously-deploying-golang-application-using-travis-ci\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@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\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@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\":\"ko-KR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g8863514d8bed0cf6080f23db40e00354\",\"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\\\/ko\\\/author\\\/nic-raboy-2\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Travis CI\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc9c0\uc18d\uc801\uc73c\ub85c Golang \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc30\ud3ec\ud558\uae30","description":"NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc778 Couchbase\uc640 \uc0c1\ud638 \uc791\uc6a9\ud558\ub294 Go \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ub9cc\ub4dc\ub294 \ubc29\ubc95\uacfc \uc9c0\uc18d\uc801\uc778 \ud1b5\ud569 \ubc0f \ubc30\ud3ec\ub97c \uc704\ud574 Travis CI\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uc138\uc694.","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\/ko\/continuously-deploying-golang-application-using-travis-ci\/","og_locale":"ko_KR","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\/ko\/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\ubd84"},"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":"ko-KR","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":"Travis CI\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc9c0\uc18d\uc801\uc73c\ub85c Golang \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc30\ud3ec\ud558\uae30","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":"NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc778 Couchbase\uc640 \uc0c1\ud638 \uc791\uc6a9\ud558\ub294 Go \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ub9cc\ub4dc\ub294 \ubc29\ubc95\uacfc \uc9c0\uc18d\uc801\uc778 \ud1b5\ud569 \ubc0f \ubc30\ud3ec\ub97c \uc704\ud574 Travis CI\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uc138\uc694.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/continuously-deploying-golang-application-using-travis-ci\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@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":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","description":"NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4, Couchbase","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":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@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, \uac1c\ubc1c\uc790 \uc639\ud638\uc790, Couchbase","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g8863514d8bed0cf6080f23db40e00354","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":"\ub2c9 \ub77c\ubcf4\uc774\ub294 \ucd5c\uc2e0 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c \uae30\uc220\uc744 \uc639\ud638\ud558\ub294 \uc0ac\ub78c\uc785\ub2c8\ub2e4. \uadf8\ub294 Java, JavaScript, Golang \ubc0f Angular, NativeScript, Apache Cordova\uc640 \uac19\uc740 \ub2e4\uc591\ud55c \ud504\ub808\uc784\uc6cc\ud06c\uc5d0 \ub300\ud55c \uacbd\ud5d8\uc774 \uc788\uc2b5\ub2c8\ub2e4. Nic\uc740 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c\uc744 \ubcf4\ub2e4 \uc27d\uac8c \uc774\ud574\ud560 \uc218 \uc788\ub3c4\ub85d \uc790\uc2e0\uc758 \uac1c\ubc1c \uacbd\ud5d8\uc5d0 \ub300\ud574 \uae00\uc744 \uc4f0\uace0 \uc788\uc2b5\ub2c8\ub2e4.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/nic-raboy-2\/"}]}},"acf":[],"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","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/4615","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=4615"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/4615\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=4615"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=4615"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=4615"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=4615"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}