Ejemplo n.º 1
0
        static async Task MainAsync(string[] args)
        {
            int numberOfProcesses = Int32.Parse(args[0]);

            // Initialise processes
            CancellationTokenSource cancellation = new CancellationTokenSource();

            for (int i = 0; i < numberOfProcesses; i++)
            {
                var proc = new Process($"process{i}", cancellation.Token);
                processes.Add(proc);
                proc.Initialise();
            }

            // Subscribe to Build Messages
            IQueueBuilder queueBuilder = new RabbitBuilder();
            IReceiver     receiver     = queueBuilder.ConfigureTransport(_queueServer, _queueVhost, _queueUsername, _queuePassword)
                                         .IReceiveFrom(QueueNames.Build())
                                         .IReceiveForever()
                                         .Build();

            receiver.Receive <RunBuild>((m) => {
                RunBuild(m);
            });

            Console.ReadLine();
            Console.WriteLine("Cancelling processes ...");
            cancellation.Cancel();
            Console.WriteLine("Processes cancelled.");
        }
Ejemplo n.º 2
0
        public async Task StartBuild(BuildRunRequest request)
        {
            try
            {
                ReportStatus($"[{request.Build}] Staring");

                RunBuild buildInstruction = CreateBuildInstruction(request);

                string testOutput;

                using (DockerWrapper docker = new DockerWrapper())
                {
                    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
                    //cancellationTokenSource.CancelAfter(TimeSpan.FromSeconds(60));

                    Dictionary <string, string> environmentVariable = new Dictionary <string, string>
                    {
                        { "TESTER_LISTTESTS", "true" }
                    };

                    testOutput = await docker.Run(buildInstruction.Image, environmentVariables : environmentVariable,
                                                  command : buildInstruction.Command, cancellationToken : cancellationTokenSource.Token);
                }

                List <RunTest> tests = new List <RunTest>();

                string[] testNames = testOutput.Split('\n');

                foreach (string testName in testNames)
                {
                    if (!string.IsNullOrEmpty(testName))
                    {
                        RunTest item = new RunTest
                        {
                            Build    = request.Build,
                            FullName = testName.Trim()
                        };

                        tests.Add(item);
                    }
                }

                AddTestsToDictionary(_expectedTests, tests);

                // Configure receivers
                statusMessageReceiver = ConfigureReceiver(QueueNames.Status(request.Build));
                testResultReceiver    = ConfigureReceiver(QueueNames.TestResponse(request.Build));

                // Add all the tests to the queue
                ReportStatus($"[{request.Build}] Sending Test Instructions ...");
                testInstructionSender = ConfigureSender(QueueNames.TestRequest(request.Build));
                SendTestInstructions(testInstructionSender, tests);
                ReportStatus($"[{request.Build}] Test Instructions sent.");

                // Add the build instruction to the queue
                ReportStatus($"[{request.Build}] Sending Build Instruction ...");
                buildInstructionSender = ConfigureSender(QueueNames.Build());
                buildInstructionSender.Send(buildInstruction);
                ReportStatus($"[{request.Build}] Build Instruction sent.");

                // Subscribe to the test result queue until all the tests have been completed (notifying subscribers)
                testResultReceiver.Receive <TestResult>(TestResultReceived);
                statusMessageReceiver.Receive <StatusMessage>(StatusMessageReceived);

                // Wait for tests to complete
                await TestsStillRunning(_cancellationTokenSource.Token);

                ReportStatus($"DONE");

                // Notify cubscribers that the run is complete
                _testResultMonitor.notifyComplete();
                _statusMessageMonitor.notifyComplete();
            } catch (Exception ex)
            {
                ReportError(ex.Message);
            }
        }