Skip to content

Commit

Permalink
feat: use GH Actions and separate Dockerfiles
Browse files Browse the repository at this point in the history
  • Loading branch information
BobyMCbobs committed Jul 18, 2023
1 parent ff2e950 commit 42b3326
Show file tree
Hide file tree
Showing 7 changed files with 266 additions and 6 deletions.
101 changes: 101 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
name: build
on:
push: {}
release:
types: [published]
workflow_dispatch: {}
permissions:
packages: write
contents: write
pull-requests: write
id-token: write
env:
FOLDER: ./cmd
# doesn't have an ECR by that name; EXCLUDE is regex and is '|' separated (e.g: a|b|c)
EXCLUDE: s3-notify
jobs:
prepare:
runs-on: ubuntu-latest
outputs:
git-rev: ${{ steps.git-rev.outputs.git-rev }}
matrix: ${{ steps.set.outputs.matrix }}
steps:
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
- uses: GeoNet/yq@bbe305500687a5fe8498d74883c17f0f06431ac4 # master
- id: git-rev
env:
GIT_SHA: ${{ github.sha }}
run: |
echo "git-rev=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
- id: set
run: |
echo "matrix=$(find $FOLDER -mindepth 1 -maxdepth 1 -type d | grep -Ewv "$EXCLUDE" - | xargs -n 1 basename | xargs | yq 'split(" ")|.[]|{"target":.,"folder":env(FOLDER)+"/"+.}' -ojson | jq -rcM -s '{"include":.}')" >> $GITHUB_OUTPUT
- name: check output
run: |
jq . <<< '${{ steps.set.outputs.matrix }}'
build:
needs: prepare
strategy:
matrix: ${{ fromJSON(needs.prepare.outputs.matrix) }}
uses: GeoNet/Actions/.github/workflows/reusable-docker-build.yml@main
with:
context: .
dockerfile: ${{ fromJSON(toJSON(matrix)).folder }}/Dockerfile
imageName: ${{ fromJSON(toJSON(matrix)).target }}
platforms: linux/amd64
push: ${{ github.ref == 'refs/heads/main' }}
tags: latest,git-${{ needs.prepare.outputs.git-rev }}
registryOverride: 862640294325.dkr.ecr.ap-southeast-2.amazonaws.com
aws-region: ap-southeast-2
aws-role-arn-to-assume: arn:aws:iam::862640294325:role/github-actions-geonet-ecr-push
aws-role-duration-seconds: "3600"
go-build:
if: ${{ contains(fromJSON('["workflow_call", "push", "pull_request"]'), github.event_name) && startsWith(github.repository, 'GeoNet/') != false }}
uses: GeoNet/Actions/.github/workflows/reusable-go-build-smoke-test.yml@main
with:
paths: ${{ inputs.paths }}
gofmt:
if: ${{ contains(fromJSON('["workflow_call", "push", "pull_request"]'), github.event_name) && startsWith(github.repository, 'GeoNet/') != false }}
uses: GeoNet/Actions/.github/workflows/reusable-gofmt.yml@main
golangci-lint:
if: ${{ contains(fromJSON('["workflow_call", "push", "pull_request"]'), github.event_name) && startsWith(github.repository, 'GeoNet/') != false }}
uses: GeoNet/Actions/.github/workflows/reusable-golangci-lint.yml@main
go-vet:
if: ${{ contains(fromJSON('["workflow_call", "push", "pull_request"]'), github.event_name) && startsWith(github.repository, 'GeoNet/') != false }}
uses: GeoNet/Actions/.github/workflows/reusable-go-vet.yml@main
go-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
with:
go-version-file: go.mod
cache-dependency-path: go.sum
check-latest: true
- name: setup
run: |
sudo apt-get -yq update
sudo apt-get install -y xsltproc
docker \
run -d \
-p 5432:5432 \
-e POSTGRES_PASSWORD=test \
-e POSTGRES_USER=fdsn_w \
-e POSTGRES_DB=fdsn \
--name postgres \
docker.io/postgis/postgis:15-3.3-alpine
echo "Waiting until Postgres is ready..."
until nc -zv -w 1 127.0.0.1 5432; do
sleep 1s
done
sleep 5s
docker logs postgres
echo "Postgres is ready"
psql postgresql://fdsn_w:[email protected]/fdsn --file=./etc/ddl/drop-create.ddl
psql postgresql://fdsn_w:[email protected]/fdsn --file=./etc/ddl/create-users.ddl
- name: test
id: test
env:
AWS_REGION: ap-southeast-2
run: |
./all.sh
40 changes: 40 additions & 0 deletions cmd/fdsn-holdings-consumer/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
ARG BUILDER_IMAGE=ghcr.io/geonet/base-images/go:1.16
ARG RUNNER_IMAGE=ghcr.io/geonet/base-images/static:latest
ARG RUN_USER=nobody
# Only support image based on AlpineLinux
FROM ${BUILDER_IMAGE} as builder

