fix: allow node/logs source code in Docker build context #13
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |