腾讯亿级用户规模自研业务的上云实践解读,立即报名 了解详情
写点什么

如何使用 GitHub Actions 部署虚拟机

  • 2020-03-30
  • 本文字数:3446 字

    阅读完需:约 11 分钟

如何使用GitHub Actions部署虚拟机

在部署服务器时,人们要么将其从安装包中解压,要么使用 GUI 进行操作,你也是其中的一员吗?我在事业起步时就是这么操作的。但是,在过去的几年当中,我逐渐适应了通过代码来部署服务器及其相关资源。通过使用 PowerShell 或者 Azure CLI,或者两者结合。


我自学了一系列工具,如 Visual Studio Code, Git, GitHub 甚至是 Azure DevOps 来完成任务。一路走来并不容易,但却有趣而充满挑战。


2019 年末,GitHub 发布了GitHub Actions,GitHub Actions 可以自动从 GitHub 代码库中部署代码。当我的同事和朋友们开始深入了解并演示这项服务时,我就一直饶有兴趣,并决定自己上手,看看能给 IT 专家社区带来些什么,我始终坚定地相信,这些工具可以给 IT 专家们带来很好的机遇。


GitHub Actions 术语

在我详细讲解之前,需要提一提 GitHub Actions 的相关术语。


  • Action – 定义我们能做何种操作,我们可以从市场中免费获得,或自己创建。

  • Workflow – 工作流,事件发生时所完成的一系列环境变量、任务以及步骤。

  • Jobs – 任务,工作流所要执行的任务。

  • Steps - 步骤,任务使用一项 Action 所接收的步骤。

  • Event – 事件,发生时可以触发工作流的事件,例如向一个代码库提交代码时,会触发一个 Issue 或 PR。


你想构建什么?

简单点说,我想用 GitHub Action 在 Azure 中创建虚拟机(VM)。再明确一点说,我想让它在同一资源群组下,构建虚拟机及其相关的支持性技术(存储磁盘,网络接口,虚拟网络,存储账户等)。这不是最佳的实践范式,但却是一个对新手十分友好的例子,且有详细的文档记录。


只需要使用四段 Azure CLI 代码,就能在 Azure 中创建 VM。第一段代码使用 Azure Service Principal 登录我的 Azure 订阅并执行创建 VM 的必需步骤。


#region Login# This logs into Azure with a Service Principal Account#Write-Output "Logging in to Azure with a service principal..."az login `    --service-principal `    --username $servicePrincipal `    --password $servicePrincipalSecret `    --tenant $servicePrincipalTenantIdWrite-Output "Done"Write-Output ""#endregion
复制代码


下一段代码将选择正确的订阅,确保我的资源分配至正确的位置:


#region Subscription#This sets the subscription the resources will be created inWrite-Output "Setting default azure subscription..."az account set `    --subscription $azureSubscriptionNameWrite-Output "Done"Write-Output ""#endregion
复制代码


第三段代码将为虚拟机构建赖以生存的资源组:


#region Create Resource Group# This creates the resource group used to house the VMWrite-Output "Creating resource group $resourceGroupName in region $resourceGroupNameRegion..."az group create `    --name $resourceGroupName `    --location $resourceGroupNameRegion    Write-Output "Done creating resource group"    Write-Output ""#endregion
复制代码


第四段代码将在资源组里创建 VM:


#region Create VM# Create a VM in the resource groupWrite-Output "Creating VM..."try {    az vm create  `        --resource-group $resourceGroupName `        --name $serverName `        --image win2016datacenter `        --admin-username $adminLogin `        --admin-password $adminPassword    }catch {    Write-Output "VM already exists"    }Write-Output "Done creating VM"Write-Output ""#endregion
复制代码


这些代码并不复杂, 在很多文档和教程里你都会看到这个著名的示例。在我的脚本中,我使用了多种参数,从而确保信息能被安全的存储或者导入至我的工作流文件中。完整的 PowerShell 脚本 请点击此处


我该如何创建 Action?

为了启动 VM 构建,我们创建一个 YAML 格式的工作流文件。工作流文件的名字可以是任意合法命名,它以.yml.yaml结尾作为扩展名。还需要存储在 GitHub 库的特定目录中,即.github/workflows


您的工作流文件分为几个部分,让我们分别查看每个部分:


元数据

我们从命名工作流开始:


name: GitHub for IT Pro CI/CD Pipeline
复制代码


环境变量

Env:
OUTPUT_PATH: $
复制代码


触发器

然后,我们指示如何触发该动作 ; 我已将我的操作设置为在将任何内容推送到仓库时开始:


on: [push]
复制代码


任务

现在,我们开始声明工作流将要执行的任务,我们首先必须声明工作流将在哪个平台上运行(Linux,MacOS 或 Windows)。


jobs:
# Deploy VM in Azure
DeployVM:
runs-on: windows-latest
复制代码


步骤

现在,我们可以从工作流中的步骤开始。 我已指示我的工作流第一步是签出。 这将从我的仓库中获取文件/代码,并将其放入 $ github.workspace 以便我的工作流访问它。


steps:
# checkout code from repo
- name: checkout repo
uses: actions/checkout
复制代码


下一步是告诉工作流查找有助于构建 VM 的 PowerShell 脚本:


    - name: look for ps1 file
run: |
ls '$\IaC\AzCLI'
复制代码


我们工作流的最后一步是部署和配置 VM:


 - name: provision virtual machine in azure