# Project to build
ARG BUILD=fdsn-holdings-consumer

# Git commit SHA
ARG GIT_COMMIT_SHA

WORKDIR /repo
COPY go.* *.go /repo
RUN go mod download
COPY internal /repo/internal
COPY vendor /repo/vendor
COPY cmd/$BUILD /repo/cmd/$BUILD

# Set a bunch of go env flags
ENV GOBIN /repo/gobin
ENV GOFLAGS -mod=vendor
ENV CGO_ENABLED=0
RUN go install -a -ldflags "-X main.Prefix=${BUILD}/${GIT_COMMIT_SHA} -extldflags -static" /repo/cmd/${BUILD}

FROM ${RUNNER_IMAGE}
# Export a port, default to 8080
ARG EXPOSE_PORT=8080
EXPOSE $EXPOSE_PORT
ARG BUILD
# Need to make this an env for it to be interpolated by the shell
ENV TZ Pacific/Auckland
ENV BUILD_BIN=${BUILD}
# We have to make our binary have a fixed name, otherwise, we cannot run it without a shell
COPY --from=builder /repo/gobin/${BUILD} /${BUILD}
# Copy the assets
ARG ASSET_DIR
COPY ${ASSET_DIR} /assets
USER nobody
CMD ["/fdsn-holdings-consumer"]
2 changes: 1 addition & 1 deletion cmd/fdsn-quake-consumer/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
ARG BUILDER_IMAGE=quay.io/geonet/golang:1.16-alpine
ARG BUILDER_IMAGE=ghcr.io/geonet/base-images/go:1.16

FROM ${BUILDER_IMAGE} as builder
# Obtain ca-cert and tzdata, which we will add to the container
Expand Down
40 changes: 40 additions & 0 deletions cmd/fdsn-slink-db/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
ARG BUILDER_IMAGE=ghcr.io/geonet/base-images/go:1.16
ARG RUNNER_IMAGE=ghcr.io/geonet/base-images/static:latest
ARG RUN_USER=nobody
# Only support image based on AlpineLinux
FROM ${BUILDER_IMAGE} as builder

# Project to build
ARG BUILD=fdsn-slink-db

# Git commit SHA
ARG GIT_COMMIT_SHA

WORKDIR /repo
COPY go.* *.go /repo
RUN go mod download
COPY internal /repo/internal
COPY vendor /repo/vendor
COPY cmd/$BUILD /repo/cmd/$BUILD

# Set a bunch of go env flags
ENV GOBIN /repo/gobin
ENV GOFLAGS -mod=vendor
ENV CGO_ENABLED=0
RUN go install -a -ldflags "-X main.Prefix=${BUILD}/${GIT_COMMIT_SHA} -extldflags -static" /repo/cmd/${BUILD}

FROM ${RUNNER_IMAGE}
# Export a port, default to 8080
ARG EXPOSE_PORT=8080
EXPOSE $EXPOSE_PORT
ARG BUILD
# Need to make this an env for it to be interpolated by the shell
ENV TZ Pacific/Auckland
ENV BUILD_BIN=${BUILD}
# We have to make our binary have a fixed name, otherwise, we cannot run it without a shell
COPY --from=builder /repo/gobin/${BUILD} /${BUILD}
# Copy the assets
ARG ASSET_DIR
COPY ${ASSET_DIR} /assets
USER nobody
CMD ["/fdsn-slink-db"]
40 changes: 40 additions & 0 deletions cmd/fdsn-ws-nrt/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
ARG BUILDER_IMAGE=ghcr.io/geonet/base-images/go:1.16
ARG RUNNER_IMAGE=ghcr.io/geonet/base-images/static:latest
ARG RUN_USER=nobody
# Only support image based on AlpineLinux
FROM ${BUILDER_IMAGE} as builder

# Project to build
ARG BUILD=fdsn-ws-nrt

# Git commit SHA
ARG GIT_COMMIT_SHA

