name: Mobile Release on: workflow_dispatch: inputs: app: description: 'Mobile App' required: true type: choice options: - worker - client environment: description: 'Environment' required: true type: choice options: - dev - stage - prod version: description: 'Version (e.g., 0.1.0)' required: true type: string create_github_release: description: 'Create GitHub Release' required: true type: boolean default: true prerelease: description: 'Mark as Pre-release' required: false type: boolean default: false jobs: validate-and-create-release: name: 🚀 Create Mobile Release runs-on: ubuntu-latest permissions: contents: write steps: - name: 📥 Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: 🔍 Validate version format run: | VERSION="${{ github.event.inputs.version }}" if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "❌ Error: Version must be in format X.Y.Z (e.g., 0.1.0)" exit 1 fi echo "✅ Version format valid: $VERSION" - name: 🏷️ Generate tag name id: tag run: | APP="${{ github.event.inputs.app }}" ENV="${{ github.event.inputs.environment }}" VERSION="${{ github.event.inputs.version }}" TAG_NAME="krow-withus-${APP}-mobile/${ENV}-v${VERSION}" echo "tag_name=${TAG_NAME}" >> $GITHUB_OUTPUT echo "📌 Tag to create: ${TAG_NAME}" - name: 🔍 Check if tag already exists run: | TAG_NAME="${{ steps.tag.outputs.tag_name }}" if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then echo "❌ Error: Tag $TAG_NAME already exists" exit 1 fi echo "✅ Tag does not exist, proceeding..." - name: 📝 Verify CHANGELOG exists run: | APP="${{ github.event.inputs.app }}" if [ "$APP" = "worker" ]; then CHANGELOG_PATH="apps/mobile/apps/staff/CHANGELOG.md" else CHANGELOG_PATH="apps/mobile/apps/client/CHANGELOG.md" fi if [ ! -f "$CHANGELOG_PATH" ]; then echo "⚠️ Warning: CHANGELOG not found at $CHANGELOG_PATH" else echo "✅ CHANGELOG found at $CHANGELOG_PATH" echo "changelog_path=${CHANGELOG_PATH}" >> $GITHUB_ENV fi - name: 📋 Extract release notes from CHANGELOG id: release_notes run: | APP="${{ github.event.inputs.app }}" VERSION="${{ github.event.inputs.version }}" if [ "$APP" = "worker" ]; then CHANGELOG_PATH="apps/mobile/apps/staff/CHANGELOG.md" APP_NAME="Staff Mobile App (Worker)" else CHANGELOG_PATH="apps/mobile/apps/client/CHANGELOG.md" APP_NAME="Client Mobile App" fi # Try to extract release notes for this version if [ -f "$CHANGELOG_PATH" ]; then # Extract section for this version NOTES=$(awk "/## \[${VERSION}\]/,/^## \[/" "$CHANGELOG_PATH" | sed '1d;$d' | sed '/^$/d') if [ -z "$NOTES" ]; then NOTES="Release $VERSION for $APP_NAME No CHANGELOG entry found for this version. Please update the CHANGELOG manually. **Environment:** ${{ github.event.inputs.environment }} **Tag:** ${{ steps.tag.outputs.tag_name }}" else NOTES="# $APP_NAME - Release $VERSION $NOTES --- **Environment:** ${{ github.event.inputs.environment }} **Tag:** ${{ steps.tag.outputs.tag_name }}" fi else NOTES="Release $VERSION for $APP_NAME **Environment:** ${{ github.event.inputs.environment }} **Tag:** ${{ steps.tag.outputs.tag_name }}" fi # Save to file to handle multiline echo "$NOTES" > /tmp/release_notes.md echo "notes_file=/tmp/release_notes.md" >> $GITHUB_OUTPUT - name: 🏷️ Create Git Tag run: | TAG_NAME="${{ steps.tag.outputs.tag_name }}" APP="${{ github.event.inputs.app }}" ENV="${{ github.event.inputs.environment }}" VERSION="${{ github.event.inputs.version }}" git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" git tag -a "$TAG_NAME" -m "Release ${APP} mobile app ${VERSION} to ${ENV}" git push origin "$TAG_NAME" echo "✅ Tag created and pushed: $TAG_NAME" - name: 📦 Create GitHub Release if: ${{ github.event.inputs.create_github_release == 'true' }} env: GH_TOKEN: ${{ github.token }} run: | TAG_NAME="${{ steps.tag.outputs.tag_name }}" APP="${{ github.event.inputs.app }}" ENV="${{ github.event.inputs.environment }}" VERSION="${{ github.event.inputs.version }}" # Generate release title if [ "$APP" = "worker" ]; then APP_DISPLAY="Worker Mobile" else APP_DISPLAY="Client Mobile" fi ENV_UPPER=$(echo "$ENV" | tr '[:lower:]' '[:upper:]') RELEASE_NAME="Krow With Us - ${APP_DISPLAY} - ${ENV_UPPER} - v${VERSION}" # Create release if [ "${{ github.event.inputs.prerelease }}" = "true" ]; then gh release create "$TAG_NAME" \ --title "$RELEASE_NAME" \ --notes-file "${{ steps.release_notes.outputs.notes_file }}" \ --prerelease else gh release create "$TAG_NAME" \ --title "$RELEASE_NAME" \ --notes-file "${{ steps.release_notes.outputs.notes_file }}" fi echo "✅ GitHub Release created: $RELEASE_NAME" - name: 📊 Release Summary run: | echo "## 🚀 Release Created Successfully" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**App:** ${{ github.event.inputs.app }}" >> $GITHUB_STEP_SUMMARY echo "**Environment:** ${{ github.event.inputs.environment }}" >> $GITHUB_STEP_SUMMARY echo "**Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY echo "**Tag:** \`${{ steps.tag.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY if [ "${{ github.event.inputs.app }}" = "worker" ]; then APP_DISPLAY="Worker Mobile" else APP_DISPLAY="Client Mobile" fi ENV_UPPER=$(echo "${{ github.event.inputs.environment }}" | tr '[:lower:]' '[:upper:]') RELEASE_NAME="Krow With Us - ${APP_DISPLAY} - ${ENV_UPPER} - v${{ github.event.inputs.version }}" echo "**Release Name:** $RELEASE_NAME" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### Next Steps" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "1. Verify the tag and release on GitHub" >> $GITHUB_STEP_SUMMARY echo "2. Trigger CodeMagic build (if configured)" >> $GITHUB_STEP_SUMMARY echo "3. Monitor app store deployment" >> $GITHUB_STEP_SUMMARY echo "4. Update project documentation if needed" >> $GITHUB_STEP_SUMMARY