130 lines
4.3 KiB
YAML
130 lines
4.3 KiB
YAML
name: Build & Publish Release
|
|
|
|
env:
|
|
NIX_CONFIG: experimental-features = nix-command flakes
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
release_type:
|
|
description: "Release type: 'dev' or 'stable'"
|
|
required: true
|
|
default: "dev"
|
|
type: choice
|
|
options:
|
|
- dev
|
|
- stable
|
|
description:
|
|
description: "Release description"
|
|
required: true
|
|
type: string
|
|
|
|
jobs:
|
|
build:
|
|
name: Build & Publish Release
|
|
runs-on: host
|
|
steps:
|
|
- name: Set up repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Login to Docker Hub
|
|
env:
|
|
DOCKER_USER: ${{ secrets.DOCKER_USER }}
|
|
DOCKER_PASSWD: ${{ secrets.DOCKER_PASSWD }}
|
|
run: |
|
|
set -eu
|
|
DOCKER_USER="$(printf '%s' "$DOCKER_USER" | tr -d '\r\n')"
|
|
DOCKER_PASSWD="$(printf '%s' "$DOCKER_PASSWD" | tr -d '\r\n')"
|
|
printf '%s' "$DOCKER_PASSWD" | nix-shell -p docker --run "docker login docker.io --username \"$DOCKER_USER\" --password-stdin"
|
|
|
|
- name: Build & Push Docker image
|
|
run: |
|
|
nix-shell -p docker --run "docker build -f dockerfile -t tensamin/iota:latest . && docker push tensamin/iota:latest"
|
|
|
|
- name: Build release binaries
|
|
run: |
|
|
set -eu
|
|
|
|
nix build .#iota-daemon --print-build-logs
|
|
install -Dm755 result/bin/iota-daemon dist/iota-daemon
|
|
|
|
nix build .#iota-ui --print-build-logs
|
|
install -Dm755 result/bin/iota-ui dist/iota-ui
|
|
|
|
- name: Read release metadata
|
|
id: version
|
|
env:
|
|
RELEASE_TYPE: ${{ inputs.release_type }}
|
|
run: |
|
|
set -eu
|
|
|
|
VERSION="$(nix eval --raw .#iota-daemon.version)"
|
|
SHORT_SHA="$(git rev-parse --short=7 HEAD)"
|
|
|
|
case "$RELEASE_TYPE" in
|
|
dev)
|
|
TAG="${VERSION}-dev-${SHORT_SHA}"
|
|
PRERELEASE="true"
|
|
;;
|
|
stable)
|
|
TAG="$VERSION"
|
|
PRERELEASE="false"
|
|
;;
|
|
*)
|
|
echo "release_type must be either 'dev' or 'stable'"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
echo "version=$VERSION" >> "$FORGEJO_OUTPUT"
|
|
echo "tag=$TAG" >> "$FORGEJO_OUTPUT"
|
|
echo "title=$TAG" >> "$FORGEJO_OUTPUT"
|
|
echo "prerelease=$PRERELEASE" >> "$FORGEJO_OUTPUT"
|
|
|
|
test -x "dist/iota-daemon"
|
|
test -x "dist/iota-ui"
|
|
|
|
- name: Create release and upload binaries
|
|
env:
|
|
TOKEN: ${{ forgejo.token }}
|
|
API: ${{ forgejo.api_url }}
|
|
REPO: ${{ forgejo.repository }}
|
|
SHA: ${{ forgejo.sha }}
|
|
TAG: ${{ steps.version.outputs.tag }}
|
|
TITLE: ${{ steps.version.outputs.title }}
|
|
PRERELEASE: ${{ steps.version.outputs.prerelease }}
|
|
DESCRIPTION: ${{ inputs.description }}
|
|
run: |
|
|
nix-shell -p curl jq --run '
|
|
set -eu
|
|
|
|
HTTP_STATUS=$(curl -s -w "%{http_code}" -o release_out.json \
|
|
-H "Authorization: token $TOKEN" \
|
|
"$API/repos/$REPO/releases/tags/$TAG")
|
|
|
|
if [ "$HTTP_STATUS" = "200" ]; then
|
|
echo "Release $TAG already exists."
|
|
RELEASE_ID="$(jq -r .id release_out.json)"
|
|
else
|
|
echo "Creating release for $TAG"
|
|
RELEASE_JSON="$(curl -f -sS -X POST "$API/repos/$REPO/releases" \
|
|
-H "Authorization: token $TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d "$(jq -n \
|
|
--arg tag "$TAG" \
|
|
--arg name "$TITLE" \
|
|
--arg body "$DESCRIPTION" \
|
|
--arg target "$SHA" \
|
|
--argjson prerelease "$PRERELEASE" \
|
|
'"'"'{ tag_name: $tag, name: $name, body: $body, target_commitish: $target, draft: false, prerelease: $prerelease }'"'"')")"
|
|
RELEASE_ID="$(echo "$RELEASE_JSON" | jq -r .id)"
|
|
fi
|
|
|
|
curl -fsS -X POST "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=iota-daemon" \
|
|
-H "Authorization: token $TOKEN" \
|
|
-F "attachment=@dist/iota-daemon"
|
|
|
|
curl -fsS -X POST "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=iota-ui" \
|
|
-H "Authorization: token $TOKEN" \
|
|
-F "attachment=@dist/iota-ui"
|
|
'
|