WORKDIR /repo
COPY go.* *.go /repo
RUN go mod download
COPY internal /repo/internal
COPY vendor /repo/vendor
COPY cmd/$BUILD /repo/cmd/$BUILD

# Set a bunch of go env flags
ENV GOBIN /repo/gobin
ENV GOFLAGS -mod=vendor
ENV CGO_ENABLED=0
RUN go install -a -ldflags "-X main.Prefix=${BUILD}/${GIT_COMMIT_SHA} -extldflags -static" /repo/cmd/${BUILD}

FROM ${RUNNER_IMAGE}
# Export a port, default to 8080
ARG EXPOSE_PORT=8080
EXPOSE $EXPOSE_PORT
ARG BUILD
# Need to make this an env for it to be interpolated by the shell
ENV TZ Pacific/Auckland
ENV BUILD_BIN=${BUILD}
# We have to make our binary have a fixed name, otherwise, we cannot run it without a shell
COPY --from=builder /repo/gobin/${BUILD} /${BUILD}
# Copy the assets
ARG ASSET_DIR
COPY ${ASSET_DIR} /assets
USER nobody
CMD ["/fdsn-ws-nrt"]
40 changes: 40 additions & 0 deletions cmd/fdsn-ws/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
ARG BUILDER_IMAGE=ghcr.io/geonet/base-images/go:1.16
ARG RUNNER_IMAGE=ghcr.io/geonet/base-images/static:latest
ARG RUN_USER=nobody
# Only support image based on AlpineLinux
FROM ${BUILDER_IMAGE} as builder

# Project to build
ARG BUILD=fdsn-ws

# Git commit SHA
ARG GIT_COMMIT_SHA

WORKDIR /repo
COPY go.* *.go /repo
RUN go mod download
COPY internal /repo/internal
COPY vendor /repo/vendor
COPY cmd/$BUILD /repo/cmd/$BUILD

# Set a bunch of go env flags
ENV GOBIN /repo/gobin
ENV GOFLAGS -mod=vendor
ENV CGO_ENABLED=0
RUN go install -a -ldflags "-X main.Prefix=${BUILD}/${GIT_COMMIT_SHA} -extldflags -static" /repo/cmd/${BUILD}

FROM ${RUNNER_IMAGE}
# Export a port, default to 8080
ARG EXPOSE_PORT=8080
EXPOSE $EXPOSE_PORT
ARG BUILD
# Need to make this an env for it to be interpolated by the shell
ENV TZ Pacific/Auckland
ENV BUILD_BIN=${BUILD}
# We have to make our binary have a fixed name, otherwise, we cannot run it without a shell
COPY --from=builder /repo/gobin/${BUILD} /${BUILD}
# Copy the assets
ARG ASSET_DIR
COPY ${ASSET_DIR} /assets
USER nobody
CMD ["/fdsn-ws"]
9 changes: 4 additions & 5 deletions etc/scripts/initdb.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,12 @@ export PGPASSWORD=$2
# Restart postgres.
#
dropdb --host=127.0.0.1 --username=$db_user fdsn
psql --host=127.0.0.1 -d postgres --username=$db_user --file=${ddl_dir}/create-users.ddl
psql --host=127.0.0.1 -d postgres --username=$db_user --file=${ddl_dir}/create-db.ddl
psql postgresql://postgres:postgres@127.0.0.1/postgres --file=${ddl_dir}/create-users.ddl
psql postgresql://postgres:postgres@127.0.0.1/postgres --file=${ddl_dir}/create-db.ddl

# Function security means adding postgis has to be done as a superuser - here that is the postgres user.
# On AWS RDS the created functions have to be transfered to the rds_superuser.
# http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html#Appendix.PostgreSQL.CommonDBATasks.PostGIS
psql --host=127.0.0.1 -d fdsn --username=$db_user -c 'create extension postgis;'

psql --host=127.0.0.1 --quiet --username=$db_user --dbname=fdsn --file=${ddl_dir}/drop-create.ddl
psql --host=127.0.0.1 --quiet --username=$db_user fdsn -f ${ddl_dir}/user-permissions.ddl
psql postgresql://postgres:postgres@127.0.0.1/postgres --file=${ddl_dir}/drop-create.ddl
psql postgresql://postgres:postgres@127.0.0.1/postgres -f ${ddl_dir}/user-permissions.ddl

0 comments on commit 42b3326

Please sign in to comment.