Skip to content

馃拕

馃拕 #47

Workflow file for this run

# Builds the application and makes releases
name: Build and release
on:
push:
branches:
- main
tags:
# Push to tags matching v*
- 'v*'
jobs:
build:
name: Build and release
runs-on: ubuntu-22.04
permissions:
contents: write
packages: write
# This is used to complete the identity challenge with sigstore/fulcio when running outside of PRs.
id-token: write
env:
CGO_ENABLED: "0"
GOLANGCI_LINT_VERSION: "v1.55.1"
steps:
- name: Check out code
uses: actions/checkout@v4
- uses: actions/setup-go@v4
with:
go-version-file: 'go.mod'
- uses: actions/setup-node@v3
with:
node-version-file: 'client/.nvmrc'
# Install the cosign tool
# https://github.com/sigstore/cosign-installer
- name: Install cosign
uses: sigstore/cosign-installer@6e04d228eb30da1757ee4e1dd75a0ec73a653e06 #v3.1.1
with:
cosign-release: 'v2.1.1'
- name: Set variables
run: |
mkdir -p .bin
# Fetch semver: https://github.com/fsaintjacques/semver-tool
curl https://raw.githubusercontent.com/fsaintjacques/semver-tool/3.4.0/src/semver > .bin/semver
chmod +x .bin/semver
if [ "${{ github.ref }}" == "refs/heads/main" ]; then
BUILD_ID="edge"
BUILD_VERSION="edge"
BRANCH=""
PRERELEASE=""
else
# Trim the first 10 characters, which are "refs/tags/"
BUILD_ID="${GITHUB_REF:10}"
# Just like BUILD_ID, but without the "v" at the beginning
BUILD_VERSION="${GITHUB_REF:11}"
# Branch
MAJOR_VERSION=$(.bin/semver get major $BUILD_VERSION)
MINOR_VERSION=$(.bin/semver get minor $BUILD_VERSION)
PRERELEASE=$(.bin/semver get prerel $BUILD_VERSION)
BRANCH=""
if [ "$MAJOR_VERSION" = "0" ]; then
BRANCH="$MAJOR_VERSION.$MINOR_VERSION"
else
BRANCH="$MAJOR_VERSION"
fi
if [ "$PRERELEASE" != "" ]; then
BRANCH="${BRANCH}-pre"
fi
fi
BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%S')
COMMIT_HASH=$(echo $GITHUB_SHA | head -c 7)
echo "BUILD_ID=$BUILD_ID" >> $GITHUB_ENV
echo "BUILD_VERSION=$BUILD_VERSION" >> $GITHUB_ENV
echo "BUILD_DATE=$BUILD_DATE" >> $GITHUB_ENV
echo "COMMIT_HASH=$COMMIT_HASH" >> $GITHUB_ENV
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
echo "PRERELEASE=$PRERELEASE" >> $GITHUB_ENV
- name: Login to GitHub Container Registry
uses: docker/login-action@v3.0.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3.0.0
with:
platforms: 'arm64,arm'
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3.0.0
with:
version: latest
install: true
- name: Run go-generate
run: |
echo -e "\n###\nFetching NPM dependencies\n"
(cd client; npm ci)
echo -e "\n###\nRunning 'go generate'\n"
go generate -v ./...
- name: Run golangci-Lint
uses: golangci/golangci-lint-action@v3
with:
version: ${{ env.GOLANGCI_LINT_VERSION }}
skip-cache: true
- name: Run tests
run: |
go test -v \
-tags unit \
./...
- name: Build for all platforms
run: |
mkdir -p .bin .out
echo -e "\n###\nSetting BUILD_LDFLAGS\n"
BUILDINFO_PKG="github.com/italypaleale/revaulter/pkg/buildinfo"
BUILD_LDFLAGS="-X ${BUILDINFO_PKG}.Production=1 -X ${BUILDINFO_PKG}.AppVersion=${{env.BUILD_VERSION}} -X ${BUILDINFO_PKG}.BuildId=${{env.BUILD_ID}} -X ${BUILDINFO_PKG}.BuildDate=${{env.BUILD_DATE}} -X ${BUILDINFO_PKG}.CommitHash=${{env.COMMIT_HASH}} -buildid=${{env.BUILD_ID}}"
echo "BUILD_LDFLAGS=${BUILD_LDFLAGS}"
echo -e "\n###\nBuilding linux/amd64\n"
mkdir .bin/revaulter-${{ env.BUILD_ID }}-linux-amd64
GOOS=linux \
GOARCH=amd64 \
go build \
-ldflags "${BUILD_LDFLAGS}" \
-o .bin/revaulter-${{ env.BUILD_ID }}-linux-amd64/revaulter \
-trimpath \
./cmd/revaulter
cp LICENSE.md .bin/revaulter-${{ env.BUILD_ID }}-linux-amd64
cp README.md .bin/revaulter-${{ env.BUILD_ID }}-linux-amd64
(cd .bin && tar -czvf ../.out/revaulter-${{ env.BUILD_ID }}-linux-amd64.tar.gz revaulter-${{ env.BUILD_ID }}-linux-amd64)
echo -e "\n###\nBuilding linux/386\n"
mkdir .bin/revaulter-${{ env.BUILD_ID }}-linux-386
GOOS=linux \
GOARCH=386 \
go build \
-ldflags "${BUILD_LDFLAGS}" \
-o .bin/revaulter-${{ env.BUILD_ID }}-linux-386/revaulter \
-trimpath \
./cmd/revaulter
cp LICENSE.md .bin/revaulter-${{ env.BUILD_ID }}-linux-386
cp README.md .bin/revaulter-${{ env.BUILD_ID }}-linux-386
(cd .bin && tar -czvf ../.out/revaulter-${{ env.BUILD_ID }}-linux-386.tar.gz revaulter-${{ env.BUILD_ID }}-linux-386)
echo -e "\n###\nBuilding linux/arm64\n"
mkdir .bin/revaulter-${{ env.BUILD_ID }}-linux-arm64
GOOS=linux \
GOARCH=arm64 \
go build \
-ldflags "${BUILD_LDFLAGS}" \
-o .bin/revaulter-${{ env.BUILD_ID }}-linux-arm64/revaulter \
-trimpath \
./cmd/revaulter
cp LICENSE.md .bin/revaulter-${{ env.BUILD_ID }}-linux-arm64
cp README.md .bin/revaulter-${{ env.BUILD_ID }}-linux-arm64
(cd .bin && tar -czvf ../.out/revaulter-${{ env.BUILD_ID }}-linux-arm64.tar.gz revaulter-${{ env.BUILD_ID }}-linux-arm64)
echo -e "\n###\nBuilding linux/armv7\n"
mkdir .bin/revaulter-${{ env.BUILD_ID }}-linux-armv7
GOOS=linux \
GOARCH=arm \
GOARM=7 \
go build \
-ldflags "${BUILD_LDFLAGS}" \
-o .bin/revaulter-${{ env.BUILD_ID }}-linux-armv7/revaulter \
-trimpath \
./cmd/revaulter
cp LICENSE.md .bin/revaulter-${{ env.BUILD_ID }}-linux-armv7
cp README.md .bin/revaulter-${{ env.BUILD_ID }}-linux-armv7
(cd .bin && tar -czvf ../.out/revaulter-${{ env.BUILD_ID }}-linux-armv7.tar.gz revaulter-${{ env.BUILD_ID }}-linux-armv7)
echo -e "\n###\nBuilding darwin/amd64\n"
mkdir .bin/revaulter-${{ env.BUILD_ID }}-macos
GOOS=darwin \
GOARCH=amd64 \
go build \
-ldflags "${BUILD_LDFLAGS}" \
-o .bin/revaulter-${{ env.BUILD_ID }}-macos-x64/revaulter \
-trimpath \
./cmd/revaulter
cp LICENSE.md .bin/revaulter-${{ env.BUILD_ID }}-macos-x64
cp README.md .bin/revaulter-${{ env.BUILD_ID }}-macos-x64
(cd .bin && tar -czvf ../.out/revaulter-${{ env.BUILD_ID }}-macos-x64.tar.gz revaulter-${{ env.BUILD_ID }}-macos-x64)
echo -e "\n###\nBuilding darwin/arm64\n"
mkdir .bin/revaulter-${{ env.BUILD_ID }}-macos-arm64
GOOS=darwin \
GOARCH=arm64 \
go build \
-ldflags "${BUILD_LDFLAGS}" \
-o .bin/revaulter-${{ env.BUILD_ID }}-macos-arm64/revaulter \
-trimpath \
./cmd/revaulter
cp LICENSE.md .bin/revaulter-${{ env.BUILD_ID }}-macos-arm64
cp README.md .bin/revaulter-${{ env.BUILD_ID }}-macos-arm64
(cd .bin && tar -czvf ../.out/revaulter-${{ env.BUILD_ID }}-macos-arm64.tar.gz revaulter-${{ env.BUILD_ID }}-macos-arm64)
echo -e "\n###\nLinks for Docker buildx\n"
(
cd .bin && \
ln -v -s revaulter-${{ env.BUILD_ID }}-linux-amd64 linux-amd64 && \
ln -v -s revaulter-${{ env.BUILD_ID }}-linux-arm64 linux-arm64 && \
ln -v -s revaulter-${{ env.BUILD_ID }}-linux-armv7 linux-arm \
)
echo -e "\n###\nCompilation done\n"
ls -al .bin
ls -al .out
# Publish artifacts
- name: Publish binaries as artifacts
uses: actions/upload-artifact@v3
with:
name: artifacts
path: .out
# Create release and upload assets
- name: Create release
uses: softprops/action-gh-release@c9b46fe7aad9f02afd89b12450b780f52dacfb2d # v1
if: env.BUILD_VERSION != 'edge'
with:
name: ${{ github.ref }}
tag_name: ${{ github.ref }}
draft: true
prerelease: ${{ env.PRERELEASE != '' }}
generate_release_notes: true
files: |
.out/revaulter-${{ env.BUILD_ID }}-linux-amd64.tar.gz
.out/revaulter-${{ env.BUILD_ID }}-linux-386.tar.gz
.out/revaulter-${{ env.BUILD_ID }}-linux-arm64.tar.gz
.out/revaulter-${{ env.BUILD_ID }}-linux-armv7.tar.gz
.out/revaulter-${{ env.BUILD_ID }}-macos-x64.tar.gz
.out/revaulter-${{ env.BUILD_ID }}-macos-arm64.tar.gz
- name: Set variable REPO_OWNER
shell: bash
run: |
# We need to lowercase the value of REPO_OWNER
REPO_OWNER=${{ github.repository_owner }}
echo "REPO_OWNER=${REPO_OWNER,,}" >> ${GITHUB_ENV}
- name: Set variable TAGS (edge)
if: env.BUILD_VERSION == 'edge'
shell: bash
run: |
echo "TAGS=ghcr.io/${{ env.REPO_OWNER }}/revaulter:edge" \
>> ${GITHUB_ENV}
- name: Set variable TAGS (release)
if: env.BUILD_VERSION != 'edge'
shell: bash
run: |
{
echo 'TAGS<<EOF'
echo "ghcr.io/${{ env.REPO_OWNER }}/revaulter:${{env.BUILD_VERSION}}"
echo "ghcr.io/${{ env.REPO_OWNER }}/revaulter:${{env.BRANCH}}"
echo EOF
} >> "$GITHUB_ENV"
- name: Docker build and push to GHCR
uses: docker/build-push-action@v4
id: docker-build-push
with:
context: .
file: ./Dockerfile
platforms: linux/amd64,linux/arm64,linux/arm/v7
tags: ${{ env.TAGS }}
push: true
# Sign the resulting Docker images digests.
# This will only write to the public Rekor transparency log when the Docker repository is public to avoid leaking data.
# https://github.com/sigstore/cosign
- name: Sign the published Docker images
env:
# https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-an-intermediate-environment-variable
DIGEST: ${{ steps.docker-build-push.outputs.digest }}
# This step uses the identity token to provision an ephemeral certificate against the sigstore community Fulcio instance.
run: |
echo "${{env.TAGS}}" | xargs -I {} cosign sign --yes {}@${DIGEST}