0

我正在尝试用我的詹金斯启动一个已经存在于谷歌云中的虚拟机,以将其用作奴隶。原因是如果我启动这个 VM 的模板,我需要做一些事情才能使用我的 Jenkins 代码。

有谁知道如何通过 Jenkins 启动我在 Google 的虚拟机池中已经存在的虚拟机?

4

1 回答 1

0

可能有两种方法可以解决此问题,具体取决于您之前需要在您的机器上运行的阻止您重新创建它的操作。

考虑到机器已经存在的限制,首先并且可能是最直接的方法是直接与 GCE API 对话,以便从 Jenkins列出和启动机器(使用构建步骤)。

基本上,您可以向 GCE API 发出请求以对您的实例进行操作。我建议gcloud在 Jenkins 主节点中执行此操作,因为它可以让您不必编写自己的客户端。这很简单,因为您只需将其“安装”在您的主服务器中,您就可以使用服务帐户使其安全工作。

下面是这种方法的概要:

  1. 按照这些发布说明下载cloud-sdk到您的主节点。

您可以在 Jenkins 之外或直接在构建步骤中执行此操作,只要 Jenkins 及其用户能够获取二进制文件就没有关系。

  1. 创建服务帐户生成身份验证密钥授予它与 GCE 交互的权限

使用服务帐户是一种可行的方法,因为您可以将其权限限制为与您相关的操作。

  1. 获得将绑定到 gcloud 客户端的服务帐户后,您需要在 Jenkins 中进行设置。您可能希望在构建步骤中执行此操作(我在这里使用 Groovy,但应该很容易将其转换为 UI):
stage('Start_machine'){
            steps{

                //Considering that you already installed gcloud in this node, but you can also curl it from here if that's convenient

                     // You can set this as an scope env var in Jenkins or just hard code it
                     gcloud config set project ${GOOGLE_PROJECT_ID};

                     // This needs a json file location accessible by jenkins like: --key-file /var/lib/jenkins/..key.json
                     gcloud auth activate-service-account --key-file ${GOOGLE_SERVICE_ACCOUNT_KEY};

                     // Check the reference on this command: https://cloud.google.com/sdk/gcloud/reference/compute/instances/start
                     gcloud compute instances start my_existing_instance;

                     echo "Instance started"
                }   
                post{
                   always{
                    println "Result : ${currentBuild.result}";



                }
            }

总结:您基本上创建了一个有权启动您的实例的服务帐户。下载可以与 GCE API ( gcloud) 交互的客户端,对其进行身份验证并启动实例,所有这些都在您的管道中进行。

如果对现有机器没有限制,第二种方法可能更容易。

Jenkins 有一个Compute Engine 插件,可以在需要时自动启动新的工作人员。

我知道在 Jenkins 向这些从机发送一些工作之前,你需要做一些之前的操作。但是,我想提请您注意,此插件还考虑启动脚本

因此,始终可以选择在机器起飞之前在此处预加载您的操作,等到它准备好时,您可能已经完成了所有工作。

希望这可以帮助。

于 2020-06-10T22:08:56.617 回答