Add Go linting stage to CI

rustfmt appears to be a little more complicated since it wants to
download dependencies and needs nightly Rust.

Change-Id: Ia348def30a6459ae2ab6c29a8c3a413216f5eb4b
This commit is contained in:
Leo 2021-08-30 20:40:38 +02:00 committed by Leopold Schabel
parent c00eef279b
commit 9a85dbafe5
11 changed files with 67 additions and 28 deletions

12
Dockerfile.lint Normal file
View File

@ -0,0 +1,12 @@
# syntax=docker.io/docker/dockerfile:experimental@sha256:de85b2f3a3e8a2f7fe48e8e84a65f6fdd5cd5183afa6412fff9caa6871649c44
FROM docker.io/golang:1.17.0@sha256:06e92e576fc7a7067a268d47727f3083c0a564331bfcbfdde633157fc91fb17d AS go
RUN useradd -u 1000 -U -m -d /home/lint lint
USER 1000
WORKDIR /home/lint
RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | \
sh -s -- -b ~ v1.42.0
RUN --mount=type=bind,target=/app,source=node cd /app && \
GOGC=off ~/golangci-lint run --skip-dirs pkg/supervisor ./...

View File

@ -4,6 +4,7 @@ pipeline {
agent none agent none
stages { stages {
stage('Parallel') { stage('Parallel') {
failFast true
parallel { parallel {
stage('Test') { stage('Test') {
agent { agent {
@ -35,11 +36,9 @@ pipeline {
} }
post { post {
success { success {
gerritReview labels: [Verified: 1]
gerritCheck checks: ['jenkins:test': 'SUCCESSFUL'] gerritCheck checks: ['jenkins:test': 'SUCCESSFUL']
} }
unsuccessful { unsuccessful {
gerritReview labels: [Verified: -1]
gerritCheck checks: ['jenkins:test': 'FAILED'] gerritCheck checks: ['jenkins:test': 'FAILED']
} }
cleanup { cleanup {
@ -47,6 +46,40 @@ pipeline {
} }
} }
} }
stage('Lint') {
agent {
node {
label ""
customWorkspace '/home/ci/wormhole'
}
}
steps {
gerritCheck checks: ['jenkins:linters': 'RUNNING'], message: "Running on ${env.NODE_NAME}"
echo "Gerrit change: ${GERRIT_CHANGE_URL}"
timeout(time: 1, unit: 'MINUTES') {
sh "make generate"
sh "./lint.sh"
}
}
post {
success {
gerritCheck checks: ['jenkins:linters': 'SUCCESSFUL']
}
unsuccessful {
gerritCheck checks: ['jenkins:linters': 'FAILED']
}
}
}
}
post {
success {
gerritReview labels: [Verified: 1]
}
unsuccessful {
gerritReview labels: [Verified: -1]
}
} }
} }
} }

3
lint.sh Executable file
View File

@ -0,0 +1,3 @@
#!/usr/bin/env bash
DOCKER_BUILDKIT=1 tilt docker build -- -f Dockerfile.lint .

View File

@ -65,9 +65,9 @@ func runListNodes(cmd *cobra.Command, args []string) {
w := tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', 0) w := tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', 0)
if showDetails { if showDetails {
w.Write([]byte("Node key\tGuardian key\tNode name\tVersion\tLast seen\tUptime\tSolana\tEthereum\tTerra\tBSC\n")) _, _ = w.Write([]byte("Node key\tGuardian key\tNode name\tVersion\tLast seen\tUptime\tSolana\tEthereum\tTerra\tBSC\n"))
} else { } else {
w.Write([]byte("Node key\tGuardian key\tNode name\tVersion\tLast seen\tSolana\tEthereum\tTerra\tBSC\n")) _, _ = w.Write([]byte("Node key\tGuardian key\tNode name\tVersion\tLast seen\tSolana\tEthereum\tTerra\tBSC\n"))
} }
for _, h := range nodes { for _, h := range nodes {

View File

@ -158,6 +158,9 @@ func adminServiceRunnable(logger *zap.Logger, socketPath string, injectC chan<-
// The umask avoids a race condition between file creation and chmod. // The umask avoids a race condition between file creation and chmod.
laddr, err := net.ResolveUnixAddr("unix", socketPath) laddr, err := net.ResolveUnixAddr("unix", socketPath)
if err != nil {
return nil, fmt.Errorf("invalid listen address: %v", err)
}
l, err := net.ListenUnix("unix", laddr) l, err := net.ListenUnix("unix", laddr)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to listen on %s: %w", socketPath, err) return nil, fmt.Errorf("failed to listen on %s: %w", socketPath, err)

View File

@ -536,18 +536,14 @@ func runNode(cmd *cobra.Command, args []string) {
logger.Info("Started internal services") logger.Info("Started internal services")
select { <-ctx.Done()
case <-ctx.Done():
return nil return nil
}
}, },
// It's safer to crash and restart the process in case we encounter a panic, // It's safer to crash and restart the process in case we encounter a panic,
// rather than attempting to reschedule the runnable. // rather than attempting to reschedule the runnable.
supervisor.WithPropagatePanic) supervisor.WithPropagatePanic)
select { <-rootCtx.Done()
case <-rootCtx.Done():
logger.Info("root context cancelled, exiting...") logger.Info("root context cancelled, exiting...")
// TODO: wait for things to shut down gracefully // TODO: wait for things to shut down gracefully
}
} }

View File

@ -82,7 +82,7 @@ func GetKeyedTransactor(ctx context.Context) *bind.TransactOpts {
panic(err) panic(err)
} }
kt := bind.NewKeyedTransactor(key) kt := bind.NewKeyedTransactor(key) // nolint
kt.Context = ctx kt.Context = ctx
return kt return kt

