Skip to content

Commit

Permalink
workflows: add build/release workflow
Browse files Browse the repository at this point in the history
And rework release procedure a bit. Don't rely on external tools and make
CHANGELOGs better.

Signed-off-by: Roman Khimov <[email protected]>
  • Loading branch information
roman-khimov committed Feb 20, 2024
1 parent 996b1ea commit c62d4d3
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 38 deletions.
123 changes: 123 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
name: Build

on:
pull_request:
branches:
- master
types: [opened, synchronize]
paths-ignore:
- 'scripts/**'
- '**/*.md'
push:
# Build for the master branch.
branches:
- master
release:
# Publish released commit as Docker `latest` and `git_revision` images.
types:
- published
workflow_dispatch:
inputs:
ref:
description: 'Ref to build CLI [default: latest master; examples: v0.40.0, 0a4ff9d3e4a9ab432fd5812eb18c98e03b5a7432]'
required: false
default: ''
push_image:
description: 'Push images to DockerHub [default: false; examples: true, false]'
required: false
default: 'false'
use_latest_tag:
description: 'Use `latest` tag while pushing images to DockerHub [default: false; examples: true, false]'
required: false
default: 'false'

jobs:
build_bins:
name: Build
runs-on: ${{matrix.os.name}}
strategy:
matrix:
os: [{ name: ubuntu-22.04, bin-name: linux }] # { name: windows-2022, bin-name: windows }, { name: macos-12, bin-name: darwin }
arch: [amd64] # arm64

steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.ref }}
# Allows to fetch all history for all branches and tags. Need this for proper versioning.
fetch-depth: 0

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.21'
cache: true

- name: Build CLI
run: make
env:
GOARCH: ${{ matrix.arch }}

- name: Rename binaries
run: for i in ./bin/*; do mv $i $i-${{ matrix.os.bin-name }}-${{ matrix.arch }}${{ (matrix.os.bin-name == 'windows' && '.exe') || '' }}; done

- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: Binaries
path: ./bin/*
if-no-files-found: error

- name: Attach binaries to the release as assets
if: ${{ github.event_name == 'release' }}
run: gh release upload ${{ github.event.release.tag_name }} ./bin/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

build_images:
needs: build_bins
name: Build and push docker images
runs-on: ubuntu-22.04
strategy:
matrix:
image: [adm, cli, ir, storage]

steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.ref }}
fetch-depth: 0

- name: Set up QEMU
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to DockerHub
if: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true') }}
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}

- name: Set version
id: setver
run: echo version=`make version` >> $GITHUB_OUTPUT

- name: Set latest tag
id: setlatest
if: ${{ (github.event_name == 'release' && github.event.release.target_commitish == 'master') || (github.event_name == 'workflow_dispatch' && github.event.inputs.use_latest_tag == 'true') }}
run: echo "latest=,nspccdev/neofs-${{matrix.image}}:latest" >> $GITHUB_OUTPUT

- name: Build and push image
uses: docker/build-push-action@v5
with:
context: .
file: .docker/Dockerfile.${{matrix.image}}
push: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true') }}
platforms: linux/amd64
build-args: |
REPO=github.com/${{ github.repository }}
VERSION=${{ steps.setver.outputs.version }}
tags: nspccdev/neofs-${{matrix.image}}:${{ steps.setver.outputs.version }}${{ steps.setlatest.outputs.latest }}
63 changes: 25 additions & 38 deletions docs/release-instruction.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,58 +82,45 @@ $ git push <remote> release/${NEOFS_TAG_PREFIX}${NEOFS_REVISION}
Open pull request to the main branch of the origin repository so that the
maintainers check the changes. Remove release branch after the merge.

## Tag the release
## Create a GitHub release and a tag

Pull the main branch with release commit created in previous step. Tag the commit
with PGP signature.
Use "Draft a new release" button in the "Releases" section. Create a new
`vX.Y.Z` tag for it following the semantic versioning standard. Put change log
for this release into the description. Do not attach any binaries at this step.
Set the "Set as the latest release" checkbox if this is the latest stable
release or "Set as a pre-release" if this is an unstable pre-release.
Press the "Publish release" button.

```shell
$ git checkout master && git pull
$ git tag -s ${NEOFS_TAG_PREFIX}${NEOFS_REVISION}
```
## Add automatically-built binaries

## Push the release tag
New release created at the previous step triggers automatic builds (if not,
start them manually from the Build GitHub workflow), so wait for them to
finish. Built binaries should be automatically attached to the release as an
asset, check it on the release page. If binaries weren't attached after building
workflow completion, then submit the bug, download currently supported binaries
from the building job artifacts, unpack archive and add them to the
previously created release via "Edit release" button.

```shell
$ git push origin ${NEOFS_TAG_PREFIX}${NEOFS_REVISION}
```
Docker image builds are triggered automatically as well, check they're successful
or upload manualy if that's not the case.

## Post-release

### Prepare and push images to a Docker Hub (if not automated)

Create Docker images for all applications and push them into Docker Hub
(requires [organization](https://hub.docker.com/u/nspccdev) privileges)

```shell
$ git checkout ${NEOFS_TAG_PREFIX}${NEOFS_REVISION}
$ make images
$ docker push nspccdev/neofs-storage:${NEOFS_REVISION}
$ docker push nspccdev/neofs-storage-testnet:${NEOFS_REVISION}
$ docker push nspccdev/neofs-ir:${NEOFS_REVISION}
$ docker push nspccdev/neofs-cli:${NEOFS_REVISION}
$ docker push nspccdev/neofs-adm:${NEOFS_REVISION}
```

### Make a proper GitHub release (if not automated)
### Close GitHub milestone

Edit an automatically-created release on GitHub, copy things from `CHANGELOG.md`.
Build and tar release binaries with `make prepare-release`, attach them to
the release. Publish the release.
Look up GitHub [milestones](https://github.com/nspcc-dev/neofs-node/milestones) and close the release one if exists.

### Update NeoFS Developer Environment

Prepare pull-request in [neofs-devenv](https://github.com/nspcc-dev/neofs-devenv)
with new versions.

### Close GitHub milestone

Look up GitHub [milestones](https://github.com/nspcc-dev/neofs-node/milestones) and close the release one if exists.
### Announcements

### Rebuild NeoFS LOCODE database
Copy the GitHub release page link to:
* Discord channel
* Element (Matrix) channel

If new release contains LOCODE-related changes, rebuild NeoFS LOCODE database via NeoFS CLI
### Deployment

```shell
$ neofs-cli util locode generate ...
```
Deploy the updated version to the mainnet/testnet.

0 comments on commit c62d4d3

Please sign in to comment.