Consolidate all Helm build and release tasks into single workflow

- Removed build-helm job from build.yml (Docker builds only now)
- Created comprehensive helm-release.yml that handles:
  - Development builds on main branch pushes (with dev suffix)
  - Release builds on version tags (v*.*.*)
  - Manual releases via workflow_dispatch
  - PR linting without publishing
- Added intelligent version detection:
  - Development versions get timestamp suffix
  - Release versions use clean semver
  - Manual dispatch can specify custom version
- Improved release process with proper Gitea API integration
- Added conditional release creation only for tagged versions
- Updated README to document the new workflow structure
- Separated concerns: build.yml for Docker, helm-release.yml for Helm
This commit is contained in:
d.viti
2025-10-03 02:35:16 +02:00
parent f9d529ac87
commit a379b26808
3 changed files with 150 additions and 133 deletions

View File

@@ -79,67 +79,3 @@ jobs:
labels: ${{ steps.meta-api.outputs.labels }} labels: ${{ steps.meta-api.outputs.labels }}
cache-from: type=registry,ref=${{ vars.PACKAGES_REGISTRY || gitea.server_url }}/${{ gitea.repository }}/api:buildcache cache-from: type=registry,ref=${{ vars.PACKAGES_REGISTRY || gitea.server_url }}/${{ gitea.repository }}/api:buildcache
cache-to: type=registry,ref=${{ vars.PACKAGES_REGISTRY || gitea.server_url }}/${{ gitea.repository }}/api:buildcache,mode=max cache-to: type=registry,ref=${{ vars.PACKAGES_REGISTRY || gitea.server_url }}/${{ gitea.repository }}/api:buildcache,mode=max
build-helm:
runs-on: ubuntu-latest
needs: [build-web, build-api]
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
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: Lint Helm chart
run: |
helm lint helm/api7ee-demo-k8s/
- name: Package Helm chart
run: |
# Get version from Chart.yaml
CHART_VERSION=$(grep '^version:' helm/api7ee-demo-k8s/Chart.yaml | awk '{print $2}')
echo "Chart version: ${CHART_VERSION}"
# Create a temporary copy of the chart for packaging
cp -r helm/api7ee-demo-k8s /tmp/api7ee-demo-k8s-chart
# Update image registry and repository in the copy's values.yaml
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
# Package the modified chart
helm package /tmp/api7ee-demo-k8s-chart --version ${CHART_VERSION}
# Store chart filename for later use
echo "CHART_FILE=api7ee-demo-k8s-${CHART_VERSION}.tgz" >> $GITHUB_ENV
- name: Push Helm chart to Gitea Package Registry
run: |
# Upload Helm chart to Gitea package registry
# Format: https://{gitea-server}/api/packages/{owner}/helm/api/charts
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 Helm index
if: success()
run: |
# Create or update the Helm repository index
echo "📝 Helm chart repository information:"
echo "To add this repository:"
echo " helm repo add api7ee https://${{ gitea.server_url }}/api/packages/${{ gitea.repository_owner }}/helm"
echo " helm repo update"
echo ""
echo "To install the chart:"
echo " helm install my-api7ee api7ee/api7ee-demo-k8s"

View File

