Repository: jenkins-x/lighthouse
Pull request #826 (2020-06-24 20:47:56)

chore: Pull plugin config types from lighthouse-config
Followup to earlier work.

Signed-off-by: Andrew Bayer <andrew.bayer@gmail.com>

jenkins-x-bot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **abayer**
You can assign the PR to them by writing `/assign @abayer` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=jenkins-x%2Flighthouse).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/jenkins-x/lighthouse/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["abayer"]} -->
jenkins-x-bot: @abayer: The following test **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pr-build | 11c24e763f2196af8bbaf4929cb4d5c96a0e366b | [link]() | `/test pr-build`

[View all Builds for this Pull Request](https://dashboard-jx.jenkins-x.live/teams/jx/projects/jenkins-x/lighthouse/PR-826) 

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [jenkins-x/lighthouse](https://github.com/jenkins-x/lighthouse/issues/new?title=Command%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
abayer: /retest

Patch:
diff --git a/go.mod b/go.mod
index 04e0f256..3113383d 100644
--- a/go.mod
+++ b/go.mod
@@ -8,7 +8,7 @@ require (
 	github.com/gorilla/sessions v1.1.3
 	github.com/jenkins-x/go-scm v1.5.143
 	github.com/jenkins-x/jx/v2 v2.1.88
-	github.com/jenkins-x/lighthouse-config v0.0.5
+	github.com/jenkins-x/lighthouse-config v0.0.6
 	github.com/pkg/errors v0.9.1
 	github.com/prometheus/client_golang v1.1.0
 	github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 // indirect
diff --git a/go.sum b/go.sum
index d33ae454..e16c8bef 100644
--- a/go.sum
+++ b/go.sum
@@ -136,6 +136,8 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx
 github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8=
 github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
 github.com/Venafi/vcert v0.0.0-20190613103158-62139eb19b25/go.mod h1:3sXw16DKVded/kLVDma2veqEUQC7O37h98ims7cIvN4=
+github.com/abayer/lighthouse-config v0.0.0-20200624200835-017296b27101 h1:0JWr9mdI7Tdh/cXuHK0UWXXmH2kNqkp36dJz9FJv374=
+github.com/abayer/lighthouse-config v0.0.0-20200624200835-017296b27101/go.mod h1:5ax5UF79SGM+Xc3HrWR/9LsPQBWDxE+TEJMwPAikst8=
 github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw=
 github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8=
 github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo=
@@ -749,6 +751,8 @@ github.com/jenkins-x/jx/v2 v2.1.88 h1:TxTvT5E5PyMcM0OhGmjc9Sv3eNZW4e5+w9WLaY4X2P
 github.com/jenkins-x/jx/v2 v2.1.88/go.mod h1:5pwhF6k6NkEt5dmAJQ7wunrS60xKGVDBqQ8ydyqjr8A=
 github.com/jenkins-x/lighthouse-config v0.0.5 h1:RyfM6kHs1/8Hc4uRhHd4kvSvRJhbWi3Fm7tlf5JYAFQ=
 github.com/jenkins-x/lighthouse-config v0.0.5/go.mod h1:5ax5UF79SGM+Xc3HrWR/9LsPQBWDxE+TEJMwPAikst8=
+github.com/jenkins-x/lighthouse-config v0.0.6 h1:s73GxzEaqsqn/9w+VnkPKLx4lSs450PMgk4rpCioOm0=
+github.com/jenkins-x/lighthouse-config v0.0.6/go.mod h1:5ax5UF79SGM+Xc3HrWR/9LsPQBWDxE+TEJMwPAikst8=
 github.com/jenkins-x/logrus-stackdriver-formatter v0.1.1-0.20200408213659-1dcf20c371bb h1:woC0LbYpL9rgwZn13Z0KQBEGAmi9ugpWgWtQezHqsBM=
 github.com/jenkins-x/logrus-stackdriver-formatter v0.1.1-0.20200408213659-1dcf20c371bb/go.mod h1:Erk5rrGYkvFlFAoVbz/7obMDEIUFCEbhK1odoR0Msqo=
 github.com/jenkins-x/logrus-stackdriver-formatter v0.2.3 h1:NuRWKUPCEX1wKlXA8ZYSG28qGKd41R7BK11YDQkPwqo=
diff --git a/pkg/labels/labels.go b/pkg/labels/labels.go
deleted file mode 100644
index fcf7d7c6..00000000
--- a/pkg/labels/labels.go
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
-Copyright 2018 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package labels
-
-// labels for github plugins
-const (
-	Approved        = "approved"
-	BlockedPaths    = "do-not-merge/blocked-paths"
-	Bug             = "kind/bug"
-	ClaNo           = "cncf-cla: no"
-	ClaYes          = "cncf-cla: yes"
-	CpApproved      = "cherry-pick-approved"
-	CpUnapproved    = "do-not-merge/cherry-pick-not-approved"
-	GoodFirstIssue  = "good first issue"
-	Help            = "help wanted"
-	Hold            = "do-not-merge/hold"
-	InvalidOwners   = "do-not-merge/invalid-owners-file"
-	LGTM            = "lgtm"
-	LifecycleActive = "lifecycle/active"
-	LifecycleFrozen = "lifecycle/frozen"
-	LifecycleRotten = "lifecycle/rotten"
-	LifecycleStale  = "lifecycle/stale"
-	NeedsOkToTest   = "needs-ok-to-test"
-	NeedsRebase     = "needs-rebase"
-	NeedsSig        = "needs-sig"
-	OkToTest        = "ok-to-test"
-	Shrug           = "¯\\_(ツ)_/¯"
-	WorkInProgress  = "do-not-merge/work-in-progress"
-)
diff --git a/pkg/plugins/approve/approve.go b/pkg/plugins/approve/approve.go
index 3e632a34..410c7811 100644
--- a/pkg/plugins/approve/approve.go
+++ b/pkg/plugins/approve/approve.go
@@ -31,7 +31,7 @@ import (
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/pluginhelp"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 	"github.com/jenkins-x/lighthouse/pkg/plugins/approve/approvers"
diff --git a/pkg/plugins/blockade/blockade.go b/pkg/plugins/blockade/blockade.go
index e92016cc..d83086d7 100644
--- a/pkg/plugins/blockade/blockade.go
+++ b/pkg/plugins/blockade/blockade.go
@@ -30,7 +30,7 @@ import (
 	"strings"
 
 	"github.com/jenkins-x/go-scm/scm"
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/pluginhelp"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 	"github.com/sirupsen/logrus"
diff --git a/pkg/plugins/cherrypickunapproved/cherrypick-unapproved.go b/pkg/plugins/cherrypickunapproved/cherrypick-unapproved.go
index 9c57fd0b..7e684096 100644
--- a/pkg/plugins/cherrypickunapproved/cherrypick-unapproved.go
+++ b/pkg/plugins/cherrypickunapproved/cherrypick-unapproved.go
@@ -28,7 +28,7 @@ import (
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
 	"github.com/sirupsen/logrus"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/pluginhelp"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 )
diff --git a/pkg/plugins/config.go b/pkg/plugins/config.go
deleted file mode 100644
index d8058115..00000000
--- a/pkg/plugins/config.go
+++ /dev/null
@@ -1,911 +0,0 @@
-/*
-Copyright 2018 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package plugins
-
-import (
-	"errors"
-	"fmt"
-	"path"
-	"regexp"
-	"strings"
-	"sync"
-	"time"
-
-	"github.com/jenkins-x/lighthouse/pkg/labels"
-	"github.com/sirupsen/logrus"
-
-	"k8s.io/apimachinery/pkg/util/sets"
-)
-
-const (
-	defaultBlunderbussReviewerCount = 2
-	failOnMissingPlugin             = false
-)
-
-// Configuration is the top-level serialization target for plugin Configuration.
-type Configuration struct {
-	// Plugins is a map of repositories (eg "k/k") to lists of
-	// plugin names.
-	// TODO: Link to the list of supported plugins.
-	// https://github.com/kubernetes/test-infra/issues/3476
-	Plugins map[string][]string `json:"plugins,omitempty"`
-
-	// ExternalPlugins is a map of repositories (eg "k/k") to lists of
-	// external plugins.
-	ExternalPlugins map[string][]ExternalPlugin `json:"external_plugins,omitempty"`
-
-	// Owners contains configuration related to handling OWNERS files.
-	Owners Owners `json:"owners,omitempty"`
-
-	// Built-in plugins specific configuration.
-	Approve                    []Approve              `json:"approve,omitempty"`
-	UseDeprecatedSelfApprove   bool                   `json:"use_deprecated_2018_implicit_self_approve_default_migrate_before_july_2019,omitempty"`
-	UseDeprecatedReviewApprove bool                   `json:"use_deprecated_2018_review_acts_as_approve_default_migrate_before_july_2019,omitempty"`
-	Blockades                  []Blockade             `json:"blockades,omitempty"`
-	Blunderbuss                Blunderbuss            `json:"blunderbuss,omitempty"`
-	Cat                        Cat                    `json:"cat,omitempty"`
-	CherryPickUnapproved       CherryPickUnapproved   `json:"cherry_pick_unapproved,omitempty"`
-	ConfigUpdater              ConfigUpdater          `json:"config_updater,omitempty"`
-	Golint                     *Golint                `json:"golint,omitempty"`
-	Heart                      Heart                  `json:"heart,omitempty"`
-	Label                      Label                  `json:"label,omitempty"`
-	Lgtm                       []Lgtm                 `json:"lgtm,omitempty"`
-	RepoMilestone              map[string]Milestone   `json:"repo_milestone,omitempty"`
-	RequireMatchingLabel       []RequireMatchingLabel `json:"require_matching_label,omitempty"`
-	RequireSIG                 RequireSIG             `json:"requiresig,omitempty"`
-	Slack                      Slack                  `json:"slack,omitempty"`
-	SigMention                 SigMention             `json:"sigmention,omitempty"`
-	Size                       Size                   `json:"size,omitempty"`
-	Triggers                   []Trigger              `json:"triggers,omitempty"`
-	Welcome                    []Welcome              `json:"welcome,omitempty"`
-}
-
-// Golint holds configuration for the golint plugin
-type Golint struct {
-	// MinimumConfidence is the smallest permissible confidence
-	// in (0,1] over which problems will be printed. Defaults to
-	// 0.8, as does the `go lint` tool.
-	MinimumConfidence *float64 `json:"minimum_confidence,omitempty"`
-}
-
-// ExternalPlugin holds configuration for registering an external
-// plugin in prow.
-type ExternalPlugin struct {
-	// Name of the plugin.
-	Name string `json:"name"`
-	// Endpoint is the location of the external plugin. Defaults to
-	// the name of the plugin, ie. "http://{{name}}".
-	Endpoint string `json:"endpoint,omitempty"`
-	// Events are the events that need to be demuxed by the hook
-	// server to the external plugin. If no events are specified,
-	// everything is sent.
-	Events []string `json:"events,omitempty"`
-}
-
-// Blunderbuss defines configuration for the blunderbuss plugin.
-type Blunderbuss struct {
-	// ReviewerCount is the minimum number of reviewers to request
-	// reviews from. Defaults to requesting reviews from 2 reviewers
-	// if FileWeightCount is not set.
-	ReviewerCount *int `json:"request_count,omitempty"`
-	// MaxReviewerCount is the maximum number of reviewers to request
-	// reviews from. Defaults to 0 meaning no limit.
-	MaxReviewerCount int `json:"max_request_count,omitempty"`
-	// FileWeightCount is the maximum number of reviewers to request
-	// reviews from. Selects reviewers based on file weighting.
-	// This and request_count are mutually exclusive options.
-	FileWeightCount *int `json:"file_weight_count,omitempty"`
-	// ExcludeApprovers controls whether approvers are considered to be
-	// reviewers. By default, approvers are considered as reviewers if
-	// insufficient reviewers are available. If ExcludeApprovers is true,
-	// approvers will never be considered as reviewers.
-	ExcludeApprovers bool `json:"exclude_approvers,omitempty"`
-	// UseStatusAvailability controls whether blunderbuss will consider GitHub's
-	// status availability when requesting reviews for users. This will use at one
-	// additional token per successful reviewer (and potentially more depending on
-	// how many busy reviewers it had to pass over).
-	UseStatusAvailability bool `json:"use_status_availability,omitempty"`
-}
-
-// Owners contains configuration related to handling OWNERS files.
-type Owners struct {
-	// MDYAMLRepos is a list of org and org/repo strings specifying the repos that support YAML
-	// OWNERS config headers at the top of markdown (*.md) files. These headers function just like
-	// the config in an OWNERS file, but only apply to the file itself instead of the entire
-	// directory and all sub-directories.
-	// The yaml header must be at the start of the file and be bracketed with "---" like so:
-	/*
-		---
-		approvers:
-		- mikedanese
-		- thockin
-
-		---
-	*/
-	MDYAMLRepos []string `json:"mdyamlrepos,omitempty"`
-
-	// SkipCollaborators disables collaborator cross-checks and forces both
-	// the approve and lgtm plugins to use solely OWNERS files for access
-	// control in the provided repos.
-	SkipCollaborators []string `json:"skip_collaborators,omitempty"`
-
-	// LabelsBlackList holds a list of labels that should not be present in any
-	// OWNERS file, preventing their automatic addition by the owners-label plugin.
-	// This check is performed by the verify-owners plugin.
-	LabelsBlackList []string `json:"labels_blacklist,omitempty"`
-}
-
-// MDYAMLEnabled returns a boolean denoting if the passed repo supports YAML OWNERS config headers
-// at the top of markdown (*.md) files. These function like OWNERS files but only apply to the file
-// itself.
-func (c *Configuration) MDYAMLEnabled(org, repo string) bool {
-	full := fmt.Sprintf("%s/%s", org, repo)
-	for _, elem := range c.Owners.MDYAMLRepos {
-		if elem == org || elem == full {
-			return true
-		}
-	}
-	return false
-}
-
-// SkipCollaborators returns a boolean denoting if collaborator cross-checks are enabled for
-// the passed repo. If it's true, approve and lgtm plugins rely solely on OWNERS files.
-func (c *Configuration) SkipCollaborators(org, repo string) bool {
-	full := fmt.Sprintf("%s/%s", org, repo)
-	for _, elem := range c.Owners.SkipCollaborators {
-		if elem == org || elem == full {
-			return true
-		}
-	}
-	return false
-}
-
-// RequireSIG specifies configuration for the require-sig plugin.
-type RequireSIG struct {
-	// GroupListURL is the URL where a list of the available SIGs can be found.
-	GroupListURL string `json:"group_list_url,omitempty"`
-}
-
-// SigMention specifies configuration for the sigmention plugin.
-type SigMention struct {
-	// Regexp parses comments and should return matches to team mentions.
-	// These mentions enable labeling issues or PRs with sig/team labels.
-	// Furthermore, teams with the following suffixes will be mapped to
-	// kind/* labels:
-	//
-	// * @org/team-bugs             --maps to--> kind/bug
-	// * @org/team-feature-requests --maps to--> kind/feature
-	// * @org/team-api-reviews      --maps to--> kind/api-change
-	// * @org/team-proposals        --maps to--> kind/design
-	//
-	// Note that you need to make sure your regexp covers the above
-	// mentions if you want to use the extra labeling. Defaults to:
-	// (?m)@kubernetes/sig-([\w-]*)-(misc|test-failures|bugs|feature-requests|proposals|pr-reviews|api-reviews)
-	//
-	// Compiles into Re during config load.
-	Regexp string         `json:"regexp,omitempty"`
-	Re     *regexp.Regexp `json:"-"`
-}
-
-// Size specifies configuration for the size plugin, defining lower bounds (in # lines changed) for each size label.
-// XS is assumed to be zero.
-type Size struct {
-	S   int `json:"s"`
-	M   int `json:"m"`
-	L   int `json:"l"`
-	Xl  int `json:"xl"`
-	Xxl int `json:"xxl"`
-}
-
-// Blockade specifies a configuration for a single blockade.
-//
-// The configuration for the blockade plugin is defined as a list of these structures.
-type Blockade struct {
-	// Repos are either of the form org/repos or just org.
-	Repos []string `json:"repos,omitempty"`
-	// BlockRegexps are regular expressions matching the file paths to block.
-	BlockRegexps []string `json:"blockregexps,omitempty"`
-	// ExceptionRegexps are regular expressions matching the file paths that are exceptions to the BlockRegexps.
-	ExceptionRegexps []string `json:"exceptionregexps,omitempty"`
-	// Explanation is a string that will be included in the comment left when blocking a PR. This should
-	// be an explanation of why the paths specified are blockaded.
-	Explanation string `json:"explanation,omitempty"`
-}
-
-// Approve specifies a configuration for a single approve.
-//
-// The configuration for the approve plugin is defined as a list of these structures.
-type Approve struct {
-	// Repos is either of the form org/repos or just org.
-	Repos []string `json:"repos,omitempty"`
-	// IssueRequired indicates if an associated issue is required for approval in
-	// the specified repos.
-	IssueRequired bool `json:"issue_required,omitempty"`
-
-	// TODO(fejta): delete in June 2019
-	DeprecatedImplicitSelfApprove *bool `json:"implicit_self_approve,omitempty"`
-	// RequireSelfApproval requires PR authors to explicitly approve their PRs.
-	// Otherwise the plugin assumes the author of the PR approves the changes in the PR.
-	RequireSelfApproval *bool `json:"require_self_approval,omitempty"`
-
-	// LgtmActsAsApprove indicates that the lgtm command should be used to
-	// indicate approval
-	LgtmActsAsApprove bool `json:"lgtm_acts_as_approve,omitempty"`
-
-	// ReviewActsAsApprove should be replaced with its non-deprecated inverse: ignore_review_state.
-	// TODO(fejta): delete in June 2019
-	DeprecatedReviewActsAsApprove *bool `json:"review_acts_as_approve,omitempty"`
-	// IgnoreReviewState causes the approve plugin to ignore the GitHub review state. Otherwise:
-	// * an APPROVE github review is equivalent to leaving an "/approve" message.
-	// * A REQUEST_CHANGES github review is equivalent to leaving an /approve cancel" message.
-	IgnoreReviewState *bool `json:"ignore_review_state,omitempty"`
-}
-
-var (
-	warnImplicitSelfApprove time.Time
-	warnReviewActsAsApprove time.Time
-	warnLock                sync.RWMutex // Rare updates and concurrent readers, so reuse the same lock
-)
-
-func warnDeprecated(last *time.Time, freq time.Duration, msg string) {
-	// have we warned within the last freq?
-	warnLock.RLock()
-	fresh := time.Now().Sub(*last) <= freq
-	warnLock.RUnlock()
-	if fresh { // we've warned recently
-		return
-	}
-	// Warning is stale, will we win the race to warn?
-	warnLock.Lock()
-	defer warnLock.Unlock()
-	now := time.Now()           // Recalculate now, we might wait awhile for the lock
-	if now.Sub(*last) <= freq { // Nope, we lost
-		return
-	}
-	*last = now
-	logrus.Warn(msg)
-}
-
-// HasSelfApproval checks if it has self-approval
-func (a Approve) HasSelfApproval() bool {
-	if a.DeprecatedImplicitSelfApprove != nil {
-		warnDeprecated(&warnImplicitSelfApprove, 5*time.Minute, "Please update plugins.yaml to use require_self_approval instead of the deprecated implicit_self_approve before June 2019")
-		return *a.DeprecatedImplicitSelfApprove
-	} else if a.RequireSelfApproval != nil {
-		return !*a.RequireSelfApproval
-	}
-	return true
-}
-
-// ConsiderReviewState checks if the rewview state is active
-func (a Approve) ConsiderReviewState() bool {
-	if a.DeprecatedReviewActsAsApprove != nil {
-		warnDeprecated(&warnReviewActsAsApprove, 5*time.Minute, "Please update plugins.yaml to use ignore_review_state instead of the deprecated review_acts_as_approve before June 2019")
-		return *a.DeprecatedReviewActsAsApprove
-	} else if a.IgnoreReviewState != nil {
-		return !*a.IgnoreReviewState
-	}
-	return true
-}
-
-// Lgtm specifies a configuration for a single lgtm.
-// The configuration for the lgtm plugin is defined as a list of these structures.
-type Lgtm struct {
-	// Repos is either of the form org/repos or just org.
-	Repos []string `json:"repos,omitempty"`
-	// ReviewActsAsLgtm indicates that a Github review of "approve" or "request changes"
-	// acts as adding or removing the lgtm label
-	ReviewActsAsLgtm bool `json:"review_acts_as_lgtm,omitempty"`
-	// StoreTreeHash indicates if tree_hash should be stored inside a comment to detect
-	// squashed commits before removing lgtm labels
-	StoreTreeHash bool `json:"store_tree_hash,omitempty"`
-	// WARNING: This disables the security mechanism that prevents a malicious member (or
-	// compromised GitHub account) from merging arbitrary code. Use with caution.
-	//
-	// StickyLgtmTeam specifies the Github team whose members are trusted with sticky LGTM,
-	// which eliminates the need to re-lgtm minor fixes/updates.
-	StickyLgtmTeam string `json:"trusted_team_for_sticky_lgtm,omitempty"`
-}
-
-// Cat contains the configuration for the cat plugin.
-type Cat struct {
-	// Path to file containing an api key for thecatapi.com
-	KeyPath string `json:"key_path,omitempty"`
-}
-
-// Label contains the configuration for the label plugin.
-type Label struct {
-	// AdditionalLabels is a set of additional labels enabled for use
-	// on top of the existing "kind/*", "priority/*", and "area/*" labels.
-	AdditionalLabels []string `json:"additional_labels"`
-}
-
-// Trigger specifies a configuration for a single trigger.
-//
-// The configuration for the trigger plugin is defined as a list of these structures.
-type Trigger struct {
-	// Repos is either of the form org/repos or just org.
-	Repos []string `json:"repos,omitempty"`
-	// TrustedOrg is the org whose members' PRs will be automatically built
-	// for PRs to the above repos. The default is the PR's org.
-	TrustedOrg string `json:"trusted_org,omitempty"`
-	// JoinOrgURL is a link that redirects users to a location where they
-	// should be able to read more about joining the organization in order
-	// to become trusted members. Defaults to the Github link of TrustedOrg.
-	JoinOrgURL string `json:"join_org_url,omitempty"`
-	// OnlyOrgMembers requires PRs and/or /ok-to-test comments to come from org members.
-	// By default, trigger also include repo collaborators.
-	OnlyOrgMembers bool `json:"only_org_members,omitempty"`
-	// IgnoreOkToTest makes trigger ignore /ok-to-test comments.
-	// This is a security mitigation to only allow testing from trusted users.
-	IgnoreOkToTest bool `json:"ignore_ok_to_test,omitempty"`
-	// ElideSkippedContexts makes trigger not post "Skipped" contexts for jobs
-	// that could run but do not run.
-	ElideSkippedContexts bool `json:"elide_skipped_contexts,omitempty"`
-}
-
-// Heart contains the configuration for the heart plugin.
-type Heart struct {
-	// Adorees is a list of GitHub logins for members
-	// for whom we will add emojis to comments
-	Adorees []string `json:"adorees,omitempty"`
-	// CommentRegexp is the regular expression for comments
-	// made by adorees that the plugin adds emojis to.
-	// If not specified, the plugin will not add emojis to
-	// any comments.
-	// Compiles into CommentRe during config load.
-	CommentRegexp string         `json:"commentregexp,omitempty"`
-	CommentRe     *regexp.Regexp `json:"-"`
-}
-
-// Milestone contains the configuration options for the milestone and
-// milestonestatus plugins.
-type Milestone struct {
-	// ID of the github team for the milestone maintainers (used for setting status labels)
-	// You can curl the following endpoint in order to determine the gitprovider.ID of your team
-	// responsible for maintaining the milestones:
-	// curl -H "Authorization: token <token>" https://api.github.com/orgs/<org-name>/teams
-	MaintainersID           int    `json:"maintainers_id,omitempty"`
-	MaintainersTeam         string `json:"maintainers_team,omitempty"`
-	MaintainersFriendlyName string `json:"maintainers_friendly_name,omitempty"`
-}
-
-// Slack contains the configuration for the slack plugin.
-type Slack struct {
-	MentionChannels []string       `json:"mentionchannels,omitempty"`
-	MergeWarnings   []MergeWarning `json:"mergewarnings,omitempty"`
-}
-
-// ConfigMapSpec contains configuration options for the configMap being updated
-// by the config-updater plugin.
-type ConfigMapSpec struct {
-	// Name of ConfigMap
-	Name string `json:"name"`
-	// Key is the key in the ConfigMap to update with the file contents.
-	// If no explicit key is given, the basename of the file will be used.
-	Key string `json:"key,omitempty"`
-	// Namespace in which the configMap needs to be deployed. If no namespace is specified
-	// it will be deployed to the LighthouseJobNamespace.
-	Namespace string `json:"namespace,omitempty"`
-	// Namespaces in which the configMap needs to be deployed, in addition to the above
-	// namespace provided, or the default if it is not set.
-	AdditionalNamespaces []string `json:"additional_namespaces,omitempty"`
-
-	// Namespaces is the fully resolved list of Namespaces to deploy the ConfigMap in
-	Namespaces []string `json:"-"`
-}
-
-// ConfigUpdater contains the configuration for the config-updater plugin.
-type ConfigUpdater struct {
-	// A map of filename => ConfigMapSpec.
-	// Whenever a commit changes filename, prow will update the corresponding configmap.
-	// map[string]ConfigMapSpec{ "/my/path.yaml": {Name: "foo", Namespace: "otherNamespace" }}
-	// will result in replacing the foo configmap whenever path.yaml changes
-	Maps map[string]ConfigMapSpec `json:"maps,omitempty"`
-	// The location of the prow configuration file inside the repository
-	// where the config-updater plugin is enabled. This needs to be relative
-	// to the root of the repository, eg. "prow/config.yaml" will match
-	// github.com/kubernetes/test-infra/prow/config.yaml assuming the config-updater
-	// plugin is enabled for kubernetes/test-infra. Defaults to "prow/config.yaml".
-	ConfigFile string `json:"config_file,omitempty"`
-	// The location of the prow plugin configuration file inside the repository
-	// where the config-updater plugin is enabled. This needs to be relative
-	// to the root of the repository, eg. "prow/plugins.yaml" will match
-	// github.com/kubernetes/test-infra/prow/plugins.yaml assuming the config-updater
-	// plugin is enabled for kubernetes/test-infra. Defaults to "prow/plugins.yaml".
-	PluginFile string `json:"plugin_file,omitempty"`
-}
-
-// MergeWarning is a config for the slackevents plugin's manual merge warnings.
-// If a PR is pushed to any of the repos listed in the config then send messages
-// to the all the slack channels listed if pusher is NOT in the whitelist.
-type MergeWarning struct {
-	// Repos is either of the form org/repos or just org.
-	Repos []string `json:"repos,omitempty"`
-	// List of channels on which a event is published.
-	Channels []string `json:"channels,omitempty"`
-	// A slack event is published if the user is not part of the WhiteList.
-	WhiteList []string `json:"whitelist,omitempty"`
-	// A slack event is published if the user is not on the branch whitelist
-	BranchWhiteList map[string][]string `json:"branch_whitelist,omitempty"`
-}
-
-// Welcome is config for the welcome plugin.
-type Welcome struct {
-	// Repos is either of the form org/repos or just org.
-	Repos []string `json:"repos,omitempty"`
-	// MessageTemplate is the welcome message template to post on new-contributor PRs
-	// For the info struct see prow/plugins/welcome/welcome.go's PRInfo
-	MessageTemplate string `json:"message_template,omitempty"`
-}
-
-// CherryPickUnapproved is the config for the cherrypick-unapproved plugin.
-type CherryPickUnapproved struct {
-	// BranchRegexp is the regular expression for branch names such that
-	// the plugin treats only PRs against these branch names as cherrypick PRs.
-	// Compiles into BranchRe during config load.
-	BranchRegexp string         `json:"branchregexp,omitempty"`
-	BranchRe     *regexp.Regexp `json:"-"`
-	// Comment is the comment added by the plugin while adding the
-	// `do-not-merge/cherry-pick-not-approved` label.
-	Comment string `json:"comment,omitempty"`
-}
-
-// RequireMatchingLabel is the config for the require-matching-label plugin.
-type RequireMatchingLabel struct {
-	// Org is the GitHub organization that this config applies to.
-	Org string `json:"org,omitempty"`
-	// Repo is the GitHub repository within Org that this config applies to.
-	// This fields may be omitted to apply this config across all repos in Org.
-	Repo string `json:"repo,omitempty"`
-	// Branch is the branch ref of PRs that this config applies to.
-	// This field is only valid if `prs: true` and may be omitted to apply this
-	// config across all branches in the repo or org.
-	Branch string `json:"branch,omitempty"`
-	// PRs is a bool indicating if this config applies to PRs.
-	PRs bool `json:"prs,omitempty"`
-	// Issues is a bool indicating if this config applies to issues.
-	Issues bool `json:"issues,omitempty"`
-
-	// Regexp is the string specifying the regular expression used to look for
-	// matching labels.
-	Regexp string `json:"regexp,omitempty"`
-	// Re is the compiled version of Regexp. It should not be specified in config.
-	Re *regexp.Regexp `json:"-"`
-
-	// MissingLabel is the label to apply if an issue does not have any label
-	// matching the Regexp.
-	MissingLabel string `json:"missing_label,omitempty"`
-	// MissingComment is the comment to post when we add the MissingLabel to an
-	// issue. This is typically used to explain why MissingLabel was added and
-	// how to move forward.
-	// This field is optional. If unspecified, no comment is created when labeling.
-	MissingComment string `json:"missing_comment,omitempty"`
-
-	// GracePeriod is the amount of time to wait before processing newly opened
-	// or reopened issues and PRs. This delay allows other automation to apply
-	// labels before we look for matching labels.
-	// Defaults to '5s'.
-	GracePeriod         string        `json:"grace_period,omitempty"`
-	GracePeriodDuration time.Duration `json:"-"`
-}
-
-// validate checks the following properties:
-// - Org, Regexp, MissingLabel, and GracePeriod must be non-empty.
-// - Repo does not contain a '/' (should use Org+Repo).
-// - At least one of PRs or Issues must be true.
-// - Branch only specified if 'prs: true'
-// - MissingLabel must not match Regexp.
-func (r RequireMatchingLabel) validate() error {
-	if r.Org == "" {
-		return errors.New("must specify 'org'")
-	}
-	if strings.Contains(r.Repo, "/") {
-		return errors.New("'repo' may not contain '/'; specify the organization with 'org'")
-	}
-	if r.Regexp == "" {
-		return errors.New("must specify 'regexp'")
-	}
-	if r.MissingLabel == "" {
-		return errors.New("must specify 'missing_label'")
-	}
-	if r.GracePeriod == "" {
-		return errors.New("must specify 'grace_period'")
-	}
-	if !r.PRs && !r.Issues {
-		return errors.New("must specify 'prs: true' and/or 'issues: true'")
-	}
-	if !r.PRs && r.Branch != "" {
-		return errors.New("branch cannot be specified without `prs: true'")
-	}
-	if r.Re.MatchString(r.MissingLabel) {
-		return errors.New("'regexp' must not match 'missing_label'")
-	}
-	return nil
-}
-
-// Describe generates a human readable description of the behavior that this
-// configuration specifies.
-func (r RequireMatchingLabel) Describe() string {
-	str := &strings.Builder{}
-	fmt.Fprintf(str, "Applies the '%s' label ", r.MissingLabel)
-	if r.MissingComment == "" {
-		fmt.Fprint(str, "to ")
-	} else {
-		fmt.Fprint(str, "and comments on ")
-	}
-
-	if r.Issues {
-		fmt.Fprint(str, "Issues ")
-		if r.PRs {
-			fmt.Fprint(str, "and ")
-		}
-	}
-	if r.PRs {
-		if r.Branch != "" {
-			fmt.Fprintf(str, "'%s' branch ", r.Branch)
-		}
-		fmt.Fprint(str, "PRs ")
-	}
-
-	if r.Repo == "" {
-		fmt.Fprintf(str, "in the '%s' GitHub org ", r.Org)
-	} else {
-		fmt.Fprintf(str, "in the '%s/%s' GitHub repo ", r.Org, r.Repo)
-	}
-	fmt.Fprintf(str, "that have no labels matching the regular expression '%s'.", r.Regexp)
-	return str.String()
-}
-
-// TriggerFor finds the Trigger for a repo, if one exists
-// a trigger can be listed for the repo itself or for the
-// owning organization
-func (c *Configuration) TriggerFor(org, repo string) *Trigger {
-	for _, tr := range c.Triggers {
-		for _, r := range tr.Repos {
-			if r == org || r == fmt.Sprintf("%s/%s", org, repo) {
-				return &tr
-			}
-		}
-	}
-	return &Trigger{}
-}
-
-// EnabledReposForPlugin returns the orgs and repos that have enabled the passed plugin.
-func (c *Configuration) EnabledReposForPlugin(plugin string) (orgs, repos []string) {
-	for repo, plugins := range c.Plugins {
-		found := false
-		for _, candidate := range plugins {
-			if candidate == plugin {
-				found = true
-				break
-			}
-		}
-		if found {
-			if strings.Contains(repo, "/") {
-				repos = append(repos, repo)
-			} else {
-				orgs = append(orgs, repo)
-			}
-		}
-	}
-	return
-}
-
-// EnabledReposForExternalPlugin returns the orgs and repos that have enabled the passed
-// external plugin.
-func (c *Configuration) EnabledReposForExternalPlugin(plugin string) (orgs, repos []string) {
-	for repo, plugins := range c.ExternalPlugins {
-		found := false
-		for _, candidate := range plugins {
-			if candidate.Name == plugin {
-				found = true
-				break
-			}
-		}
-		if found {
-			if strings.Contains(repo, "/") {
-				repos = append(repos, repo)
-			} else {
-				orgs = append(orgs, repo)
-			}
-		}
-	}
-	return
-}
-
-// SetDefaults sets default options for config updating
-func (c *ConfigUpdater) SetDefaults() {
-	if len(c.Maps) == 0 {
-		cf := c.ConfigFile
-		if cf == "" {
-			cf = "prow/config.yaml"
-		} else {
-			logrus.Warnf(`config_file is deprecated, please switch to "maps": {"%s": "config"} before July 2018`, cf)
-		}
-		pf := c.PluginFile
-		if pf == "" {
-			pf = "prow/plugins.yaml"
-		} else {
-			logrus.Warnf(`plugin_file is deprecated, please switch to "maps": {"%s": "plugins"} before July 2018`, pf)
-		}
-		c.Maps = map[string]ConfigMapSpec{
-			cf: {
-				Name: "config",
-			},
-			pf: {
-				Name: "plugins",
-			},
-		}
-	}
-
-	for name, spec := range c.Maps {
-		spec.Namespaces = append([]string{spec.Namespace}, spec.AdditionalNamespaces...)
-		c.Maps[name] = spec
-	}
-}
-
-func (c *Configuration) setDefaults() {
-	c.ConfigUpdater.SetDefaults()
-
-	for repo, plugins := range c.ExternalPlugins {
-		for i, p := range plugins {
-			if p.Endpoint != "" {
-				continue
-			}
-			c.ExternalPlugins[repo][i].Endpoint = fmt.Sprintf("http://%s", p.Name)
-		}
-	}
-	if c.Blunderbuss.ReviewerCount == nil && c.Blunderbuss.FileWeightCount == nil {
-		c.Blunderbuss.ReviewerCount = new(int)
-		*c.Blunderbuss.ReviewerCount = defaultBlunderbussReviewerCount
-	}
-	for i, trigger := range c.Triggers {
-		if trigger.TrustedOrg == "" || trigger.JoinOrgURL != "" {
-			continue
-		}
-		c.Triggers[i].JoinOrgURL = fmt.Sprintf("https://github.com/orgs/%s/people", trigger.TrustedOrg)
-	}
-	if c.SigMention.Regexp == "" {
-		c.SigMention.Regexp = `(?m)@kubernetes/sig-([\w-]*)-(misc|test-failures|bugs|feature-requests|proposals|pr-reviews|api-reviews)`
-	}
-	if c.Owners.LabelsBlackList == nil {
-		c.Owners.LabelsBlackList = []string{labels.Approved, labels.LGTM}
-	}
-	for _, milestone := range c.RepoMilestone {
-		if milestone.MaintainersFriendlyName == "" {
-			milestone.MaintainersFriendlyName = "SIG Chairs/TLs"
-		}
-	}
-	if c.CherryPickUnapproved.BranchRegexp == "" {
-		c.CherryPickUnapproved.BranchRegexp = `^release-.*$`
-	}
-	if c.CherryPickUnapproved.Comment == "" {
-		c.CherryPickUnapproved.Comment = `This PR is not for the master branch but does not have the ` + "`cherry-pick-approved`" + `  label. Adding the ` + "`do-not-merge/cherry-pick-not-approved`" + `  label.
-
-To approve the cherry-pick, please assign the patch release manager for the release branch by writing ` + "`/assign @username`" + ` in a comment when ready.
-
-The list of patch release managers for each release can be found [here](https://git.k8s.io/sig-release/release-managers.md).`
-	}
-
-	for i, rml := range c.RequireMatchingLabel {
-		if rml.GracePeriod == "" {
-			c.RequireMatchingLabel[i].GracePeriod = "5s"
-		}
-	}
-}
-
-// validatePlugins will return error if
-// there are unknown or duplicated plugins.
-func validatePlugins(plugins map[string][]string) error {
-	var errors []string
-	for _, configuration := range plugins {
-		for _, plugin := range configuration {
-			if _, ok := pluginHelp[plugin]; !ok {
-				if failOnMissingPlugin {
-					errors = append(errors, fmt.Sprintf("unknown plugin: %s", plugin))
-				} else {
-					logrus.WithField("plugin", plugin).Warn("unknown plugin")
-				}
-			}
-		}
-	}
-	for repo, repoConfig := range plugins {
-		if strings.Contains(repo, "/") {
-			org := strings.Split(repo, "/")[0]
-			if dupes := findDuplicatedPluginConfig(repoConfig, plugins[org]); len(dupes) > 0 {
-				errors = append(errors, fmt.Sprintf("plugins %v are duplicated for %s and %s", dupes, repo, org))
-			}
-		}
-	}
-
-	if len(errors) > 0 {
-		return fmt.Errorf("invalid plugin configuration:\n\t%v", strings.Join(errors, "\n\t"))
-	}
-	return nil
-}
-
-func validateSizes(size Size) error {
-	if size.S > size.M || size.M > size.L || size.L > size.Xl || size.Xl > size.Xxl {
-		return errors.New("invalid size plugin configuration - one of the smaller sizes is bigger than a larger one")
-	}
-
-	return nil
-}
-
-func findDuplicatedPluginConfig(repoConfig, orgConfig []string) []string {
-	var dupes []string
-	for _, repoPlugin := range repoConfig {
-		for _, orgPlugin := range orgConfig {
-			if repoPlugin == orgPlugin {
-				dupes = append(dupes, repoPlugin)
-			}
-		}
-	}
-
-	return dupes
-}
-
-func validateExternalPlugins(pluginMap map[string][]ExternalPlugin) error {
-	var errors []string
-
-	for repo, plugins := range pluginMap {
-		if !strings.Contains(repo, "/") {
-			continue
-		}
-		org := strings.Split(repo, "/")[0]
-
-		var orgConfig []string
-		for _, p := range pluginMap[org] {
-			orgConfig = append(orgConfig, p.Name)
-		}
-
-		var repoConfig []string
-		for _, p := range plugins {
-			repoConfig = append(repoConfig, p.Name)
-		}
-
-		if dupes := findDuplicatedPluginConfig(repoConfig, orgConfig); len(dupes) > 0 {
-			errors = append(errors, fmt.Sprintf("external plugins %v are duplicated for %s and %s", dupes, repo, org))
-		}
-	}
-
-	if len(errors) > 0 {
-		return fmt.Errorf("invalid plugin configuration:\n\t%v", strings.Join(errors, "\n\t"))
-	}
-	return nil
-}
-
-func validateBlunderbuss(b *Blunderbuss) error {
-	if b.ReviewerCount != nil && b.FileWeightCount != nil {
-		return errors.New("cannot use both request_count and file_weight_count in blunderbuss")
-	}
-	if b.ReviewerCount != nil && *b.ReviewerCount < 1 {
-		return fmt.Errorf("invalid request_count: %v (needs to be positive)", *b.ReviewerCount)
-	}
-	if b.FileWeightCount != nil && *b.FileWeightCount < 1 {
-		return fmt.Errorf("invalid file_weight_count: %v (needs to be positive)", *b.FileWeightCount)
-	}
-	return nil
-}
-
-func validateConfigUpdater(updater *ConfigUpdater) error {
-	files := sets.NewString()
-	configMapKeys := map[string]sets.String{}
-	for file, config := range updater.Maps {
-		if files.Has(file) {
-			return fmt.Errorf("file %s listed more than once in config updater config", file)
-		}
-		files.Insert(file)
-
-		key := config.Key
-		if key == "" {
-			key = path.Base(file)
-		}
-
-		if _, ok := configMapKeys[config.Name]; ok {
-			if configMapKeys[config.Name].Has(key) {
-				return fmt.Errorf("key %s in configmap %s updated with more than one file", key, config.Name)
-			}
-			configMapKeys[config.Name].Insert(key)
-		} else {
-			configMapKeys[config.Name] = sets.NewString(key)
-		}
-	}
-	return nil
-}
-
-func validateRequireMatchingLabel(rs []RequireMatchingLabel) error {
-	for i, r := range rs {
-		if err := r.validate(); err != nil {
-			return fmt.Errorf("error validating require_matching_label config #%d: %v", i, err)
-		}
-	}
-	return nil
-}
-
-func compileRegexpsAndDurations(pc *Configuration) error {
-	cRe, err := regexp.Compile(pc.SigMention.Regexp)
-	if err != nil {
-		return err
-	}
-	pc.SigMention.Re = cRe
-
-	branchRe, err := regexp.Compile(pc.CherryPickUnapproved.BranchRegexp)
-	if err != nil {
-		return err
-	}
-	pc.CherryPickUnapproved.BranchRe = branchRe
-
-	commentRe, err := regexp.Compile(pc.Heart.CommentRegexp)
-	if err != nil {
-		return err
-	}
-	pc.Heart.CommentRe = commentRe
-
-	rs := pc.RequireMatchingLabel
-	for i := range rs {
-		re, err := regexp.Compile(rs[i].Regexp)
-		if err != nil {
-			return fmt.Errorf("failed to compile label regexp: %q, error: %v", rs[i].Regexp, err)
-		}
-		rs[i].Re = re
-
-		var dur time.Duration
-		dur, err = time.ParseDuration(rs[i].GracePeriod)
-		if err != nil {
-			return fmt.Errorf("failed to compile grace period duration: %q, error: %v", rs[i].GracePeriod, err)
-		}
-		rs[i].GracePeriodDuration = dur
-	}
-	return nil
-}
-
-// Validate validates the plugin configuration
-func (c *Configuration) Validate() error {
-	if len(c.Plugins) == 0 {
-		logrus.Warn("no plugins specified-- check syntax?")
-	}
-
-	// Defaulting should run before validation.
-	c.setDefaults()
-	// Regexp compilation should run after defaulting, but before validation.
-	if err := compileRegexpsAndDurations(c); err != nil {
-		return err
-	}
-
-	if err := validatePlugins(c.Plugins); err != nil {
-		return err
-	}
-	if err := validateExternalPlugins(c.ExternalPlugins); err != nil {
-		return err
-	}
-	if err := validateBlunderbuss(&c.Blunderbuss); err != nil {
-		return err
-	}
-	if err := validateConfigUpdater(&c.ConfigUpdater); err != nil {
-		return err
-	}
-	if err := validateSizes(c.Size); err != nil {
-		return err
-	}
-	if err := validateRequireMatchingLabel(c.RequireMatchingLabel); err != nil {
-		return err
-	}
-
-	return nil
-}
diff --git a/pkg/plugins/help/help.go b/pkg/plugins/help/help.go
index 6dbd33cb..5c703f12 100644
--- a/pkg/plugins/help/help.go
+++ b/pkg/plugins/help/help.go
@@ -21,7 +21,7 @@ import (
 	"strings"
 
 	"github.com/jenkins-x/go-scm/scm"
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/pluginhelp"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
diff --git a/pkg/plugins/hold/hold.go b/pkg/plugins/hold/hold.go
index 404edf58..207903da 100644
--- a/pkg/plugins/hold/hold.go
+++ b/pkg/plugins/hold/hold.go
@@ -28,7 +28,7 @@ import (
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
 	"github.com/sirupsen/logrus"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/pluginhelp"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 )
diff --git a/pkg/plugins/lgtm/lgtm.go b/pkg/plugins/lgtm/lgtm.go
index 12f9f3ef..988375c6 100644
--- a/pkg/plugins/lgtm/lgtm.go
+++ b/pkg/plugins/lgtm/lgtm.go
@@ -27,7 +27,7 @@ import (
 	"github.com/sirupsen/logrus"
 	"k8s.io/apimachinery/pkg/util/sets"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/pluginhelp"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 	"github.com/jenkins-x/lighthouse/pkg/repoowners"
diff --git a/pkg/plugins/lifecycle/lifecycle.go b/pkg/plugins/lifecycle/lifecycle.go
index 846b711d..ea75ea00 100644
--- a/pkg/plugins/lifecycle/lifecycle.go
+++ b/pkg/plugins/lifecycle/lifecycle.go
@@ -23,7 +23,7 @@ import (
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
 	"github.com/sirupsen/logrus"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/pluginhelp"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 )
diff --git a/pkg/plugins/plugins.go b/pkg/plugins/plugins.go
index cbecf31e..f068d3c1 100644
--- a/pkg/plugins/plugins.go
+++ b/pkg/plugins/plugins.go
@@ -240,6 +240,14 @@ func (pa *ConfigAgent) Load(path string) error {
 	if err := np.Validate(); err != nil {
 		return err
 	}
+	presentPlugins := make(map[string]interface{}, len(pluginHelp))
+	for k, v := range pluginHelp {
+		cp := v
+		presentPlugins[k] = &cp
+	}
+	if err := np.ValidatePluginsArePresent(presentPlugins); err != nil {
+		return err
+	}
 
 	pa.Set(np)
 	return nil
@@ -254,6 +262,14 @@ func (pa *ConfigAgent) LoadYAMLConfig(data []byte) (*Configuration, error) {
 	if err := c.Validate(); err != nil {
 		return c, err
 	}
+	presentPlugins := make(map[string]interface{}, len(pluginHelp))
+	for k, v := range pluginHelp {
+		cp := v
+		presentPlugins[k] = &cp
+	}
+	if err := c.ValidatePluginsArePresent(presentPlugins); err != nil {
+		return c, err
+	}
 	return c, nil
 }
 
diff --git a/pkg/plugins/shrug/shrug.go b/pkg/plugins/shrug/shrug.go
index c6a5b126..7022fa99 100644
--- a/pkg/plugins/shrug/shrug.go
+++ b/pkg/plugins/shrug/shrug.go
@@ -24,7 +24,7 @@ import (
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
 	"github.com/sirupsen/logrus"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/pluginhelp"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 )
diff --git a/pkg/plugins/sigmention/sigmention.go b/pkg/plugins/sigmention/sigmention.go
index 8251555d..19970521 100644
--- a/pkg/plugins/sigmention/sigmention.go
+++ b/pkg/plugins/sigmention/sigmention.go
@@ -25,7 +25,7 @@ import (
 	"strings"
 
 	"github.com/jenkins-x/go-scm/scm"
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/pluginhelp"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
diff --git a/pkg/plugins/trigger/generic-comment.go b/pkg/plugins/trigger/generic-comment.go
index 51333c82..7f9b4449 100644
--- a/pkg/plugins/trigger/generic-comment.go
+++ b/pkg/plugins/trigger/generic-comment.go
@@ -24,8 +24,8 @@ import (
 	"github.com/sirupsen/logrus"
 
 	"github.com/jenkins-x/lighthouse-config/pkg/config"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/jobutil"
-	"github.com/jenkins-x/lighthouse/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 	"k8s.io/apimachinery/pkg/util/sets"
 )
diff --git a/pkg/plugins/trigger/pull-request.go b/pkg/plugins/trigger/pull-request.go
index 77924ef8..cbde6b63 100644
--- a/pkg/plugins/trigger/pull-request.go
+++ b/pkg/plugins/trigger/pull-request.go
@@ -22,9 +22,9 @@ import (
 
 	"github.com/jenkins-x/go-scm/scm"
 	"github.com/jenkins-x/lighthouse-config/pkg/config"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/errorutil"
 	"github.com/jenkins-x/lighthouse/pkg/jobutil"
-	"github.com/jenkins-x/lighthouse/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
 )
diff --git a/pkg/plugins/types.go b/pkg/plugins/types.go
new file mode 100644
index 00000000..1d23afbd
--- /dev/null
+++ b/pkg/plugins/types.go
@@ -0,0 +1,76 @@
+package plugins
+
+import "github.com/jenkins-x/lighthouse-config/pkg/plugins"
+
+// This contains type aliases from lighthouse-config to simplify the transition here
+
+type (
+	// Configuration is an alias to the configuration type in lighthouse-config
+	Configuration = plugins.Configuration
+
+	// Approve is an alias to the type in lighthouse-config
+	Approve = plugins.Approve
+
+	// Blockade is an alias to the type in lighthouse-config
+	Blockade = plugins.Blockade
+
+	// Blunderbuss is an alias to the type in lighthouse-config
+	Blunderbuss = plugins.Blunderbuss
+
+	// Golint is an alias to the type in lighthouse-config
+	Golint = plugins.Golint
+
+	// ExternalPlugin is an alias to the type in lighthouse-config
+	ExternalPlugin = plugins.ExternalPlugin
+
+	// Owners is an alias to the type in lighthouse-config
+	Owners = plugins.Owners
+
+	// RequireSIG is an alias to the type in lighthouse-config
+	RequireSIG = plugins.RequireSIG
+
+	// SigMention is an alias to the type in lighthouse-config
+	SigMention = plugins.SigMention
+
+	// Size is an alias to the type in lighthouse-config
+	Size = plugins.Size
+
+	// Lgtm is an alias to the type in lighthouse-config
+	Lgtm = plugins.Lgtm
+
+	// Cat is an alias to the type in lighthouse-config
+	Cat = plugins.Cat
+
+	// Label is an alias to the type in lighthouse-config
+	Label = plugins.Label
+
+	// Trigger is an alias to the type in lighthouse-config
+	Trigger = plugins.Trigger
+
+	// Heart is an alias to the type in lighthouse-config
+	Heart = plugins.Heart
+
+	// Milestone is an alias to the type in lighthouse-config
+	Milestone = plugins.Milestone
+
+	// Slack is an alias to the type in lighthouse-config
+	Slack = plugins.Slack
+
+	// ConfigMapSpec is an alias to the type in lighthouse-config
+	ConfigMapSpec = plugins.ConfigMapSpec
+
+	// ConfigUpdate is an alias to the type in lighthouse-config
+	ConfigUpdate = plugins.ConfigUpdater
+
+	// MergeWarning is an alias to the type in lighthouse-config
+	MergeWarning = plugins.MergeWarning
+
+	// Welcome is an alias to the type in lighthouse-config
+	Welcome = plugins.Welcome
+
+	// CherryPickUnapproved is an alias to the type in lighthouse-config
+	CherryPickUnapproved = plugins.CherryPickUnapproved
+
+	// RequireMatchingLabel is an alias to the type in lighthouse-config
+	RequireMatchingLabel = plugins.RequireMatchingLabel
+)
diff --git a/pkg/plugins/wip/wip-label.go b/pkg/plugins/wip/wip-label.go
index e1beb033..c4142b4a 100644
--- a/pkg/plugins/wip/wip-label.go
+++ b/pkg/plugins/wip/wip-label.go
@@ -28,7 +28,7 @@ import (
 	"github.com/jenkins-x/go-scm/scm"
 	"github.com/sirupsen/logrus"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/pluginhelp"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 )


Test patch:
diff --git a/pkg/plugins/approve/approve_test.go b/pkg/plugins/approve/approve_test.go
index 355d14d2..f0a2ef72 100644
--- a/pkg/plugins/approve/approve_test.go
+++ b/pkg/plugins/approve/approve_test.go
@@ -32,7 +32,7 @@ import (
 
 	"sigs.k8s.io/yaml"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 	"github.com/jenkins-x/lighthouse/pkg/plugins/approve/approvers"
 	"github.com/jenkins-x/lighthouse/pkg/repoowners"
diff --git a/pkg/plugins/blockade/blockade_test.go b/pkg/plugins/blockade/blockade_test.go
index d99b51e3..fc1256a0 100644
--- a/pkg/plugins/blockade/blockade_test.go
+++ b/pkg/plugins/blockade/blockade_test.go
@@ -28,7 +28,7 @@ import (
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
 	"github.com/sirupsen/logrus"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 )
 
diff --git a/pkg/plugins/cherrypickunapproved/cherrypick-unapproved_test.go b/pkg/plugins/cherrypickunapproved/cherrypick-unapproved_test.go
index 190c869b..ff0f8225 100644
--- a/pkg/plugins/cherrypickunapproved/cherrypick-unapproved_test.go
+++ b/pkg/plugins/cherrypickunapproved/cherrypick-unapproved_test.go
@@ -24,7 +24,7 @@ import (
 	"github.com/jenkins-x/go-scm/scm"
 	"github.com/sirupsen/logrus"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 )
 
 type fakeClient struct {
diff --git a/pkg/plugins/config_test.go b/pkg/plugins/config_test.go
deleted file mode 100644
index 93f246f6..00000000
--- a/pkg/plugins/config_test.go
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
-Copyright 2018 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package plugins
-
-import (
-	"errors"
-	"reflect"
-	"testing"
-)
-
-func TestValidateExternalPlugins(t *testing.T) {
-	tests := []struct {
-		name        string
-		plugins     map[string][]ExternalPlugin
-		expectedErr error
-	}{
-		{
-			name: "valid config",
-			plugins: map[string][]ExternalPlugin{
-				"kubernetes/test-infra": {
-					{
-						Name: "cherrypick",
-					},
-					{
-						Name: "configupdater",
-					},
-					{
-						Name: "tetris",
-					},
-				},
-				"kubernetes": {
-					{
-						Name: "coffeemachine",
-					},
-					{
-						Name: "blender",
-					},
-				},
-			},
-			expectedErr: nil,
-		},
-		{
-			name: "invalid config",
-			plugins: map[string][]ExternalPlugin{
-				"kubernetes/test-infra": {
-					{
-						Name: "cherrypick",
-					},
-					{
-						Name: "configupdater",
-					},
-					{
-						Name: "tetris",
-					},
-				},
-				"kubernetes": {
-					{
-						Name: "coffeemachine",
-					},
-					{
-						Name: "tetris",
-					},
-				},
-			},
-			expectedErr: errors.New("invalid plugin configuration:\n\texternal plugins [tetris] are duplicated for kubernetes/test-infra and kubernetes"),
-		},
-	}
-
-	for _, test := range tests {
-		t.Logf("Running scenario %q", test.name)
-
-		err := validateExternalPlugins(test.plugins)
-		if !reflect.DeepEqual(err, test.expectedErr) {
-			t.Errorf("unexpected error: %v, expected: %v", err, test.expectedErr)
-		}
-	}
-}
-
-func TestSetDefault_Maps(t *testing.T) {
-	cases := []struct {
-		name     string
-		config   ConfigUpdater
-		expected map[string]ConfigMapSpec
-	}{
-		{
-			name: "nothing",
-			expected: map[string]ConfigMapSpec{
-				"prow/config.yaml":  {Name: "config", Namespaces: []string{""}},
-				"prow/plugins.yaml": {Name: "plugins", Namespaces: []string{""}},
-			},
-		},
-		{
-			name: "basic",
-			config: ConfigUpdater{
-				Maps: map[string]ConfigMapSpec{
-					"hello.yaml": {Name: "my-cm"},
-					"world.yaml": {Name: "you-cm"},
-				},
-			},
-			expected: map[string]ConfigMapSpec{
-				"hello.yaml": {Name: "my-cm", Namespaces: []string{""}},
-				"world.yaml": {Name: "you-cm", Namespaces: []string{""}},
-			},
-		},
-		{
-			name: "deprecated config",
-			config: ConfigUpdater{
-				ConfigFile: "foo.yaml",
-			},
-			expected: map[string]ConfigMapSpec{
-				"foo.yaml":          {Name: "config", Namespaces: []string{""}},
-				"prow/plugins.yaml": {Name: "plugins", Namespaces: []string{""}},
-			},
-		},
-		{
-			name: "deprecated plugins",
-			config: ConfigUpdater{
-				PluginFile: "bar.yaml",
-			},
-			expected: map[string]ConfigMapSpec{
-				"bar.yaml":         {Name: "plugins", Namespaces: []string{""}},
-				"prow/config.yaml": {Name: "config", Namespaces: []string{""}},
-			},
-		},
-		{
-			name: "deprecated both",
-			config: ConfigUpdater{
-				ConfigFile: "foo.yaml",
-				PluginFile: "bar.yaml",
-			},
-			expected: map[string]ConfigMapSpec{
-				"foo.yaml": {Name: "config", Namespaces: []string{""}},
-				"bar.yaml": {Name: "plugins", Namespaces: []string{""}},
-			},
-		},
-		{
-			name: "both current and deprecated",
-			config: ConfigUpdater{
-				Maps: map[string]ConfigMapSpec{
-					"config.yaml":        {Name: "overwrite-config"},
-					"plugins.yaml":       {Name: "overwrite-plugins"},
-					"unconflicting.yaml": {Name: "ignored"},
-				},
-				ConfigFile: "config.yaml",
-				PluginFile: "plugins.yaml",
-			},
-			expected: map[string]ConfigMapSpec{
-				"config.yaml":        {Name: "overwrite-config", Namespaces: []string{""}},
-				"plugins.yaml":       {Name: "overwrite-plugins", Namespaces: []string{""}},
-				"unconflicting.yaml": {Name: "ignored", Namespaces: []string{""}},
-			},
-		},
-	}
-	for _, tc := range cases {
-		cfg := Configuration{
-			ConfigUpdater: tc.config,
-		}
-		cfg.setDefaults()
-		actual := cfg.ConfigUpdater.Maps
-		if len(actual) != len(tc.expected) {
-			t.Errorf("%s: actual and expected have different keys: %v %v", tc.name, actual, tc.expected)
-			continue
-		}
-		for k, n := range tc.expected {
-			if an := actual[k]; !reflect.DeepEqual(an, n) {
-				t.Errorf("%s - %s: expected %s != actual %s", tc.name, k, n, an)
-			}
-		}
-	}
-}
-
-func TestSetTriggerDefaults(t *testing.T) {
-	tests := []struct {
-		name string
-
-		trustedOrg string
-		joinOrgURL string
-
-		expectedTrustedOrg string
-		expectedJoinOrgURL string
-	}{
-		{
-			name: "url defaults to org",
-
-			trustedOrg: "kubernetes",
-			joinOrgURL: "",
-
-			expectedTrustedOrg: "kubernetes",
-			expectedJoinOrgURL: "https://github.com/orgs/kubernetes/people",
-		},
-		{
-			name: "both org and url are set",
-
-			trustedOrg: "kubernetes",
-			joinOrgURL: "https://git.k8s.io/community/community-membership.md#member",
-
-			expectedTrustedOrg: "kubernetes",
-			expectedJoinOrgURL: "https://git.k8s.io/community/community-membership.md#member",
-		},
-		{
-			name: "only url is set",
-
-			trustedOrg: "",
-			joinOrgURL: "https://git.k8s.io/community/community-membership.md#member",
-
-			expectedTrustedOrg: "",
-			expectedJoinOrgURL: "https://git.k8s.io/community/community-membership.md#member",
-		},
-		{
-			name: "nothing is set",
-
-			trustedOrg: "",
-			joinOrgURL: "",
-
-			expectedTrustedOrg: "",
-			expectedJoinOrgURL: "",
-		},
-	}
-
-	for _, test := range tests {
-		c := &Configuration{
-			Triggers: []Trigger{
-				{
-					TrustedOrg: test.trustedOrg,
-					JoinOrgURL: test.joinOrgURL,
-				},
-			},
-		}
-
-		c.setDefaults()
-
-		if c.Triggers[0].TrustedOrg != test.expectedTrustedOrg {
-			t.Errorf("unexpected trusted_org: %s, expected: %s", c.Triggers[0].TrustedOrg, test.expectedTrustedOrg)
-		}
-		if c.Triggers[0].JoinOrgURL != test.expectedJoinOrgURL {
-			t.Errorf("unexpected join_org_url: %s, expected: %s", c.Triggers[0].JoinOrgURL, test.expectedJoinOrgURL)
-		}
-	}
-}
-
-func TestSetCherryPickUnapprovedDefaults(t *testing.T) {
-	defaultBranchRegexp := `^release-.*$`
-	defaultComment := `This PR is not for the master branch but does not have the ` + "`cherry-pick-approved`" + `  label. Adding the ` + "`do-not-merge/cherry-pick-not-approved`" + `  label.
-
-To approve the cherry-pick, please assign the patch release manager for the release branch by writing ` + "`/assign @username`" + ` in a comment when ready.
-
-The list of patch release managers for each release can be found [here](https://git.k8s.io/sig-release/release-managers.md).`
-
-	testcases := []struct {
-		name string
-
-		branchRegexp string
-		comment      string
-
-		expectedBranchRegexp string
-		expectedComment      string
-	}{
-		{
-			name:                 "none of branchRegexp and comment are set",
-			branchRegexp:         "",
-			comment:              "",
-			expectedBranchRegexp: defaultBranchRegexp,
-			expectedComment:      defaultComment,
-		},
-		{
-			name:                 "only branchRegexp is set",
-			branchRegexp:         `release-1.1.*$`,
-			comment:              "",
-			expectedBranchRegexp: `release-1.1.*$`,
-			expectedComment:      defaultComment,
-		},
-		{
-			name:                 "only comment is set",
-			branchRegexp:         "",
-			comment:              "custom comment",
-			expectedBranchRegexp: defaultBranchRegexp,
-			expectedComment:      "custom comment",
-		},
-		{
-			name:                 "both branchRegexp and comment are set",
-			branchRegexp:         `release-1.1.*$`,
-			comment:              "custom comment",
-			expectedBranchRegexp: `release-1.1.*$`,
-			expectedComment:      "custom comment",
-		},
-	}
-
-	for _, tc := range testcases {
-		c := &Configuration{
-			CherryPickUnapproved: CherryPickUnapproved{
-				BranchRegexp: tc.branchRegexp,
-				Comment:      tc.comment,
-			},
-		}
-
-		c.setDefaults()
-
-		if c.CherryPickUnapproved.BranchRegexp != tc.expectedBranchRegexp {
-			t.Errorf("unexpected branchRegexp: %s, expected: %s", c.CherryPickUnapproved.BranchRegexp, tc.expectedBranchRegexp)
-		}
-		if c.CherryPickUnapproved.Comment != tc.expectedComment {
-			t.Errorf("unexpected comment: %s, expected: %s", c.CherryPickUnapproved.Comment, tc.expectedComment)
-		}
-	}
-}
diff --git a/pkg/plugins/help/help_test.go b/pkg/plugins/help/help_test.go
index 3daf9ff9..e2f350e2 100644
--- a/pkg/plugins/help/help_test.go
+++ b/pkg/plugins/help/help_test.go
@@ -24,7 +24,7 @@ import (
 
 	"github.com/jenkins-x/go-scm/scm"
 	"github.com/jenkins-x/go-scm/scm/driver/fake"
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
 	"github.com/sirupsen/logrus"
 )
diff --git a/pkg/plugins/hold/hold_test.go b/pkg/plugins/hold/hold_test.go
index d95aa612..74b3a972 100644
--- a/pkg/plugins/hold/hold_test.go
+++ b/pkg/plugins/hold/hold_test.go
@@ -25,7 +25,7 @@ import (
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
 	"github.com/sirupsen/logrus"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 )
 
 func TestHandle(t *testing.T) {
diff --git a/pkg/plugins/label/label_test.go b/pkg/plugins/label/label_test.go
index 4bd19bfd..ba6bcd87 100644
--- a/pkg/plugins/label/label_test.go
+++ b/pkg/plugins/label/label_test.go
@@ -25,7 +25,7 @@ import (
 
 	"github.com/jenkins-x/go-scm/scm"
 	"github.com/jenkins-x/go-scm/scm/driver/fake"
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
 	"github.com/sirupsen/logrus"
diff --git a/pkg/plugins/lifecycle/lifecycle_test.go b/pkg/plugins/lifecycle/lifecycle_test.go
index 4a6517d9..4ae38acb 100644
--- a/pkg/plugins/lifecycle/lifecycle_test.go
+++ b/pkg/plugins/lifecycle/lifecycle_test.go
@@ -24,7 +24,7 @@ import (
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
 	"github.com/sirupsen/logrus"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 )
 
 type fakeClient struct {
diff --git a/pkg/plugins/owners-label/owners-label_test.go b/pkg/plugins/owners-label/owners-label_test.go
index 390960a5..22043cc4 100644
--- a/pkg/plugins/owners-label/owners-label_test.go
+++ b/pkg/plugins/owners-label/owners-label_test.go
@@ -27,7 +27,7 @@ import (
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
 	"github.com/sirupsen/logrus"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"k8s.io/apimachinery/pkg/util/sets"
 )
 
diff --git a/pkg/plugins/shrug/shurg_test.go b/pkg/plugins/shrug/shurg_test.go
index 7f7db27b..b090ab8f 100644
--- a/pkg/plugins/shrug/shurg_test.go
+++ b/pkg/plugins/shrug/shurg_test.go
@@ -24,7 +24,7 @@ import (
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
 	"github.com/sirupsen/logrus"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 )
 
 func TestShrugComment(t *testing.T) {
diff --git a/pkg/plugins/sigmention/sigmention_test.go b/pkg/plugins/sigmention/sigmention_test.go
index 3e86d404..520825f7 100644
--- a/pkg/plugins/sigmention/sigmention_test.go
+++ b/pkg/plugins/sigmention/sigmention_test.go
@@ -29,7 +29,7 @@ import (
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider/fake"
 	"github.com/sirupsen/logrus"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 )
 
 func formatLabels(labels []string) []string {
diff --git a/pkg/plugins/trigger/generic-comment_test.go b/pkg/plugins/trigger/generic-comment_test.go
index 5928bd5e..bb8a9dfd 100644
--- a/pkg/plugins/trigger/generic-comment_test.go
+++ b/pkg/plugins/trigger/generic-comment_test.go
@@ -24,8 +24,8 @@ import (
 
 	"github.com/jenkins-x/go-scm/scm"
 	"github.com/jenkins-x/lighthouse-config/pkg/config"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/jobutil"
-	"github.com/jenkins-x/lighthouse/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/launcher/fake"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
diff --git a/pkg/plugins/trigger/pull-request_test.go b/pkg/plugins/trigger/pull-request_test.go
index f391e908..0a2a5465 100644
--- a/pkg/plugins/trigger/pull-request_test.go
+++ b/pkg/plugins/trigger/pull-request_test.go
@@ -21,7 +21,7 @@ import (
 
 	"github.com/jenkins-x/go-scm/scm"
 	"github.com/jenkins-x/lighthouse-config/pkg/config"
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/jenkins-x/lighthouse/pkg/launcher/fake"
 	"github.com/jenkins-x/lighthouse/pkg/plugins"
 	fake2 "github.com/jenkins-x/lighthouse/pkg/scmprovider/fake"
diff --git a/pkg/plugins/wip/wip-label_test.go b/pkg/plugins/wip/wip-label_test.go
index 86580758..52e9de92 100644
--- a/pkg/plugins/wip/wip-label_test.go
+++ b/pkg/plugins/wip/wip-label_test.go
@@ -25,7 +25,7 @@ import (
 	"github.com/jenkins-x/lighthouse/pkg/scmprovider"
 	"github.com/sirupsen/logrus"
 
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 )
 
 func TestWipLabel(t *testing.T) {
diff --git a/pkg/scmprovider/test_helpers.go b/pkg/scmprovider/test_helpers.go
index 947ee98a..0fa731e3 100644
--- a/pkg/scmprovider/test_helpers.go
+++ b/pkg/scmprovider/test_helpers.go
@@ -3,7 +3,7 @@ package scmprovider
 import (
 	"github.com/jenkins-x/go-scm/scm"
 	"github.com/jenkins-x/go-scm/scm/driver/fake"
-	"github.com/jenkins-x/lighthouse/pkg/labels"
+	"github.com/jenkins-x/lighthouse-config/pkg/labels"
 	"github.com/pkg/errors"
 )