• Stars
    star
    11
  • Rank 1,694,829 (Top 34 %)
  • Language
    C#
  • License
    Other
  • Created almost 12 years ago
  • Updated about 2 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

| Public | A secure communication stack for .NET using JSON-RPC over SSL.

Halibut is the communication framework behind Octopus Deploy 3.0.

Overview

Like WCF and other RPC-based communication frameworks, Halibut uses a simple request/response based programming model. However, unlike other request/response frameworks, the transport layer can be configured to allow either party to be a TCP listener or TCP client.

Halibut

To understand the difference, consider WCF using wsHttpBinding. The WCF "client" is always a TCP client, and the WCF "service" is always a TCP listener. For a client to send a request to a server, TCP ports must be opened on the server. This is not always possible.

In Halibut, the relationship between the logical request/response client/service, and the underlying TCP client/listener, is decoupled. The Halibut client might in fact be a TCP listener, while the Halibut service is a TCP client, polling the TCP listener for requests to process.

For Octopus, this means that customers can configure the Tentacle (which hosts services that the Octopus client connects to) in either listening or polling mode.

Halibut has the following features:

  • A simple, request/response based programming model (why we prefer this over messaging)
  • Connections in either direction are secured using SSL, with server and client certificates to provide authentication
  • No dependency on HTTP.sys - simply uses TcpListener, TcpClient and SslStream
  • Requests/responses are serialized using Json.NET BSON, and GZipped
  • Requests and responses can also contain streams of arbitrary length

A more detailed look at the protocol can be found under the Halibit Protocol page.

Usage

Clients and servers both make use of HalibutRuntime to distribute messages. In this example, there's a "Tentacle" that listens on a port, and Octopus connects to it:

using (var octopus = new HalibutRuntime(services, Certificates.Bob))
using (var tentacleListening = new HalibutRuntime(services, Certificates.Alice))
{
    tentacleListening.Listen(8014);
    tentacleListening.Trust(Certificates.BobPublicThumbprint);

    var calculator = octopus.CreateClient<ICalculatorService>(new ServiceEndPoint(new Uri("https://localhost:8014"), Certificates.AlicePublicThumbprint));
    var three = calculator.Add(1, 2);
    Assert.That(three, Is.EqualTo(3));
}

Alternatively, here's a mode where Octopus listens, and Tentacle polls it:

using (var octopus = new HalibutRuntime(services, Certificates.Bob))
using (var tentaclePolling = new HalibutRuntime(services, Certificates.Alice))
{
    octopus.Listen(8013);
    tentaclePolling.Poll(new Uri("poll://subscription123"), new ServiceEndPoint(new Uri("https://localhost:8013"), Certificates.BobPublicThumbprint));

    var calculator = octopus.CreateClient<ICalculatorService>(new ServiceEndPoint(new Uri("poll://subscription123"), Certificates.AlicePublicThumbprint));
    var three = calculator.Add(1, 2);
    Assert.That(three, Is.EqualTo(3));
}

Notice that while the configuration code changed, the request/response code didn't apart from the endpoint. Logically, the Octopus is still the request/response client, and the Tentacle is still the request/response server, even though the transport layer has Octopus as the TCP listener and Tentacle as the TCP client polling for work.

Failure modes

One area we've put a lot of thought into with Halibut is failure modes. Below is a list of possible failure reasons, and how Halibut will handle them.

  • We cannot connect (invalid host name, port blocked, etc.): we try up to 5 times, and for no longer than 30 seconds
  • We connect, but the connection is torn down: no retry
  • We connect, but the server rejects our certificate: no retry
  • We connect, but the server certificate is not what we expect: no retry
  • We connect, but the server encounters an error processing a given request: error is returned and rethrown, no retry
  • We connect, but we encounter an error processing a server request: no retry, error is returned
  • Sending a message to a polling endpoint, but the endpoint doesn't collect the message in a reasonable time (30 seconds currently): fail

More Repositories

1

OctoPack

Creates Octopus-compatible NuGet packages
C#
179
star
2

Library

| Public | A repository of step templates and other community-contributed extensions to Octopus Deploy
PowerShell
171
star
3

Issues

| Public | Bug reports and known issues for Octopus Deploy and all related tools
160
star
4

PowerShell-IIS-Examples

Examples showing how to do everything with IIS and PowerShell
C#
85
star
5

install-octopus-cli-action

| Public | :octocat: GitHub Action to Install the Octopus CLI
TypeScript
80
star
6

create-release-action

| Public | :octocat: GitHub Action to Create a Release in Octopus Deploy
TypeScript
77
star
7

Octostache

| Public | The variable substitution syntax for Octopus Deploy
C#
72
star
8

OctopusDSC

