name: Helm Chart Build and Release on: push: branches: [main] tags: - 'v*.*.*' # Trigger on version tags like v1.0.0 pull_request: branches: [main] workflow_dispatch: inputs: version: description: 'Chart version to release (e.g., 1.0.1)' required: false type: string jobs: build-and-release-helm: runs-on: ubuntu-latest # Only run on main branch pushes or tags (not on PRs) if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch all history for proper versioning - name: Install Helm uses: azure/setup-helm@v3 with: version: "latest" - name: Determine version and release type id: version run: | # Determine if this is a release or regular build IS_RELEASE="false" if [ "${{ github.event_name }}" = "workflow_dispatch" ] && [ -n "${{ github.event.inputs.version }}" ]; then # Manual release with specified version VERSION="${{ github.event.inputs.version }}" IS_RELEASE="true" echo "📌 Manual release version: ${VERSION}" elif [[ "${{ github.ref }}" == refs/tags/v* ]]; then # Tag-based release VERSION=${GITEA_REF_NAME#v} IS_RELEASE="true" echo "📌 Tag release version: ${VERSION}" else # Regular build from main branch VERSION=$(grep '^version:' helm/api7ee-demo-k8s/Chart.yaml | awk '{print $2}') # Append build number or timestamp for dev versions BUILD_SUFFIX="-dev.$(date +%Y%m%d%H%M%S)" VERSION="${VERSION}${BUILD_SUFFIX}" echo "📌 Development version: ${VERSION}" fi echo "VERSION=${VERSION}" >> $GITHUB_ENV echo "IS_RELEASE=${IS_RELEASE}" >> $GITHUB_ENV echo "version=${VERSION}" >> $GITHUB_OUTPUT echo "is_release=${IS_RELEASE}" >> $GITHUB_OUTPUT - name: Lint Helm chart run: | helm lint helm/api7ee-demo-k8s/ - name: Prepare Helm chart for packaging run: | # Create a temporary copy of the chart for packaging cp -r helm/api7ee-demo-k8s /tmp/api7ee-demo-k8s-chart # Update version in the temporary copy if [ "${IS_RELEASE}" = "true" ]; then # For releases, update Chart.yaml with the release version sed -i "s/^version:.*/version: ${VERSION}/" /tmp/api7ee-demo-k8s-chart/Chart.yaml sed -i "s/^appVersion:.*/appVersion: \"${VERSION}\"/" /tmp/api7ee-demo-k8s-chart/Chart.yaml # Update image tags to use the release version sed -i "s|tag: \"main\"|tag: \"v${VERSION}\"|g" /tmp/api7ee-demo-k8s-chart/values.yaml else # For dev builds, just update the version but keep main tag sed -i "s/^version:.*/version: ${VERSION}/" /tmp/api7ee-demo-k8s-chart/Chart.yaml fi # Update image registry and repository to match Gitea sed -i "s|registry: gitea.server_url|registry: ${{ gitea.server_url }}|g" /tmp/api7ee-demo-k8s-chart/values.yaml sed -i "s|repository: gitea.repository/|repository: ${{ gitea.repository }}/|g" /tmp/api7ee-demo-k8s-chart/values.yaml echo "📝 Chart prepared with version ${VERSION}" - name: Package Helm chart run: | helm package /tmp/api7ee-demo-k8s-chart --version ${VERSION} # Store chart filename for later use echo "CHART_FILE=api7ee-demo-k8s-${VERSION}.tgz" >> $GITHUB_ENV echo "📦 Packaged chart: api7ee-demo-k8s-${VERSION}.tgz" - name: Push Helm chart to Gitea Package Registry run: | # Upload Helm chart to Gitea package registry echo "📤 Uploading chart to Gitea Package Registry..." curl --fail-with-body \ -H "Authorization: token ${{ secrets.PACKAGES_PUSH_TOKEN }}" \ -X POST \ -F "chart=@${CHART_FILE}" \ https://${{ gitea.server_url }}/api/packages/${{ gitea.repository_owner }}/helm/api/charts echo "✅ Helm chart pushed successfully to Gitea Package Registry" echo "📦 Chart: ${CHART_FILE}" echo "🔗 Registry URL: https://${{ gitea.server_url }}/api/packages/${{ gitea.repository_owner }}/helm" - name: Create Release (for tagged versions only) if: env.IS_RELEASE == 'true' run: | echo "🎉 Creating release for version ${VERSION}" # Generate release notes cat > RELEASE_NOTES.md << EOF ## Helm Chart Release v${VERSION} ### Installation \`\`\`bash # Add the Helm repository helm repo add api7ee https://${{ gitea.server_url }}/api/packages/${{ gitea.repository_owner }}/helm helm repo update # Install the chart helm install my-api7ee api7ee/api7ee-demo-k8s --version ${VERSION} # Install with custom values helm install my-api7ee api7ee/api7ee-demo-k8s --version ${VERSION} -f values.yaml \`\`\` ### Upgrade \`\`\`bash helm upgrade my-api7ee api7ee/api7ee-demo-k8s --version ${VERSION} \`\`\` ### Docker Images This chart uses the following Docker images: - Web: \`${{ gitea.server_url }}/${{ gitea.repository }}/web:v${VERSION}\` - API: \`${{ gitea.server_url }}/${{ gitea.repository }}/api:v${VERSION}\` ### Chart Download Direct download: [api7ee-demo-k8s-${VERSION}.tgz](https://${{ gitea.server_url }}/${{ gitea.repository }}/releases/download/v${VERSION}/api7ee-demo-k8s-${VERSION}.tgz) EOF # Create release using Gitea API RELEASE_DATA=$(jq -n \ --arg tag "v${VERSION}" \ --arg name "v${VERSION}" \ --arg body "$(cat RELEASE_NOTES.md)" \ --arg target "${{ gitea.sha }}" \ '{ tag_name: $tag, target_commitish: $target, name: $name, body: $body, draft: false, prerelease: false }') # Create the release RELEASE_RESPONSE=$(curl -s -X POST \ -H "Authorization: token ${{ secrets.PACKAGES_PUSH_TOKEN }}" \ -H "Content-Type: application/json" \ -d "${RELEASE_DATA}" \ "https://${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}/releases") # Get release ID RELEASE_ID=$(echo $RELEASE_RESPONSE | jq -r '.id') if [ "$RELEASE_ID" != "null" ] && [ -n "$RELEASE_ID" ]; then echo "✅ Release created with ID: $RELEASE_ID" # Upload chart file as release asset curl -X POST \ -H "Authorization: token ${{ secrets.PACKAGES_PUSH_TOKEN }}" \ -H "Content-Type: application/gzip" \ --data-binary "@${CHART_FILE}" \ "https://${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}/releases/${RELEASE_ID}/assets?name=api7ee-demo-k8s-${VERSION}.tgz" # Upload release notes as asset curl -X POST \ -H "Authorization: token ${{ secrets.PACKAGES_PUSH_TOKEN }}" \ -H "Content-Type: text/markdown" \ --data-binary "@RELEASE_NOTES.md" \ "https://${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}/releases/${RELEASE_ID}/assets?name=RELEASE_NOTES.md" echo "✅ Release assets uploaded successfully" else echo "⚠️ Failed to create release" echo "Response: $RELEASE_RESPONSE" fi - name: Summary run: | echo "## 🎉 Helm Chart Build Summary" echo "" echo "- **Version:** ${VERSION}" echo "- **Type:** $([ "${IS_RELEASE}" = "true" ] && echo "Release" || echo "Development Build")" echo "- **Chart:** ${CHART_FILE}" echo "- **Registry:** https://${{ gitea.server_url }}/api/packages/${{ gitea.repository_owner }}/helm" echo "" echo "### Installation Commands" echo '```bash' echo "helm repo add api7ee https://${{ gitea.server_url }}/api/packages/${{ gitea.repository_owner }}/helm" echo "helm repo update" if [ "${IS_RELEASE}" = "true" ]; then echo "helm install my-api7ee api7ee/api7ee-demo-k8s --version ${VERSION}" else echo "# For development version:" echo "helm install my-api7ee api7ee/api7ee-demo-k8s --version ${VERSION} --devel" fi echo '```' lint-only: runs-on: ubuntu-latest # Only run on PRs if: github.event_name == 'pull_request' steps: - name: Checkout code uses: actions/checkout@v4 - name: Install Helm uses: azure/setup-helm@v3 with: version: "latest" - name: Lint Helm chart run: | echo "🔍 Linting Helm chart for PR..." helm lint helm/api7ee-demo-k8s/ echo "✅ Helm chart linting passed"