env:
RESOURCE_GROUP: rg-githubitpro
RESOURCE_GROUP_REGION: southcentralus
SERVER_NAME: gihtubactions
ADMIN_LOGIN: sarah
run: >
powershell -command "& '$\IaC\AzCLI\vmcreation.ps1'"
-servicePrincipal $
-servicePrincipalSecret $
-servicePrincipalTenantId $
-azureSubscriptionName $
-resourceGroupName %RESOURCE_GROUP%
-resourceGroupNameRegion %RESOURCE_GROUP_REGION%
-serverName %SERVER_NAME%
-adminLogin %ADMIN_LOGIN%
-adminPassword $
复制代码


该步骤有很多内容,所以现在让我们进一步分解一下我们正在做的事情:


    - name: provision virtual machine in azure
env:
RESOURCE_GROUP: rg-githubitpro
RESOURCE_GROUP_REGION: southcentralus
SERVER_NAME: gihtubactions
ADMIN_LOGIN: sarah
复制代码


第一部分声明了一些环境变量,在这里我设置了 Azure 资源组名称,我要部署资源组的区域,虚拟机(服务器)的名称以及将要使用的管理员登录帐户名称。


该步骤的第二步是告诉工作流调用我的 PowerShell 脚本,并从工作流和GitHub 密钥存储传入下面的变量。为了允许 GitHub Actions 在我的 Azure 订阅中部署资源,我创建了一个 Azure 服务主体。 如果您从未接触过,那么我之前在另一篇文章中介绍了如何创建和使用它们。


run: >
powershell -command "& '$\IaC\AzCLI\vmcreation.ps1'"
-servicePrincipal $
-servicePrincipalSecret $
-servicePrincipalTenantId $
-azureSubscriptionName $
-resourceGroupName %RESOURCE_GROUP%
-resourceGroupNameRegion %RESOURCE_GROUP_REGION%
-serverName %SERVER_NAME%
-adminLogin %ADMIN_LOGIN%
-adminPassword $
复制代码


此工作流的完整文件可以在这里找到。


监控 GitHub Action 的运行状态

Action 在运行时,你可以监视其进度。当你导航到 GitHub 仓库时,你将看到一个名为 Actions 的选项卡,单击该选项卡将带你进入 Workflow 部分。 你可以创建新的工作流,编辑工作流并监控工作流的运行进度。



GitHub Actions 标签页



监控 GitHub Actions


工作流完成后,你可以检查 Azure 订阅,就能看到创建的资源了:



Azure 资源


注意事项

这里的示例是一个非常基本的工作流,而正在部署的资源也是一个非常基本的资源,但是对我来说,这是学习 GitHub Actions 的一个很好的起点。我已经看到我的同事将其用于更复杂的部署和工作流,例如 Aaron Powell 正在使用它来部署他的博客


我为测试此部署而创建的代码库是公开的,工作流的输出可供已登录或未登录到 GitHub 的任何人查看,它包含某些可能被视为敏感的信息,比如我的 Azure 订阅 ID,更重要的是虚拟机的 IP 地址,给了恶意的人一个容易攻击的机会。因此,如果你正在测试 GitHub Action,请注意这一点,并警惕你在 Azure 中部署的内容以及它的安全性。


我录制了一段视频,记录了代码的过程和每一步,可以在此处找到此视频:https://youtu.be/0kDr9OlAzlM


我很想听听其他 IT 专业人士是如何使用 GitHub Action 来部署基础设施的,所以请联系并分享您的故事!


原文链接https://techcommunity.microsoft.com/t5/itops-talk-blog/how-to-use-github-actions-to-deploy-an-azure-virtual-machine/ba-p/1092015


2020-03-30 19:14664

评论

发布
暂无评论
发现更多内容

易观分析:银行零售业务实现智能化营销还需突破七大关键点

易观分析

零售 银行 智能化营销

【设计模式-前端】单例模式深刻理解和实现

归子莫

前端 设计模式 js 8月月更

开源一夏 |卷王必备学习的MyBatis-Plus用法~

叶秋学长

开源 mybaits 8月月更

兴盛优选:时序数据如何高效处理?

TDengine

数据库 tdengine 时序数据库

直播预告 | Authing 如何打造云原生 SaaS 产品架构?

Authing 身份云

Netty进阶 -- WebSocket长连接开发

Bug终结者

8月月更

7月月更开奖啦!快来看看你中奖了吗?

InfoQ写作社区官方

热门活动 7月月更

面试官:Redis Zset的实现为什么用跳表,而不用平衡树?

程序员小毕

Java redis 程序员 面试 后端

Go-Excelize API源码阅读(七)—— CopySheet(from, to int)

Regan Yue

开源 源码阅读 8月日更 8月月更

如何设计一组会出现死锁(Deadlock)的ABAP程序

Jerry Wang

操作系统 SAP abap 8月月更 ABAP死锁

TiSpark 原理之下推丨TiDB 工具分享

PingCAP

TiDB

MySQL之JDBC编程增删改查

了不起的程序猿

Java MySQL JAVA开发 java程序员

知乎杀疯了,疯传2022Java面试八股文解析+大厂面经

程序知音

Java 程序员 java面试 后端技术 Java面试八股文

分布式时间槽elastic timeslot架构设计

中间件XL

zookeeper 分布式任务调度 Elastic-job

AS北京站如约而至!发布参会感想有机会获得官方周边奖励

InfoQ写作社区官方

热门活动 ArchSummit

从滴滴被罚款事件思考企业数据治理问题

墨天轮

大数据 滴滴 数据治理 数据安全

python工程化配置方式

芥末拌个饭吧

8月月更

使用脚手架 快速开发 React组件 npm包 (基于TSDX)

HullQin

CSS JavaScript html 前端 8月月更

基于 TLS 1.3的百度安全通信协议 bdtls 介绍

百度Geek说

安全

如何使用GitHub Actions部署虚拟机_文化 & 方法_Azure 中文精选_InfoQ精选文章