@@ -1,71 +1,127 @@
name: Helm Chart Release name: Helm Chart Build and Release
on: on:
push: push:
branches: [main] branches: [main]
tags:
- 'v*.*.*' # Trigger on version tags like v1.0.0
pull_request: pull_request:
branches: [main] branches: [main]
workflow_dispatch: workflow_dispatch:
inputs:
version:
description: 'Chart version to release (e.g., 1.0.1)'
required: false
type: string
jobs: jobs:
release-helm: build-and-release-helm:
runs-on: ubuntu-latest 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: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0 # Fetch all history for proper versioning
- name: Install Helm - name: Install Helm
uses: azure/setup-helm@v3 uses: azure/setup-helm@v3
with: with:
version: "latest" version: "latest"
- name: Determine version - name: Determine version and release type
id: version id: version
run: | run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then # 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 }}" VERSION="${{ github.event.inputs.version }}"
else IS_RELEASE="true"
# Extract version from tag (remove 'v' prefix) echo "📌 Manual release version: ${VERSION}"
elif [[ "${{ github.ref }}" == refs/tags/v* ]]; then
# Tag-based release
VERSION=${GITEA_REF_NAME#v} 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 fi
echo "VERSION=${VERSION}"
# Export for subsequent steps
echo "VERSION=${VERSION}" >> $GITHUB_ENV echo "VERSION=${VERSION}" >> $GITHUB_ENV
echo "📌 Chart version: ${VERSION}" echo "IS_RELEASE=${IS_RELEASE}" >> $GITHUB_ENV
echo "version=${VERSION}" >> $GITHUB_OUTPUT
- name: Update Chart version echo "is_release=${IS_RELEASE}" >> $GITHUB_OUTPUT
run: |
# Update Chart.yaml with the new version
sed -i "s/^version:.*/version: ${VERSION}/" helm/api7ee-demo-k8s/Chart.yaml
# Update appVersion to match
sed -i "s/^appVersion:.*/appVersion: \"${VERSION}\"/" helm/api7ee-demo-k8s/Chart.yaml
# Update image tags in values.yaml to use this version
sed -i "s|tag: \"main\"|tag: \"v${VERSION}\"|g" helm/api7ee-demo-k8s/values.yaml
# Update registry and repository to Gitea values
sed -i "s|registry: gitea.server_url|registry: ${{ gitea.server_url }}|g" helm/api7ee-demo-k8s/values.yaml
sed -i "s|repository: gitea.repository/|repository: ${{ gitea.repository }}/|g" helm/api7ee-demo-k8s/values.yaml
echo "📝 Updated Chart.yaml and values.yaml with version ${VERSION}"
- name: Lint Helm chart - name: Lint Helm chart
run: | run: |
helm lint helm/api7ee-demo-k8s/ 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 - name: Package Helm chart
run: | run: |
helm package helm/api7ee-demo-k8s/ --version ${VERSION} 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 "CHART_FILE=api7ee-demo-k8s-${VERSION}.tgz" >> $GITHUB_ENV
# Generate chart README with installation instructions echo "📦 Packaged chart: api7ee-demo-k8s-${VERSION}.tgz"
cat > CHART_README.md << EOF
# API7 Enterprise Edition Helm Chart v${VERSION}
## Installation - 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 \`\`\`bash
# Add the Helm repository # Add the Helm repository
@@ -79,48 +135,40 @@ jobs:
helm install my-api7ee api7ee/api7ee-demo-k8s --version ${VERSION} -f values.yaml helm install my-api7ee api7ee/api7ee-demo-k8s --version ${VERSION} -f values.yaml
\`\`\` \`\`\`
## Upgrade ### Upgrade
\`\`\`bash \`\`\`bash
helm upgrade my-api7ee api7ee/api7ee-demo-k8s --version ${VERSION} helm upgrade my-api7ee api7ee/api7ee-demo-k8s --version ${VERSION}
\`\`\` \`\`\`
## Docker Images ### Docker Images
This chart uses the following Docker images: This chart uses the following Docker images:
- Web: \`${{ gitea.server_url }}/${{ gitea.repository }}/web:v${VERSION}\` - Web: \`${{ gitea.server_url }}/${{ gitea.repository }}/web:v${VERSION}\`
- API: \`${{ gitea.server_url }}/${{ gitea.repository }}/api: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 EOF
- name: Push Helm chart to Gitea Package Registry
run: |
# Upload versioned Helm chart
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 v${VERSION} pushed to Gitea Package Registry"
- name: Create Release
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
run: |
# Create release using Gitea API # Create release using Gitea API
RELEASE_DATA=$(cat <<EOF RELEASE_DATA=$(jq -n \
{ --arg tag "v${VERSION}" \
"tag_name": "v${VERSION}", --arg name "v${VERSION}" \
"target_commitish": "${{ gitea.sha }}", --arg body "$(cat RELEASE_NOTES.md)" \
"name": "v${VERSION}", --arg target "${{ gitea.sha }}" \
"body": "## Helm Chart Release v${VERSION}\n\n### Installation\n\`\`\`bash\nhelm repo add api7ee https://${{ gitea.server_url }}/api/packages/${{ gitea.repository_owner }}/helm\nhelm repo update\nhelm install my-api7ee api7ee/api7ee-demo-k8s --version ${VERSION}\n\`\`\`\n\n### Docker Images\n- Web: \`${{ gitea.server_url }}/${{ gitea.repository }}/web:v${VERSION}\`\n- API: \`${{ gitea.server_url }}/${{ gitea.repository }}/api:v${VERSION}\`\n\n### Chart Package\n- Download: [api7ee-demo-k8s-${VERSION}.tgz](https://${{ gitea.server_url }}/${{ gitea.repository }}/releases/download/v${VERSION}/api7ee-demo-k8s-${VERSION}.tgz)", '{
"draft": false, tag_name: $tag,
"prerelease": false target_commitish: $target,
} name: $name,
EOF body: $body,
) draft: false,
prerelease: false
}')
# Create the release # Create the release
RELEASE_RESPONSE=$(curl -X POST \ RELEASE_RESPONSE=$(curl -s -X POST \
-H "Authorization: token ${{ secrets.PACKAGES_PUSH_TOKEN }}" \ -H "Authorization: token ${{ secrets.PACKAGES_PUSH_TOKEN }}" \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-d "${RELEASE_DATA}" \ -d "${RELEASE_DATA}" \
@@ -139,12 +187,12 @@ jobs:
--data-binary "@${CHART_FILE}" \ --data-binary "@${CHART_FILE}" \
"https://${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}/releases/${RELEASE_ID}/assets?name=api7ee-demo-k8s-${VERSION}.tgz" "https://${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}/releases/${RELEASE_ID}/assets?name=api7ee-demo-k8s-${VERSION}.tgz"
# Upload README as release asset # Upload release notes as asset
curl -X POST \ curl -X POST \
-H "Authorization: token ${{ secrets.PACKAGES_PUSH_TOKEN }}" \ -H "Authorization: token ${{ secrets.PACKAGES_PUSH_TOKEN }}" \
-H "Content-Type: text/markdown" \ -H "Content-Type: text/markdown" \
--data-binary "@CHART_README.md" \ --data-binary "@RELEASE_NOTES.md" \
"https://${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}/releases/${RELEASE_ID}/assets?name=CHART_README.md" "https://${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}/releases/${RELEASE_ID}/assets?name=RELEASE_NOTES.md"
echo "✅ Release assets uploaded successfully" echo "✅ Release assets uploaded successfully"
else else
@@ -154,9 +202,10 @@ jobs:
- name: Summary - name: Summary
run: | run: |
echo "## 🎉 Helm Chart Release Summary" echo "## 🎉 Helm Chart Build Summary"
echo "" echo ""
echo "- **Version:** v${VERSION}" echo "- **Version:** ${VERSION}"
echo "- **Type:** $([ "${IS_RELEASE}" = "true" ] && echo "Release" || echo "Development Build")"
echo "- **Chart:** ${CHART_FILE}" echo "- **Chart:** ${CHART_FILE}"
echo "- **Registry:** https://${{ gitea.server_url }}/api/packages/${{ gitea.repository_owner }}/helm" echo "- **Registry:** https://${{ gitea.server_url }}/api/packages/${{ gitea.repository_owner }}/helm"
echo "" echo ""
@@ -164,5 +213,29 @@ jobs:
echo '```bash' echo '```bash'
echo "helm repo add api7ee https://${{ gitea.server_url }}/api/packages/${{ gitea.repository_owner }}/helm" echo "helm repo add api7ee https://${{ gitea.server_url }}/api/packages/${{ gitea.repository_owner }}/helm"
echo "helm repo update" echo "helm repo update"
echo "helm install my-api7ee api7ee/api7ee-demo-k8s --version ${VERSION}" 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 '```' 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"

View File

@@ -89,12 +89,20 @@ docker run -p 8001:8000 api-app
### Automated Pipeline ### Automated Pipeline
The `.gitea/workflows/build.yml` pipeline automatically: The CI/CD workflows automatically:
**`.gitea/workflows/build.yml`**:
1. Builds Docker images for both applications 1. Builds Docker images for both applications
2. Pushes to Gitea container registry 2. Pushes to Gitea container registry
3. Tags images with branch name 3. Tags images with branch name
4. Packages and publishes Helm chart 4. Implements layer caching for faster builds
5. Implements layer caching for faster builds
**`.gitea/workflows/helm-release.yml`**:
1. Packages Helm charts on every main branch push
2. Creates development versions for main branch builds
3. Creates release versions for tags (v*.*.*)
4. Publishes charts to Gitea Helm registry
5. Creates GitHub releases for tagged versions
**Triggers:** **Triggers:**
- Any branch push (Docker images) - Any branch push (Docker images)