Skip to content

Commit

Permalink
Add CI
Browse files Browse the repository at this point in the history
  • Loading branch information
liggitt committed Oct 14, 2021
1 parent abbb928 commit 9462388
Show file tree
Hide file tree
Showing 3 changed files with 227 additions and 0 deletions.
67 changes: 67 additions & 0 deletions .github/workflows/ci.yml
@@ -0,0 +1,67 @@
name: ci-pipeline

on:
push:
branches: [ "*" ]
pull_request:
branches: [ "*" ]

jobs:

ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
path: src/sigs.k8s.io/json/

- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: "1.x"
stable: true

- name: Test
run: |
cd ${GITHUB_WORKSPACE}/src/sigs.k8s.io/json/
make test
- name: Benchmark
run: |
cd ${GITHUB_WORKSPACE}/src/sigs.k8s.io/json/
make benchmark
- name: Vet
run: |
cd ${GITHUB_WORKSPACE}/src/sigs.k8s.io/json/
make vet
- name: fmt
run: |
cd ${GITHUB_WORKSPACE}/src/sigs.k8s.io/json/
make fmt
git diff --exit-code
apidiff:
runs-on: ubuntu-latest
if: github.base_ref
steps:
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: '1.x'
- name: Add GOBIN to PATH
run: echo "$(go env GOPATH)/bin" >> $GITHUB_PATH
- name: Install dependencies
run: go get golang.org/x/exp/cmd/apidiff
- name: Checkout old code
uses: actions/checkout@v2
with:
ref: ${{ github.base_ref }}
path: "old"
- name: Checkout new code
uses: actions/checkout@v2
with:
path: "new"
- name: APIDiff
run: ./hack/verify-apidiff.sh -d ../old
working-directory: "new"


35 changes: 35 additions & 0 deletions Makefile
@@ -0,0 +1,35 @@
.PHONY: default build test benchmark fmt vet

default: build

build:
go build ./...

test:
go test sigs.k8s.io/json/...

benchmark:
go test sigs.k8s.io/json -bench . -benchmem

fmt:
go mod tidy
gofmt -s -w *.go

vet:
go vet sigs.k8s.io/json

@echo "checking for external dependencies"
@deps=$$(go mod graph); \
if [ -n "$${deps}" ]; then \
echo "only stdlib dependencies allowed, found:"; \
echo "$${deps}"; \
exit 1; \
fi

@echo "checking for unsafe use"
@unsafe=$$(go list -f '{{.ImportPath}} depends on {{.Imports}}' sigs.k8s.io/json/... | grep unsafe || true); \
if [ -n "$${unsafe}" ]; then \
echo "no dependencies on unsafe allowed, found:"; \
echo "$${unsafe}"; \
exit 1; \
fi
125 changes: 125 additions & 0 deletions hack/verify-apidiff.sh
@@ -0,0 +1,125 @@
#!/usr/bin/env bash

# Copyright 2021 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.

set -o errexit
set -o nounset
set -o pipefail

function usage {
local script="$(basename $0)"

echo >&2 "Usage: ${script} [-r <branch|tag> | -d <dir>]
This script should be run at the root of a module.
-r <branch|tag>
Compare the exported API of the local working copy with the
exported API of the local repo at the specified branch or tag.
-d <dir>
Compare the exported API of the local working copy with the
exported API of the specified directory, which should point
to the root of a different version of the same module.
Examples:
${script} -r master
${script} -r v1.10.0
${script} -r release-1.10
${script} -d /path/to/historical/version
"
exit 1
}

ref=""
dir=""
while getopts r:d: o
do case "$o" in
r) ref="$OPTARG";;
d) dir="$OPTARG";;
[?]) usage;;
esac
done

# If REF and DIR are empty, print usage and error
if [[ -z "${ref}" && -z "${dir}" ]]; then
usage;
fi
# If REF and DIR are both set, print usage and error
if [[ -n "${ref}" && -n "${dir}" ]]; then
usage;
fi

if ! which apidiff > /dev/null; then
echo "Installing golang.org/x/exp/cmd/apidiff..."
pushd "${TMPDIR:-/tmp}" > /dev/null
go get golang.org/x/exp/cmd/apidiff
popd > /dev/null
fi

output=$(mktemp -d -t "apidiff.output.XXXX")
cleanup_output () { rm -fr "${output}"; }
trap cleanup_output EXIT

# If ref is set, clone . to temp dir at $ref, and set $dir to the temp dir
clone=""
base="${dir}"
if [[ -n "${ref}" ]]; then
base="${ref}"
clone=$(mktemp -d -t "apidiff.clone.XXXX")
cleanup_clone_and_output () { rm -fr "${clone}"; cleanup_output; }
trap cleanup_clone_and_output EXIT
git clone . -q --no-tags -b "${ref}" "${clone}"
dir="${clone}"
fi

pushd "${dir}" >/dev/null
echo "Inspecting API of '${base}'..."
go list . > "${output}/packages.txt"
for pkg in $(cat ${output}/packages.txt); do
mkdir -p "${output}/${pkg}"
apidiff -w "${output}/${pkg}/apidiff.output" "${pkg}"
done
popd >/dev/null

retval=0

echo "Comparing with '${base}'..."
for pkg in $(go list .); do
# New packages are ok
if [ ! -f "${output}/${pkg}/apidiff.output" ]; then
continue
fi

# Check for incompatible changes to previous packages
incompatible=$(apidiff -incompatible "${output}/${pkg}/apidiff.output" "${pkg}")
if [[ -n "${incompatible}" ]]; then
echo >&2 "FAIL: ${pkg} contains incompatible changes:
${incompatible}
"
retval=1
fi
done

# Check for removed packages
removed=$(comm -23 "${output}/packages.txt" <(go list .))
if [[ -n "${removed}" ]]; then
echo >&2 "FAIL: removed packages:
${removed}
"
retval=1
fi

exit $retval

0 comments on commit 9462388

Please sign in to comment.