Skip to content

fix: allow node/logs source code in Docker build context #13

fix: allow node/logs source code in Docker build context

fix: allow node/logs source code in Docker build context #13

Workflow file for this run

name: Build and Push to Harbor
on:
push:
tags:
- "v*.*.*"
- "v*.*.*-beta"
- "*.*.*"
- "*.*.*-beta"
permissions:
contents: write
packages: write
jobs:
prepare:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version.outputs.version }}
version_for_file: ${{ steps.version.outputs.version_for_file }}
is_beta: ${{ steps.version.outputs.is_beta }}
tag: ${{ steps.version.outputs.tag }}
steps:
- name: Checkout repository
uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Extract version from tag
id: version
run: |
TAG=${GITHUB_REF#refs/tags/}
# Remove 'v' prefix if present
VERSION=${TAG#v}
# Check if it's a beta tag
if [[ "$VERSION" == *"-beta" ]]; then
IS_BETA=true
VERSION_WITHOUT_BETA=${VERSION%-beta}
# For beta, keep the version as is (e.g., "1.0.0-beta")
VERSION_FOR_FILE="$VERSION_WITHOUT_BETA"
else
IS_BETA=false
VERSION_WITHOUT_BETA=$VERSION
# For main, use clean version (e.g., "1.0.0")
VERSION_FOR_FILE="$VERSION"
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "version_without_beta=$VERSION_WITHOUT_BETA" >> $GITHUB_OUTPUT
echo "version_for_file=$VERSION_FOR_FILE" >> $GITHUB_OUTPUT
echo "is_beta=$IS_BETA" >> $GITHUB_OUTPUT
echo "tag=$TAG" >> $GITHUB_OUTPUT
echo "Extracted version: $VERSION"
echo "Version for file: $VERSION_FOR_FILE"
echo "Is beta: $IS_BETA"
- name: Update version file for build
run: |
echo "${{ steps.version.outputs.version_for_file }}" > config/version
echo "Updated config/version to: ${{ steps.version.outputs.version_for_file }}"
cat config/version
- name: Update version in branch
run: |
# Determine branch from tag
if [[ "${{ steps.version.outputs.is_beta }}" == "true" ]]; then
BRANCH="beta"
else
BRANCH="main"
fi
echo "Updating version in branch: $BRANCH"
# Checkout branch
git fetch origin $BRANCH:$BRANCH || echo "Branch $BRANCH not found, skipping version update"
git checkout $BRANCH 2>/dev/null || {
echo "Could not checkout branch $BRANCH, version will be updated only for build"
exit 0
}
# Update version file
echo "${{ steps.version.outputs.version_for_file }}" > config/version
# Commit if changed
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add config/version
if git diff --staged --quiet; then
echo "Version already up to date in branch $BRANCH"
else
git commit -m "chore: update version to ${{ steps.version.outputs.version_for_file }} [skip ci]"
git push origin $BRANCH || echo "Failed to push to $BRANCH, but continuing..."
echo "✅ Version updated in branch $BRANCH to ${{ steps.version.outputs.version_for_file }}"
fi
# Go back to tag for build
git checkout ${{ github.ref }}
build-sharx:
needs: prepare
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Harbor
uses: docker/login-action@v3
with:
registry: ${{ secrets.HARBOR_HOST }}
username: ${{ secrets.HARBOR_USER }}
password: ${{ secrets.HARBOR_PASSWORD }}
- name: Update version file
run: |
echo "${{ needs.prepare.outputs.version_for_file }}" > config/version
- name: Determine image tags
env:
HARBOR_HOST: ${{ secrets.HARBOR_HOST }}
HARBOR_PROJECT: ${{ secrets.HARBOR_PROJECT }}
VERSION: ${{ needs.prepare.outputs.version }}
IS_BETA: ${{ needs.prepare.outputs.is_beta }}
run: |
if [ "$IS_BETA" = "true" ]; then
SHARX_TAG_VERSION="$HARBOR_HOST/$HARBOR_PROJECT/sharx:$VERSION"
SHARX_TAG_LATEST="$HARBOR_HOST/$HARBOR_PROJECT/sharx:latest-beta"
else
SHARX_TAG_VERSION="$HARBOR_HOST/$HARBOR_PROJECT/sharx:$VERSION"
SHARX_TAG_LATEST="$HARBOR_HOST/$HARBOR_PROJECT/sharx:latest"
fi
echo "✅ SharX tags: $SHARX_TAG_VERSION, $SHARX_TAG_LATEST"
echo "SHARX_TAG_VERSION=$SHARX_TAG_VERSION" >> $GITHUB_ENV
echo "SHARX_TAG_LATEST=$SHARX_TAG_LATEST" >> $GITHUB_ENV
- name: Build and push sharx image
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
push: true
tags: |
${{ env.SHARX_TAG_VERSION }}
${{ env.SHARX_TAG_LATEST }}
# Build only for amd64 by default for faster builds
# Change to "linux/amd64,linux/arm64,linux/arm/v7" for multi-arch
platforms: linux/amd64
cache-from: |
type=registry,ref=${{ secrets.HARBOR_HOST }}/${{ secrets.HARBOR_PROJECT }}/sharx:buildcache
type=gha
cache-to: |
type=registry,ref=${{ secrets.HARBOR_HOST }}/${{ secrets.HARBOR_PROJECT }}/sharx:buildcache,mode=max
type=gha,mode=max
build-args: |
BUILDKIT_INLINE_CACHE=1
build-sharxnode:
needs: prepare
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Harbor
uses: docker/login-action@v3
with:
registry: ${{ secrets.HARBOR_HOST }}
username: ${{ secrets.HARBOR_USER }}
password: ${{ secrets.HARBOR_PASSWORD }}
- name: Determine image tags
env:
HARBOR_HOST: ${{ secrets.HARBOR_HOST }}
HARBOR_PROJECT: ${{ secrets.HARBOR_PROJECT }}
VERSION: ${{ needs.prepare.outputs.version }}
IS_BETA: ${{ needs.prepare.outputs.is_beta }}
run: |
if [ "$IS_BETA" = "true" ]; then
SHARXNODE_TAG_VERSION="$HARBOR_HOST/$HARBOR_PROJECT/sharxnode:$VERSION"
SHARXNODE_TAG_LATEST="$HARBOR_HOST/$HARBOR_PROJECT/sharxnode:latest-beta"
else
SHARXNODE_TAG_VERSION="$HARBOR_HOST/$HARBOR_PROJECT/sharxnode:$VERSION"
SHARXNODE_TAG_LATEST="$HARBOR_HOST/$HARBOR_PROJECT/sharxnode:latest"
fi
echo "✅ SharXNode tags: $SHARXNODE_TAG_VERSION, $SHARXNODE_TAG_LATEST"
echo "SHARXNODE_TAG_VERSION=$SHARXNODE_TAG_VERSION" >> $GITHUB_ENV
echo "SHARXNODE_TAG_LATEST=$SHARXNODE_TAG_LATEST" >> $GITHUB_ENV
- name: Build and push sharxnode image
uses: docker/build-push-action@v6
with:
context: .
file: ./node/Dockerfile
push: true
tags: |
${{ env.SHARXNODE_TAG_VERSION }}
${{ env.SHARXNODE_TAG_LATEST }}
# Build only for amd64 by default for faster builds
# Change to "linux/amd64,linux/arm64,linux/arm/v7" for multi-arch
platforms: linux/amd64
cache-from: |
type=registry,ref=${{ secrets.HARBOR_HOST }}/${{ secrets.HARBOR_PROJECT }}/sharxnode:buildcache
type=gha
cache-to: |
type=registry,ref=${{ secrets.HARBOR_HOST }}/${{ secrets.HARBOR_PROJECT }}/sharxnode:buildcache,mode=max
type=gha,mode=max
build-args: |
BUILDKIT_INLINE_CACHE=1
postgres:
needs: prepare
runs-on: ubuntu-latest
steps:
- name: Login to Harbor
uses: docker/login-action@v3
with:
registry: ${{ secrets.HARBOR_HOST }}
username: ${{ secrets.HARBOR_USER }}
password: ${{ secrets.HARBOR_PASSWORD }}
- name: Pull postgres image and push to Harbor
run: |
HARBOR_HOST="${{ secrets.HARBOR_HOST }}"
HARBOR_PROJECT="${{ secrets.HARBOR_PROJECT }}"
POSTGRES_VERSION="16-alpine"
echo "Pulling postgres:$POSTGRES_VERSION..."
docker pull postgres:$POSTGRES_VERSION
echo "Tagging and pushing to Harbor..."
docker tag postgres:$POSTGRES_VERSION $HARBOR_HOST/$HARBOR_PROJECT/postgres:$POSTGRES_VERSION
docker tag postgres:$POSTGRES_VERSION $HARBOR_HOST/$HARBOR_PROJECT/postgres:latest
docker push $HARBOR_HOST/$HARBOR_PROJECT/postgres:$POSTGRES_VERSION
docker push $HARBOR_HOST/$HARBOR_PROJECT/postgres:latest
echo "✅ Postgres image pushed successfully"
release:
needs: [prepare, build-sharx, build-sharxnode, postgres]
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Determine image tags
id: tags
run: |
HARBOR_HOST="${{ secrets.HARBOR_HOST }}"
HARBOR_PROJECT="${{ secrets.HARBOR_PROJECT }}"
VERSION="${{ needs.prepare.outputs.version }}"
IS_BETA="${{ needs.prepare.outputs.is_beta }}"
if [ "$IS_BETA" = "true" ]; then
SHARX_TAG_VERSION="$HARBOR_HOST/$HARBOR_PROJECT/sharx:$VERSION"
SHARX_TAG_LATEST="$HARBOR_HOST/$HARBOR_PROJECT/sharx:latest-beta"
SHARXNODE_TAG_VERSION="$HARBOR_HOST/$HARBOR_PROJECT/sharxnode:$VERSION"
SHARXNODE_TAG_LATEST="$HARBOR_HOST/$HARBOR_PROJECT/sharxnode:latest-beta"
else
SHARX_TAG_VERSION="$HARBOR_HOST/$HARBOR_PROJECT/sharx:$VERSION"
SHARX_TAG_LATEST="$HARBOR_HOST/$HARBOR_PROJECT/sharx:latest"
SHARXNODE_TAG_VERSION="$HARBOR_HOST/$HARBOR_PROJECT/sharxnode:$VERSION"
SHARXNODE_TAG_LATEST="$HARBOR_HOST/$HARBOR_PROJECT/sharxnode:latest"
fi
echo "sharx_tag_version=$SHARX_TAG_VERSION" >> $GITHUB_OUTPUT
echo "sharx_tag_latest=$SHARX_TAG_LATEST" >> $GITHUB_OUTPUT
echo "sharxnode_tag_version=$SHARXNODE_TAG_VERSION" >> $GITHUB_OUTPUT
echo "sharxnode_tag_latest=$SHARXNODE_TAG_LATEST" >> $GITHUB_OUTPUT
- name: Create GitHub Release in sharx-code
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ needs.prepare.outputs.tag }}
name: Release ${{ needs.prepare.outputs.tag }}
body: |
## Release ${{ needs.prepare.outputs.tag }}
### Docker Images
Images are available in Harbor:
- **sharx**: `${{ steps.tags.outputs.sharx_tag_version }}` / `${{ steps.tags.outputs.sharx_tag_latest }}`
- **sharxnode**: `${{ steps.tags.outputs.sharxnode_tag_version }}` / `${{ steps.tags.outputs.sharxnode_tag_latest }}`
- **postgres**: ${{ secrets.HARBOR_HOST }}/${{ secrets.HARBOR_PROJECT }}/postgres:16-alpine / ${{ secrets.HARBOR_HOST }}/${{ secrets.HARBOR_PROJECT }}/postgres:latest
### Usage
Update your `docker-compose.yml`:
```yaml
services:
sharx:
image: ${{ steps.tags.outputs.sharx_tag_latest }}
sharxnode:
image: ${{ steps.tags.outputs.sharxnode_tag_latest }}
postgres:
image: ${{ secrets.HARBOR_HOST }}/${{ secrets.HARBOR_PROJECT }}/postgres:latest
```
### Changes
See commit history for detailed changes.
draft: false
prerelease: ${{ needs.prepare.outputs.is_beta == 'true' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create GitHub Release in SharX repository
run: |
# Check if token is available
if [ -z "${{ secrets.SHARX_REPO_TOKEN }}" ]; then
echo "⚠️ SHARX_REPO_TOKEN not set, skipping release creation in SharX repository"
exit 0
fi
TAG="${{ needs.prepare.outputs.tag }}"
VERSION="${{ needs.prepare.outputs.version }}"
IS_BETA="${{ needs.prepare.outputs.is_beta }}"
# Try to load release notes from release-notes/ directory
RELEASE_NOTES_FILE="release-notes/$TAG.md"
if [ -f "$RELEASE_NOTES_FILE" ]; then
echo "📄 Found release notes file: $RELEASE_NOTES_FILE"
RELEASE_BODY=$(cat "$RELEASE_NOTES_FILE")
# Replace placeholders with actual values
HARBOR_HOST="${{ secrets.HARBOR_HOST }}"
HARBOR_PROJECT="${{ secrets.HARBOR_PROJECT }}"
SHARX_TAG_VERSION="${{ steps.tags.outputs.sharx_tag_version }}"
SHARX_TAG_LATEST="${{ steps.tags.outputs.sharx_tag_latest }}"
SHARXNODE_TAG_VERSION="${{ steps.tags.outputs.sharxnode_tag_version }}"
SHARXNODE_TAG_LATEST="${{ steps.tags.outputs.sharxnode_tag_latest }}"
# Replace common placeholders
RELEASE_BODY=$(echo "$RELEASE_BODY" | sed "s|{{HARBOR_HOST}}|$HARBOR_HOST|g")
RELEASE_BODY=$(echo "$RELEASE_BODY" | sed "s|{{HARBOR_PROJECT}}|$HARBOR_PROJECT|g")
RELEASE_BODY=$(echo "$RELEASE_BODY" | sed "s|{{SHARX_TAG_VERSION}}|$SHARX_TAG_VERSION|g")
RELEASE_BODY=$(echo "$RELEASE_BODY" | sed "s|{{SHARX_TAG_LATEST}}|$SHARX_TAG_LATEST|g")
RELEASE_BODY=$(echo "$RELEASE_BODY" | sed "s|{{SHARXNODE_TAG_VERSION}}|$SHARXNODE_TAG_VERSION|g")
RELEASE_BODY=$(echo "$RELEASE_BODY" | sed "s|{{SHARXNODE_TAG_LATEST}}|$SHARXNODE_TAG_LATEST|g")
else
echo "⚠️ Release notes file not found: $RELEASE_NOTES_FILE, using default description"
# Prepare default release body
RELEASE_BODY=$(cat <<EOF
## Release $TAG
### 🐳 Docker Images
Images are available in Harbor:
- **sharx**: \`$SHARX_TAG_VERSION\` / \`$SHARX_TAG_LATEST\`
- **sharxnode**: \`$SHARXNODE_TAG_VERSION\` / \`$SHARXNODE_TAG_LATEST\`
- **postgres**: $HARBOR_HOST/$HARBOR_PROJECT/postgres:16-alpine / $HARBOR_HOST/$HARBOR_PROJECT/postgres:latest
### 📦 Quick Start
Update your \`docker-compose.yml\`:
\`\`\`yaml
services:
sharx:
image: $SHARX_TAG_LATEST
sharxnode:
image: $SHARXNODE_TAG_LATEST
postgres:
image: ${{ secrets.HARBOR_HOST }}/${{ secrets.HARBOR_PROJECT }}/postgres:latest
\`\`\`
### 📝 Installation
For detailed installation instructions, see the [README](https://github.com/konstpic/SharX#quick-start--быстрый-старт).
### 🔄 Changes
See commit history for detailed changes.
EOF
)
fi
# Create release using GitHub API
RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.SHARX_REPO_TOKEN }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/konstpic/SharX/releases \
-d "{
\"tag_name\": \"$TAG\",
\"name\": \"Release $TAG\",
\"body\": $(echo "$RELEASE_BODY" | jq -Rs .),
\"draft\": false,
\"prerelease\": $IS_BETA
}")
HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
RESPONSE_BODY=$(echo "$RESPONSE" | sed '$d')
if [ "$HTTP_CODE" -eq 201 ]; then
echo "✅ Release created successfully in konstpic/SharX"
echo "$RESPONSE_BODY" | jq -r '.html_url'
elif [ "$HTTP_CODE" -eq 422 ]; then
echo "⚠️ Release already exists, attempting to update..."
# Get release ID
RELEASE_ID=$(curl -s \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.SHARX_REPO_TOKEN }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
"https://api.github.com/repos/konstpic/SharX/releases/tags/$TAG" | jq -r '.id')
if [ "$RELEASE_ID" != "null" ] && [ -n "$RELEASE_ID" ]; then
# Update existing release
UPDATE_RESPONSE=$(curl -s -w "\n%{http_code}" -X PATCH \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.SHARX_REPO_TOKEN }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
"https://api.github.com/repos/konstpic/SharX/releases/$RELEASE_ID" \
-d "{
\"name\": \"Release $TAG\",
\"body\": $(echo "$RELEASE_BODY" | jq -Rs .),
\"draft\": false,
\"prerelease\": $IS_BETA
})
UPDATE_CODE=$(echo "$UPDATE_RESPONSE" | tail -n1)
if [ "$UPDATE_CODE" -eq 200 ]; then
echo "✅ Release updated successfully in konstpic/SharX"
echo "$UPDATE_RESPONSE" | sed '$d' | jq -r '.html_url'
else
echo "❌ Failed to update release. HTTP code: $UPDATE_CODE"
echo "$UPDATE_RESPONSE" | sed '$d'
exit 1
fi
else
echo "❌ Release exists but could not get release ID"
exit 1
fi
else
echo "❌ Failed to create release. HTTP code: $HTTP_CODE"
echo "$RESPONSE_BODY"
exit 1
fi