| Public | A PowerShell DSC resource for installing Octopus Deploy & Tentacles
PowerShell
71
star
9

ICanHasDotnetCore

Scans uploaded packages.config files or GitHub repository and determines whether the nuget packages target .NETStandard
C#
71
star
10

People

| Public | Describes our culture and our people
58
star
11

OctoTFS

| Public | Octopus extensions for Azure DevOps, TFS, VSTS, and VSO
TypeScript
57
star
12

Octopus-Docker

Scripts to run Octopus Server inside a docker container [WIP]
PowerShell
36
star
13

cli

| Public | Next Generation of the Octopus CLI 🐙
Go
33
star
14

Octopus-TeamCity

| Public | JetBrains TeamCity plugin to trigger releases on build completion
Java
32
star
15

push-package-action

| Public | :octocat: GitHub Action to Push a Package to Octopus Deploy
TypeScript
31
star
16

Octodiff

| Public | 100% C# implementation of remote delta compression based on the rsync algorithm
C#
29
star
17

octopackjs

A nodejs tool for packaging and pushing projects to an Octopus Deploy instance.
JavaScript
26
star
18

octopus-jenkins-plugin

| Public | Jenkins plugin which integrates with Octopus Deploy
Java
17
star
19

run-runbook-action

| Public | :octocat: GitHub Action to Run a Runbook in Octopus Deploy
TypeScript
17
star
20

TentaclePing

| Public | Diagnostics utility for Tentacle
C#
16
star
21

OctopusDeploy-Api

| Public | Code snippet samples for various operations in the Octopus Deploy REST API
PowerShell
16
star
22

OctopusGrafanaDataSource

| Public |
Go
14
star
23

Calamari

| Public | The core deployment scripts and tools used by Octopus Deploy
C#
13
star
24

CSProjToXProj

Scans a directory and converts .csproj files (and packages.config) to .xproj and project.json and (optionally) updates the solution
C#
13
star
25

go-octopusdeploy

| Public | Go API Client for Octopus Deploy 🐙
Go
12
star
26

TenderSmash

A faster, more fluid UI on top of TenderApp
JavaScript
11
star
27

Specs

| Public |
HCL
11
star
28

helm-charts

Helm chart for deploying Octopus Deploy into a Kubernetes cluster
C#
10
star
29

OctopusTentacle

| Public | The secure, lightweight, cross-platform agent for Octopus Server which turns any computer into a worker or deployment target for automated deployments and operations runbooks.
C#
10
star
30

gulp-octo

⛔️ DEPRECATED A gulp wrapper for octopack library to push projects to Octopus Deploy
JavaScript
9
star
31

DirectoryServicesAuthenticationProvider

| Public |
C#
9
star
32

Architecture

A repository of engineering sensible defaults and decisions that apply across Octopus products
9
star
33

Nevermore

| Public | A JSON Document Store library for SQL Server
C#
8
star
34

Octopus-Bamboo

| Public | Octopus plugin for Bamboo
Java
8
star
35

ASP.NET-Deployment-Book

8
star
36

push-build-information-action

| Public | :octocat: GitHub Action to Push Build Information to Octopus Deploy
TypeScript
8
star
37

OpenIDConnectAuthenticationProviders

| Public |
C#
7
star
38

OctopusCLI

| Public | Command line tool for Octopus Deploy
C#
6
star
39

docs

| Public | Octopus Deploy documentation
MDX
6
star
40

AnsibleDemo

6
star
41

NanoPack

A tool to package ASP.NET Core applications into a NanoServer VHD
C#
6
star
42

octofxjs

A sample project to demonstrate packaging and pushing Node.js projects
JavaScript
6
star
43

grunt-octo

