Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

workflows: add build/release workflow #2743

Merged
merged 1 commit into from
Feb 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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:
- 'config/**'
- '**/*.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'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it means the latest one we adopted? so after the #2738 it gonna be 1.22?

Copy link
Member Author

@roman-khimov roman-khimov Feb 21, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, as usual. Except that 1.22 will be added when we're to drop 1.20, not when it's the minimal one (go.mod).

cache: true

- name: Build
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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so we are changing our release binaries now? do we need to mention this (changelog?)?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They'll be exactly the same (that's why they're renamed) except for missing .tar.gz. I know .tar.gz is used in some cases, but those can be reworked and this duplication was never good.

Copy link
Member

@carpawell carpawell Feb 21, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the new "linux" word in the binary name?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Check the binaries from https://github.com/nspcc-dev/neofs-node/actions/runs/7979125234?pr=2743, do we have correct number of linuxes there?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated CHANGELOG as well, btw.


- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: Binaries ${{ matrix.os.bin-name }}-${{ matrix.arch }}
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 }}
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ Changelog for NeoFS Node
### Updated

### Updating from v0.40.0
We no longer provide .tag.gz binaries in releases, they always were just
duplicates, but if you're using them in some scripts please update to fetch
raw binaries.

## [0.40.0] - 2024-02-09 - Maldo

Expand Down
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.
Loading