View File

@ -49,7 +49,7 @@ func (p *Processor) handleCleanup(ctx context.Context) {
aggregationStateEntries.Set(float64(len(p.state.vaaSignatures))) aggregationStateEntries.Set(float64(len(p.state.vaaSignatures)))
for hash, s := range p.state.vaaSignatures { for hash, s := range p.state.vaaSignatures {
delta := time.Now().Sub(s.firstObserved) delta := time.Since(s.firstObserved)
switch { switch {
case !s.settled && delta.Seconds() >= 30: case !s.settled && delta.Seconds() >= 30:

View File

@ -39,16 +39,6 @@ var (
Name: "wormhole_observations_unknown_total", Name: "wormhole_observations_unknown_total",
Help: "Total number of verified observations we haven't seen ourselves", Help: "Total number of verified observations we haven't seen ourselves",
}) })
observationsDirectSubmissionsTotal = promauto.NewCounterVec(
prometheus.CounterOpts{
Name: "wormhole_observations_direct_submissions_queued_total",
Help: "Total number of observations for a specific target chain that were queued for direct submission",
}, []string{"target_chain"})
observationsDirectSubmissionSuccessTotal = promauto.NewCounterVec(
prometheus.CounterOpts{
Name: "wormhole_observations_direct_submission_success_total",
Help: "Total number of observations for a specific target chain that succeeded",
}, []string{"target_chain"})
) )
// handleObservation processes a remote VAA observation, verifies it, checks whether the VAA has met quorum, // handleObservation processes a remote VAA observation, verifies it, checks whether the VAA has met quorum,

View File

@ -55,7 +55,7 @@ func Handler(w http.ResponseWriter, r *http.Request) {
mu.Lock() mu.Lock()
for k, v := range registry { for k, v := range registry {
_, err = fmt.Fprintln(resp, fmt.Sprintf("%s\t%v", k, v)) _, err = fmt.Fprintf(resp, "%s\t%v\n", k, v)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@ -562,11 +562,13 @@ fn handle_initiate_transfer<S: Storage, A: Api, Q: Querier>(
amount = Uint128( amount = Uint128(
amount amount
.u128() .u128()
.checked_sub(amount.u128().checked_rem(multiplier).unwrap()).unwrap(), .checked_sub(amount.u128().checked_rem(multiplier).unwrap())
.unwrap(),
); );
fee = Uint128( fee = Uint128(
fee.u128() fee.u128()
.checked_sub(fee.u128().checked_rem(multiplier).unwrap()).unwrap(), .checked_sub(fee.u128().checked_rem(multiplier).unwrap())
.unwrap(),
); );
// This is a regular asset, transfer its balance // This is a regular asset, transfer its balance