A Grunt wrapper for [octopack](https://github.com/OctopusDeploy/octojs) library to push projects to Octopus Deploy
JavaScript
6
star
44

WhoIsCalling

Quick little .NET 4 console app that listens for inbound TCP connections and prints the client IP address/port
C#
5
star
45

Sashimi

| Public |
C#
4
star
46

Shellfish

| Public | Octopus.Shellfish.*, ShellExecutor and other commandline invocation things
C#
4
star
47

ServerExtensibility

| Public |
C#
4
star
48

deploy-release-tenanted-action

| Public | :octocat: GitHub Action to Deploy a Tenanted Release in Octopus Deploy
TypeScript
4
star
49

Hyponome

The OctopusDeploy / Library Pull Request review tool
JavaScript
4
star
50

Sampler

Command line tool to create sample projects in Octopus
C#
4
star
51

Configuration

| Public |
C#
3
star
52

OctopusClients

| Public | Octopus.Client for commanding Octopus servers
C#
3
star
53

Channels.Sample

| Public | Sample projects for the Channels Walkthrough at https://octopus.com/blog/channels-walkthrough
JavaScript
3
star
54

AuthenticationExtensibility

| Public |
C#
3
star
55

OctoFX-training

OctoFX - for training purposes
JavaScript
3
star
56

JiraIntegration

| Public |
C#
3
star
57

opentelemetry-teamcity-plugin

| Public | A TeamCity plugin that contains a build listener to send OpenTelemetry trace data to an external endpoint
Java
3
star
58

octopus-serverspec-extensions

ServerSpec extensions for Octopus Deploy, with support for Tentacles, Workers, Worker Pools, Environments and more
Ruby
3
star
59

deploy-release-action

| Public | :octocat: GitHub Action to Deploy a Release in Octopus Deploy
TypeScript
3
star
60

create-zip-package-action

| Public | :octocat: GitHub Action to Create a Zip Package to Upload to Octopus Deploy
TypeScript
2
star
61

ArquillianInfrastructureTesting

Java
2
star
62

Octopus.Web.Xdt

C#
2
star
63

api-client.ts

| Public | TypeScript API client for Octopus Deploy ✨🐙🚀✨
TypeScript
2
star
64

ArquillianTest

Java
2
star
65

RoslynAnalyzers

| Public | Roslyn analysers used for Octopus Projects
C#
2
star
66

HCLParser

| Public |
HCL
2
star
67

bell-toad-beamish

| Public | Used for testing GitHub Secrets Scanning
2
star
68

OctoProduct

2
star
69

GuestAuthenticationProvider

| Public |
C#
2
star
70

CommandLine

| Public | The command line parsing library used by many of Octopus apps.
C#
2
star
71

TeamCityCloudAgentUpdater

| Public | Simple NodeJS app to update AMI's for TeamCity Cloud Agents
JavaScript
2
star
72

Octopus.Dependencies.AWSCLI

| Public | AWS CLI repack
PowerShell
2
star
73

octo-webpack-plugin

A webpack wrapper for octopack library to push projects to Octopus Deploy
JavaScript
2
star
74

push-build-information-buildkite-plugin

| Public | Buildkite plugin to push build information to Octopus Deploy
Shell
2
star
75

message-contracts.ts

| Public | Shared TypeScript definitions for Octopus Deploy API messages 🐙
TypeScript
2
star
76

blog

| Public | The Octopus Deploy blog
2
star
77

Sashimi.Terraform

| Public |
C#
2
star
78

UsernamePasswordAuthenticationProvider

| Public |
C#
2
star
79

GitHubIssueTracker

| Public |
C#
2
star
80

Orca

Credential scanning for Github Repositories
Go
2
star
81

util-actions

| Public | A set of utility actions for use in GitHub action workflows
TypeScript
2
star
82

create-release-buildkite-plugin

| Public | Buildkite plugin to create a release through Octopus Deploy
Shell
1
star
83

create-nuget-package-action

| Public | :octocat: GitHub Action to Create a NuGet Package for Octopus Deploy
TypeScript
1
star
84

OctoVersion

| Public | .NET tool for determining version number based on the Git revision graph
C#
1
star
85

ThymeleafSpringDemo

| Public | Simple Spring ThymeLeaf Demo
Shell
1
star
86

vscode-octopusdeploy

| Public | Octopus Deploy for Visual Studio Code 🐙
TypeScript
1
star
87

step-package-template

| Public | A template to getting started with Octopus Deploy step packages
JavaScript
1
star
88

Versioning

| Public |
C#
1
star
89

homebrew-taps

| Public | The homebrew tap repo for OctopusCli
Ruby
1
star
90

Sashimi.AzureAppService

| Public |
C#
1
star
91

Sashimi.AzureScripting

| Public |
C#
1
star
92

SpringBootStopper

| Public |
Shell
1
star
93

StartTeamCityAgentWhenZIsAvailableService

Service that is used to delay the start of the TCBuildAgent until AWS has attached the ephemeral (SSD) drives
C#
1
star
94

go-octodiff

| Public | 100% Go implementation of remote delta compression based on the rsync algorithm (based on C# OctoDiff)
Go
1
star
95

JavaPropertiesParser

| Public |
C#
1
star
96

OptimumSetupBook

| Public | This repo is used to store the open source book on how to setup an Octopus Deploy Server to scale up and out.
1
star
97

SpringBootWindowsService

| Public |
Shell
1
star
98

Octopus.Dependencies.GoogleCloudCli

| Public |
PowerShell
1
star
99

Time

| Public |
C#
1
star
100

Caching

| Public | A simple but battle hardened in memory cache designed to be registered globally in your IoC container
C#
1
star