Add test coverage and make build release manual #7
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: CI | |
| on: | |
| push: | |
| branches: [main, develop, release/**] | |
| pull_request: | |
| branches: [main, develop] | |
| permissions: | |
| actions: write | |
| contents: read | |
| id-token: write | |
| packages: write | |
| jobs: | |
| test: | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| ruby-version: ["2.7", "3.0", "3.1", "3.2", "3.3"] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Ruby ${{ matrix.ruby-version }} | |
| uses: ruby/setup-ruby@v1 | |
| with: | |
| ruby-version: ${{ matrix.ruby-version }} | |
| bundler-cache: true | |
| - name: Run tests with coverage | |
| run: bundle exec rspec | |
| - name: Test CLI | |
| run: bundle exec bin/gemplate --help | |
| - name: Upload coverage to Qlty | |
| if: matrix.ruby-version == '3.3' | |
| uses: qltysh/qlty-action/coverage@v1 | |
| continue-on-error: true | |
| env: | |
| QLTY_COVERAGE_TOKEN: ${{ secrets.QLTY_COVERAGE_TOKEN }} | |
| with: | |
| oidc: true | |
| files: coverage/coverage.json | |
| - name: Run Qlty code quality checks | |
| if: matrix.ruby-version == '3.3' | |
| run: | | |
| curl -sSfL https://qlty.sh | sh | |
| echo "$HOME/.qlty/bin" >> $GITHUB_PATH | |
| ~/.qlty/bin/qlty check || true | |
| continue-on-error: true | |
| - name: Run RuboCop (Ruby 3.3 only) | |
| if: matrix.ruby-version == '3.3' | |
| run: bundle exec rubocop || true | |
| continue-on-error: true | |
| security: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Ruby | |
| uses: ruby/setup-ruby@v1 | |
| with: | |
| ruby-version: "3.3" | |
| bundler-cache: true | |
| - name: Run bundle audit | |
| run: | | |
| gem install bundler-audit | |
| bundle audit --update || true | |
| continue-on-error: true | |
| build: | |
| runs-on: ubuntu-latest | |
| needs: [test, security] | |
| if: github.event_name == 'push' | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Ruby | |
| uses: ruby/setup-ruby@v1 | |
| with: | |
| ruby-version: "3.3" | |
| bundler-cache: true | |
| - name: Modify version for develop branch | |
| if: github.ref == 'refs/heads/develop' | |
| run: | | |
| SHORT_SHA=$(git rev-parse --short HEAD) | |
| sed -i "s/VERSION = '\([^']*\)'/VERSION = '\1.dev.${SHORT_SHA}'/" lib/gemplate/version.rb | |
| echo "VERSION_SUFFIX=.dev.${SHORT_SHA}" >> $GITHUB_ENV | |
| - name: Modify version for release branch | |
| if: startsWith(github.ref, 'refs/heads/release/') | |
| run: | | |
| SHORT_SHA=$(git rev-parse --short HEAD) | |
| sed -i "s/VERSION = '\([^']*\)'/VERSION = '\1.rc.${SHORT_SHA}'/" lib/gemplate/version.rb | |
| echo "VERSION_SUFFIX=.rc.${SHORT_SHA}" >> $GITHUB_ENV | |
| - name: Set version suffix for main | |
| if: github.ref == 'refs/heads/main' | |
| run: echo "VERSION_SUFFIX=" >> $GITHUB_ENV | |
| - name: Build gem | |
| run: gem build gemplate.gemspec | |
| - name: Get gem info | |
| id: gem_info | |
| run: | | |
| GEM_FILE=$(ls *.gem) | |
| GEM_VERSION=$(echo $GEM_FILE | sed 's/gemplate-\(.*\)\.gem/\1/') | |
| echo "gem_file=$GEM_FILE" >> $GITHUB_OUTPUT | |
| echo "gem_version=$GEM_VERSION" >> $GITHUB_OUTPUT | |
| - name: Store gem artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: gem-${{ steps.gem_info.outputs.gem_version }} | |
| path: "*.gem" | |
| retention-days: 30 | |
| deploy: | |
| runs-on: ubuntu-latest | |
| needs: build | |
| if: github.ref == 'refs/heads/main' | |
| environment: | |
| name: production | |
| url: https://github.com/TwilightCoders/gemplate/packages | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Ruby | |
| uses: ruby/setup-ruby@v1 | |
| with: | |
| ruby-version: "3.3" | |
| bundler-cache: true | |
| - name: Download gem artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| pattern: gem-* | |
| merge-multiple: true | |
| - name: Show deployment details | |
| run: | | |
| echo "## 🚀 Ready to Deploy" >> $GITHUB_STEP_SUMMARY | |
| echo "**Gem**: $(ls *.gem)" >> $GITHUB_STEP_SUMMARY | |
| echo "**Branch**: ${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY | |
| echo "**Commit**: ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY | |
| echo "**Size**: $(ls -lh *.gem | awk '{print $5}')" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "This deployment requires manual approval via GitHub Environments." >> $GITHUB_STEP_SUMMARY | |
| - name: Publish to GitHub Packages | |
| run: | | |
| mkdir -p ~/.gem | |
| cat << EOF > ~/.gem/credentials | |
| --- | |
| :github: Bearer ${{ secrets.GITHUB_TOKEN }} | |
| EOF | |
| chmod 600 ~/.gem/credentials | |
| gem push --key github --host https://rubygems.pkg.github.com/TwilightCoders *.gem | |
| - name: Deployment summary | |
| run: | | |
| echo "## ✅ Deployment Complete" >> $GITHUB_STEP_SUMMARY | |
| echo "Published $(ls *.gem) to GitHub Packages" >> $GITHUB_STEP_SUMMARY | |
| - name: Create build summary | |
| run: | | |
| echo "## Gem Built Successfully 💎" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Version**: ${{ steps.gem_info.outputs.gem_version }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **File**: ${{ steps.gem_info.outputs.gem_file }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Branch**: ${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Commit**: ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "🚀 **Ready to publish!** Use the 'Manual Release' workflow to publish this gem." >> $GITHUB_STEP_SUMMARY |