{"id":2599,"date":"2024-01-13T13:38:47","date_gmt":"2024-01-13T04:38:47","guid":{"rendered":"https:\/\/manvscloud.com\/?p=2599"},"modified":"2024-01-13T13:40:25","modified_gmt":"2024-01-13T04:40:25","slug":"ncloud-sourcedeploy%eb%a1%9c-%eb%b0%b0%ed%8f%ac%ed%95%98%ea%b3%a0-%ec%84%b1%ea%b3%b5-%eb%b0%8f-%ec%8b%a4%ed%8c%a8-%ec%95%8c%eb%a6%bc%ec%9d%84-%eb%b0%9b%ec%95%84%eb%b3%b4%ec%9e%90","status":"publish","type":"post","link":"https:\/\/manvscloud.com\/?p=2599","title":{"rendered":"[NCLOUD] SourceDeploy\ub85c \ubc30\ud3ec\ud558\uace0 \uc131\uacf5 \ubc0f \uc2e4\ud328 \uc54c\ub9bc\uc744 \ubc1b\uc544\ubcf4\uc790"},"content":{"rendered":"\n<p>\uc548\ub155\ud558\uc138\uc694 MANVSCLOUD \uae40\uc218\ud604\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc\uc5d0\uc11c Developer Tools \uce74\ud14c\uace0\ub9ac\uc5d0 \uc788\ub294 \uc11c\ube44\uc2a4\ub4e4\uc744 \uc774\uc6a9\ud558\uc5ec CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc744 \ud6a8\uacfc\uc801\uc73c\ub85c \uad6c\ucd95\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788 Source Deploy \uc11c\ube44\uc2a4\ub294 \uc790\ub3d9\ud654 \ubc30\ud3ec \uacfc\uc815\uc5d0 \ud070 \ub3c4\uc6c0\uc774 \ub429\ub2c8\ub2e4. \uc624\ub298\uc740 Source Deploy\ub97c \uc0ac\uc6a9\ud560 \ub54c \ubc30\ud3ec\uac00 \uc131\uacf5\uc801\uc73c\ub85c \uc644\ub8cc\ub418\uc5c8\ub294\uc9c0 \ud639\uc740 \uc2e4\ud328\ud588\ub294\uc9c0\uc5d0 \ub300\ud55c \uc54c\ub9bc\uc744 \ubc1b\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading has-white-color has-vivid-green-cyan-background-color has-text-color has-background\"> Developer Tools, \ubc30\ud3ec \ud6c4 \uc131\uacf5\/\uc2e4\ud328 \uc54c\ub78c\uc774 \uac00\ub2a5\ud560\uae4c?<\/h3>\n\n\n\n<p>\uc774 \ud3ec\uc2a4\ud305\uc744 \uc791\uc131\ud558\uac8c \ub41c \uacc4\uae30\ub294 \ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc \uc720\uc800 \ucee4\ubba4\ub2c8\ud2f0 (NCUC)\uc5d0\uc11c \uc81c\uae30\ub41c \ud2b9\uc815 \uc694\uad6c\uc0ac\ud56d \ub54c\ubb38\uc785\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\ub4e4\uc774 \ubc30\ud3ec \ud6c4 \uc131\uacf5 \ub610\ub294 \uc2e4\ud328\uc5d0 \ub300\ud55c \uc54c\ub9bc \uae30\ub2a5\uc758 \ud544\uc694\uc131\uc744 \ud1a0\ub860\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/11143607\/kakao-sourcedeploy-509x1024.jpg\" alt=\"\" class=\"wp-image-2601\" width=\"306\" height=\"616\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/11143607\/kakao-sourcedeploy-509x1024.jpg 509w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/11143607\/kakao-sourcedeploy-149x300.jpg 149w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/11143607\/kakao-sourcedeploy-768x1544.jpg 768w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/11143607\/kakao-sourcedeploy-764x1536.jpg 764w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/11143607\/kakao-sourcedeploy-1019x2048.jpg 1019w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/11143607\/kakao-sourcedeploy-1080x2171.jpg 1080w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/11143607\/kakao-sourcedeploy.jpg 1170w\" sizes=\"(max-width: 306px) 100vw, 306px\" \/><\/figure><\/div>\n\n\n<p><br>\uc544\uc9c1 SourceDeploy \uc11c\ube44\uc2a4\ub294 \uc9c1\uc811\uc801\uc73c\ub85c \uc774\ub7ec\ud55c \uc54c\ub9bc \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uc9c0 \uc54a\uace0 \uc788\uc9c0\ub9cc \ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc\ub294 API\ub97c \ud1b5\ud574 \uc774\ub97c \uac00\ub2a5\ud558\uac8c \ud558\ub294 \ubc29\ubc95\uc774 \uc788\uae30\uc5d0 \uc774 \uae00\uc744 \ud1b5\ud574 \ubc30\ud3ec \uacb0\uacfc\uc5d0 \ub300\ud55c \uc54c\ub9bc\uc744 \ubc1b\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc124\uba85\ud574\ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading has-white-color has-vivid-green-cyan-background-color has-text-color has-background\"> SourceDeploy API + Cloud Functions + Slack<\/h3>\n\n\n\n<p>\ubc29\ubc95\uc740 \ub2e4\uc591\ud558\uac8c \uc0dd\uac01\ud560 \uc218 \uc788\uaca0\uc9c0\ub9cc \uc800\ub294 Cloud Functions\uc744 \uc774\uc6a9\ud558\uc5ec Slack\uc73c\ub85c \uc54c\ub9bc\uc744 \ubc1b\uc744 \uc218 \uc788\ub3c4\ub85d \uad6c\ucd95\ud574\ubcf4\uc558\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\ud504\ub85c\uc81d\ud2b8\ub294 \uc5ec\ub7ec \uac1c\uc77c \uc218 \uc788\uc73c\ub2c8 SourceDeploy \ud504\ub85c\uc81d\ud2b8 \ubaa9\ub85d\uc744 \uc870\ud68c\ud558\ub294 API\ub85c \ubaa8\ub4e0 \ud504\ub85c\uc81d\ud2b8\uc758 ID\ub97c \uac00\uc838\uc624\uace0 \ubaa8\ub4e0 \ud504\ub85c\uc81d\ud2b8ID\uc5d0 \ub300\ud55c \ubc30\ud3ec \uc774\ub825 \ubaa9\ub85d\uc744 \uc870\ud68c\ud558\uc5ec \ucd5c\uadfc 5\ubd84 \uc774\ub0b4\uc5d0 \uc2e4\ud589\ub41c \ubc30\ud3ec\uc5d0 \ub300\ud55c \uacb0\uacfc \uac12\uc744 \uac00\uc838\uc624\ub294 \ucf54\ub4dc\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<ul>\n<li><strong>Cloud Functions Action \uc18c\uc2a4\ucf54\ub4dc (\ub7f0\ud0c0\uc784 : Python 3.11)<\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import requests\nimport time\nimport hashlib\nimport hmac\nimport base64\nimport json\nfrom datetime import datetime, timedelta\n\ndef generate_signature(secret_key, method, uri, timestamp, access_key):\n    message = method + \" \" + uri + \"\\n\" + timestamp + \"\\n\" + access_key\n    message = bytes(message, 'UTF-8')\n    return base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())\n\ndef get_projects(api_server, uri, http_header):\n    response = requests.get(api_server + uri, headers=http_header)\n    return response.json()\n\ndef get_project_history(api_server, uri, http_header):\n    response = requests.get(api_server + uri, headers=http_header)\n    return response.json()\n\ndef send_to_slack(webhook_url, message):\n    payload = {'text': message}\n    requests.post(webhook_url, json=payload)\n\ndef format_message(project, history):\n    timestamp = datetime.fromtimestamp(history['startTime'] \/ 1000)\n    formatted_time = timestamp.strftime(\"%Y-%m-%d %H:%M (UTC%z)\")\n    return (f\"\ud504\ub85c\uc81d\ud2b8 \uc774\ub984 : {project['name']}\\n\"\n            f\"\uc2dc\ub098\ub9ac\uc624 \uc774\ub984 : {history['scenario']['name']}\\n\"\n            f\"\uc2a4\ud14c\uc774\uc9c0 : {history['stage']['name']}\\n\"\n            f\"\ucd5c\uc885 \uc2e4\ud589\uc2dc\uac04 : {formatted_time}\\n\"\n            f\"\uc0c1\ud0dc : {history['status']}\")\n\ndef main(args):\n    try:\n        timestamp = str(int(time.time() * 1000))\n\n        access_key = args[\"access_key\"]\n        secret_key = bytes(args[\"secret_key\"], 'UTF-8')\n        slack_webhook_url = args[\"slack_webhook_url\"]\n\n        method = \"GET\"\n        api_server = \"https:\/\/vpcsourcedeploy.apigw.ntruss.com\"\n        project_uri = \"\/api\/v1\/project\"\n\n        signingKey = generate_signature(secret_key, method, project_uri, timestamp, access_key)\n\n        http_header = {\n            'x-ncp-apigw-signature-v2': signingKey,\n            'x-ncp-apigw-timestamp': timestamp,\n            'x-ncp-iam-access-key': access_key\n        }\n\n        projects = get_projects(api_server, project_uri, http_header)\n        messages = []\n\n        for project in projects['result']['projectList']:\n            project_id = project['id']\n            history_uri = f\"\/api\/v1\/project\/{project_id}\/history\"\n\n            signingKey = generate_signature(secret_key, method, history_uri, timestamp, access_key)\n            http_header['x-ncp-apigw-signature-v2'] = signingKey\n\n            history_data = get_project_history(api_server, history_uri, http_header)\n            current_time = datetime.now()\n\n            for history in history_data['result']['historyList']:\n                history_time = datetime.fromtimestamp(history['startTime'] \/ 1000)\n                if current_time - history_time &lt; timedelta(minutes=5):\n                    slack_message = format_message(project, history)\n                    send_to_slack(slack_webhook_url, slack_message)\n                    messages.append(slack_message)\n\n        return {\"status\": \"success\", \"messages\": messages}\n\n    except Exception as e:\n        return {\"status\": \"error\", \"error\": str(e)}\n<\/pre>\n\n\n\n<ul>\n<li><strong>\ub514\ud3f4\ud2b8 \ud30c\ub77c\ubbf8\ud130<\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\"access_key\":\"[ACCESS_KEY]\",\"secret_key\":\"[SECRET_KEY]\",\"slack_webhook_url\":\"[WEBHOOK_URL]\"}<\/pre>\n\n\n\n<ul>\n<li><strong>ACCESS_KEY<\/strong>&nbsp;: SourceDeploy\uc758 \ubc30\ud3ec \uc774\ub825 \ubaa9\ub85d \uc870\ud68c \uad8c\ud55c\uc774 \uc788\ub294 Sub Account\uc758 Access Key<\/li>\n\n\n\n<li><strong>SECRET_KEY<\/strong>&nbsp;: SourceDeploy\uc758 \ubc30\ud3ec \uc774\ub825 \ubaa9\ub85d \uc870\ud68c \uad8c\ud55c\uc774 \uc788\ub294 Sub Account\uc758 Secret Key<\/li>\n\n\n\n<li><strong>WEBHOOK_URL<\/strong>&nbsp;: Slack Webhook URL<\/li>\n<\/ul>\n\n\n\n<p>format_message \ud568\uc218\uc5d0\uc11c Slack\uc5d0 \uc804\ub2ec\ud560 \ud3fc\uc744 \ubcc0\uacbd\ud560 \uc218 \uc788\uc73c\uba70 \ucd5c\uadfc 5\ubd84 \ub0b4\uc5d0 \uc2e4\ud589\ub41c \ubc30\ud3ec\uac00 \uc544\ub2c8\ub77c \uc6d0\ud558\ub294 \uc2dc\uac04\ub300\ub85c \ubcc0\uacbd\ud558\uace0 \uc2f6\ub2e4\uba74 minutes=5 \ubd80\ubd84\uc744 \ucf54\ub4dc\uc5d0\uc11c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"214\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/13131244\/image-1024x214.png\" alt=\"\" class=\"wp-image-2604\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/13131244\/image-1024x214.png 1024w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/13131244\/image-300x63.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/13131244\/image-768x161.png 768w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/13131244\/image-1536x321.png 1536w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/13131244\/image-1080x226.png 1080w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/13131244\/image.png 1634w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Cloud Functions \uc0dd\uc131 \ud6c4 \ubc30\ud3ec\ub97c \uc77c\ubd80\ub7ec \uc2e4\ud328\ud560 \uc218 \uc788\ub3c4\ub85d \uad6c\uc131\ud55c \ub4a4 \ubc30\ud3ec\ub97c \uc9c4\ud589\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"885\" height=\"368\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/13131313\/deploy-alarm.png\" alt=\"\" class=\"wp-image-2605\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/13131313\/deploy-alarm.png 885w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/13131313\/deploy-alarm-300x125.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/13131313\/deploy-alarm-768x319.png 768w\" sizes=\"(max-width: 885px) 100vw, 885px\" \/><\/figure>\n\n\n\n<p>\ubc30\ud3ec\uac00 \ub05d\ub098\uace0 Cloud Functions\uc744 \uc2e4\ud589\ud574\ubcf4\uba74 \uc704\uc640 \uac19\uc774 \uc5b4\ub5a4 \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uc5b4\ub5a4 \uc2dc\ub098\ub9ac\uc624\uc758 \uc774\ub984\uc73c\ub85c \uc5b8\uc81c \uc2e4\ud328\ud588\uace0 \uc131\uacf5\ud588\ub294\uc9c0 \uc54c\ub9bc\uc744 \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc6b0\ub9ac\ub294 \ubc30\ud3ec \ub54c\ub9c8\ub2e4 Cloud Functions\uc744 \uc218\ub3d9\uc73c\ub85c \uc2e4\ud589\ud574\uc904 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<br>\ub530\ub77c\uc11c Cloud Functions \uc2e4\ud589\uc744 \uc790\ub3d9\ud654\ud558\uae30 \uc704\ud574 Trigger\ub97c \ucd94\uac00\ud574\uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"948\" height=\"333\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/13131652\/image-1.png\" alt=\"\" class=\"wp-image-2606\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/13131652\/image-1.png 948w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/13131652\/image-1-300x105.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2024\/01\/13131652\/image-1-768x270.png 768w\" sizes=\"(max-width: 948px) 100vw, 948px\" \/><\/figure>\n\n\n\n<p>\uc5ec\ub7ec\uac00\uc9c0 Trigger \uc885\ub958\ub97c \uc81c\uacf5\ud558\uace0 \uc788\uae30\uc5d0 \ubc29\ubc95\uc740 \ub2e4\uc591\ud560 \uac83\uc785\ub2c8\ub2e4.<br>cron\uc744 \uc774\uc6a9\ud558\uc5ec \uc8fc\uae30\uc801\uc73c\ub85c \ubc30\ud3ec \uc5ec\ubd80\ub97c \uccb4\ud06c\ud560 \uc218\ub3c4 \uc788\uc744 \uac83\uc774\uace0 \uc800\ub294 Cloud Insight\ub97c \uc88b\uc544\ud558\ub2c8 Cloud Insight API \uc911 SendData\ub85c \ubc30\ud3ec \uc774\ub825\uc744 \uc218\uc9d1\ud558\uace0 \ubc30\ud3ec \uc774\ub825\uc774 \ubc1c\uc0dd\ud588\uc744 \ub54c \ubaa8\ub2c8\ud130\ub9c1 \uc54c\ub9bc\uacfc \ud568\uaed8 Slack\uc73c\ub85c \ub0b4\uc6a9\uc744 \ubcf4\ub3c4\ub85d \ud574\ubcfc \uac83\uac19\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading has-white-color has-cyan-bluish-gray-background-color has-text-color has-background\"> Personal Comments<\/h3>\n\n\n\n<p>\ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc\uc5d0\uc11c\ub294 \ub2e4\uc591\ud55c \uc11c\ube44\uc2a4\ub4e4\uc744 \uc81c\uacf5\ud558\uace0 \uc788\uc9c0\ub9cc \uac00\ub054 \uc6d0\ud558\ub294 \uae30\ub2a5\uc774 \uc5c6\uc744 \ub54c\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc774 \uacbd\uc6b0 \ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 API\ub97c \uc774\uc6a9\ud558\uc5ec \ud544\uc694\ud55c \uae30\ub2a5\uc744 \ub9cc\ub4e4\uc5b4\uc11c \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uae34 \uae00 \uc77d\uc5b4\uc8fc\uc154\uc11c \uac10\uc0ac\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"137\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/08\/10202040\/ncloud-master.png\" alt=\"\" class=\"wp-image-1221\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/08\/10202040\/ncloud-master.png 800w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/08\/10202040\/ncloud-master-300x51.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/08\/10202040\/ncloud-master-768x132.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\uc548\ub155\ud558\uc138\uc694 MANVSCLOUD \uae40\uc218\ud604\uc785\ub2c8\ub2e4. \ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc\uc5d0\uc11c Developer Tools \uce74\ud14c\uace0\ub9ac\uc5d0 \uc788\ub294 \uc11c\ube44\uc2a4\ub4e4\uc744 \uc774\uc6a9\ud558\uc5ec CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc744 \ud6a8\uacfc\uc801\uc73c\ub85c \uad6c\ucd95\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788 Source Deploy \uc11c\ube44\uc2a4\ub294 \uc790\ub3d9\ud654 \ubc30\ud3ec \uacfc\uc815\uc5d0 \ud070 \ub3c4\uc6c0\uc774 \ub429\ub2c8\ub2e4. \uc624\ub298\uc740 Source Deploy\ub97c \uc0ac\uc6a9\ud560 \ub54c \ubc30\ud3ec\uac00 \uc131\uacf5\uc801\uc73c\ub85c \uc644\ub8cc\ub418\uc5c8\ub294\uc9c0 \ud639\uc740 \uc2e4\ud328\ud588\ub294\uc9c0\uc5d0 \ub300\ud55c \uc54c\ub9bc\uc744 \ubc1b\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. Developer Tools, \ubc30\ud3ec \ud6c4 \uc131\uacf5\/\uc2e4\ud328 \uc54c\ub78c\uc774 \uac00\ub2a5\ud560\uae4c? \uc774 \ud3ec\uc2a4\ud305\uc744 \uc791\uc131\ud558\uac8c \ub41c \uacc4\uae30\ub294 \ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc \uc720\uc800 \ucee4\ubba4\ub2c8\ud2f0 (NCUC)\uc5d0\uc11c \uc81c\uae30\ub41c \ud2b9\uc815 \uc694\uad6c\uc0ac\ud56d \ub54c\ubb38\uc785\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\ub4e4\uc774 \ubc30\ud3ec \ud6c4 \uc131\uacf5 \ub610\ub294 \uc2e4\ud328\uc5d0 \ub300\ud55c \uc54c\ub9bc \uae30\ub2a5\uc758 \ud544\uc694\uc131\uc744 \ud1a0\ub860\ud558\uc600\uc2b5\ub2c8\ub2e4. \uc544\uc9c1 SourceDeploy \uc11c\ube44\uc2a4\ub294 \uc9c1\uc811\uc801\uc73c\ub85c \uc774\ub7ec\ud55c \uc54c\ub9bc \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uc9c0 \uc54a\uace0 \uc788\uc9c0\ub9cc \ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc\ub294 API\ub97c \ud1b5\ud574 \uc774\ub97c \uac00\ub2a5\ud558\uac8c \ud558\ub294 \ubc29\ubc95\uc774 \uc788\uae30\uc5d0 \uc774 \uae00\uc744 \ud1b5\ud574 \ubc30\ud3ec \uacb0\uacfc\uc5d0 \ub300\ud55c \uc54c\ub9bc\uc744 \ubc1b\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc124\uba85\ud574\ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4. SourceDeploy API + Cloud Functions + Slack \ubc29\ubc95\uc740 \ub2e4\uc591\ud558\uac8c \uc0dd\uac01\ud560 \uc218 \uc788\uaca0\uc9c0\ub9cc \uc800\ub294 Cloud Functions\uc744 \uc774\uc6a9\ud558\uc5ec Slack\uc73c\ub85c \uc54c\ub9bc\uc744 \ubc1b\uc744 \uc218 \uc788\ub3c4\ub85d \uad6c\ucd95\ud574\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \ud504\ub85c\uc81d\ud2b8\ub294 \uc5ec\ub7ec \uac1c\uc77c \uc218 \uc788\uc73c\ub2c8 SourceDeploy \ud504\ub85c\uc81d\ud2b8 \ubaa9\ub85d\uc744 \uc870\ud68c\ud558\ub294 API\ub85c \ubaa8\ub4e0 \ud504\ub85c\uc81d\ud2b8\uc758 ID\ub97c \uac00\uc838\uc624\uace0 \ubaa8\ub4e0 \ud504\ub85c\uc81d\ud2b8ID\uc5d0 \ub300\ud55c \ubc30\ud3ec \uc774\ub825 \ubaa9\ub85d\uc744 \uc870\ud68c\ud558\uc5ec \ucd5c\uadfc 5\ubd84 \uc774\ub0b4\uc5d0 \uc2e4\ud589\ub41c \ubc30\ud3ec\uc5d0 \ub300\ud55c \uacb0\uacfc \uac12\uc744 \uac00\uc838\uc624\ub294 \ucf54\ub4dc\uc785\ub2c8\ub2e4. format_message \ud568\uc218\uc5d0\uc11c Slack\uc5d0 \uc804\ub2ec\ud560 \ud3fc\uc744 \ubcc0\uacbd\ud560 \uc218 \uc788\uc73c\uba70 \ucd5c\uadfc 5\ubd84 \ub0b4\uc5d0 \uc2e4\ud589\ub41c \ubc30\ud3ec\uac00 \uc544\ub2c8\ub77c \uc6d0\ud558\ub294 \uc2dc\uac04\ub300\ub85c \ubcc0\uacbd\ud558\uace0 \uc2f6\ub2e4\uba74 minutes=5 \ubd80\ubd84\uc744 \ucf54\ub4dc\uc5d0\uc11c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Cloud Functions \uc0dd\uc131 \ud6c4 \ubc30\ud3ec\ub97c \uc77c\ubd80\ub7ec \uc2e4\ud328\ud560 \uc218 \uc788\ub3c4\ub85d \uad6c\uc131\ud55c \ub4a4 \ubc30\ud3ec\ub97c \uc9c4\ud589\ud558\uc600\uc2b5\ub2c8\ub2e4. \ubc30\ud3ec\uac00 \ub05d\ub098\uace0 Cloud [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"\ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc\uc5d0\uc11c Developer Tools \uce74\ud14c\uace0\ub9ac\uc5d0 \uc788\ub294 \uc11c\ube44\uc2a4\ub4e4\uc744 \uc774\uc6a9\ud558\uc5ec CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc744 \ud6a8\uacfc\uc801\uc73c\ub85c \uad6c\ucd95\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788 Source Deploy \uc11c\ube44\uc2a4\ub294 \uc790\ub3d9\ud654 \ubc30\ud3ec \uacfc\uc815\uc5d0 \ud070 \ub3c4\uc6c0\uc774 \ub429\ub2c8\ub2e4. \uc624\ub298\uc740 Source Deploy\ub97c \uc0ac\uc6a9\ud560 \ub54c \ubc30\ud3ec\uac00 \uc131\uacf5\uc801\uc73c\ub85c \uc644\ub8cc\ub418\uc5c8\ub294\uc9c0 \ud639\uc740 \uc2e4\ud328\ud588\ub294\uc9c0\uc5d0 \ub300\ud55c \uc54c\ub9bc\uc744 \ubc1b\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.","jetpack_seo_html_title":"[NCLOUD] SourceDeploy\ub85c \ubc30\ud3ec\ud558\uace0 \uc131\uacf5 \ubc0f \uc2e4\ud328 \uc54c\ub9bc\uc744 \ubc1b\uc544\ubcf4\uc790","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3],"tags":[249,457,934,32,87,91,17,90,16,805,654,933,89,202,398],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/posts\/2599"}],"collection":[{"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manvscloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2599"}],"version-history":[{"count":5,"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/posts\/2599\/revisions"}],"predecessor-version":[{"id":2609,"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/posts\/2599\/revisions\/2609"}],"wp:attachment":[{"href":"https:\/\/manvscloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2599"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manvscloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2599"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manvscloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}