Refactor: DRY up codebase and reduce complexity #1
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: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, macos-latest, windows-latest] | |
| ruby-version: ["3.1", "3.2", "3.3", "3.4"] | |
| 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 | |
| run: bundle exec rspec | |
| - name: Upload coverage artifact (Ruby 3.4, Ubuntu only) | |
| if: matrix.ruby-version == '3.4' && matrix.os == 'ubuntu-latest' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: coverage-report | |
| path: coverage/ | |
| retention-days: 1 | |
| - name: Run RuboCop (Ruby 3.4, Ubuntu only) | |
| if: matrix.ruby-version == '3.4' && matrix.os == 'ubuntu-latest' | |
| run: bundle exec rubocop || true | |
| continue-on-error: true | |
| quality: | |
| runs-on: ubuntu-latest | |
| needs: test | |
| if: always() | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Set up Ruby | |
| uses: ruby/setup-ruby@v1 | |
| with: | |
| ruby-version: "3.4" | |
| bundler-cache: true | |
| - name: Download coverage artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: coverage-report | |
| path: coverage/ | |
| continue-on-error: true | |
| - name: Upload coverage to Qlty | |
| 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 | |
| run: | | |
| curl -sSfL https://qlty.sh | sh | |
| echo "$HOME/.qlty/bin" >> $GITHUB_PATH | |
| ~/.qlty/bin/qlty check || 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.4" | |
| 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, quality, security] | |
| if: github.event_name == 'push' | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Ruby | |
| uses: ruby/setup-ruby@v1 | |
| with: | |
| ruby-version: "3.4" | |
| 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/ergane/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/ergane/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 ergane.gemspec | |
| - name: Get gem info | |
| id: gem_info | |
| run: | | |
| GEM_FILE=$(ls *.gem) | |
| GEM_VERSION=$(echo $GEM_FILE | sed 's/ergane-\(.*\)\.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 | |
| - 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 | |
| deploy: | |
| runs-on: ubuntu-latest | |
| needs: build | |
| if: github.ref == 'refs/heads/main' | |
| environment: | |
| name: production | |
| url: https://github.com/TwilightCoders/ergane/packages | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Ruby | |
| uses: ruby/setup-ruby@v1 | |
| with: | |
| ruby-version: "3.4" | |
| bundler-cache: true | |
| - name: Download gem artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| pattern: gem-* | |
| merge-multiple: true | |
| - name: Publish to GitHub Packages | |
| id: publish | |
| continue-on-error: true | |
| run: | | |
| set -o pipefail | |
| mkdir -p ~/.gem | |
| cat << EOF > ~/.gem/credentials | |
| --- | |
| :github: Bearer ${{ secrets.GITHUB_TOKEN }} | |
| EOF | |
| chmod 600 ~/.gem/credentials | |
| if gem push --key github --host https://rubygems.pkg.github.com/TwilightCoders *.gem 2>&1 | tee publish_output.log; then | |
| echo "success=true" >> $GITHUB_OUTPUT | |
| echo "message=Successfully published $(ls *.gem)" >> $GITHUB_OUTPUT | |
| else | |
| if grep -q "already exists" publish_output.log || grep -q "Repushing of gem versions is not allowed" publish_output.log; then | |
| echo "success=false" >> $GITHUB_OUTPUT | |
| echo "message=Version $(ls *.gem) already exists in GitHub Packages" >> $GITHUB_OUTPUT | |
| else | |
| echo "success=false" >> $GITHUB_OUTPUT | |
| echo "message=Failed to publish: $(cat publish_output.log)" >> $GITHUB_OUTPUT | |
| fi | |
| fi | |
| - name: Deployment summary | |
| run: | | |
| if [ "${{ steps.publish.outputs.success }}" == "true" ]; then | |
| echo "## Deployment Complete" >> $GITHUB_STEP_SUMMARY | |
| echo "${{ steps.publish.outputs.message }}" >> $GITHUB_STEP_SUMMARY | |
| else | |
| echo "## Deployment Skipped" >> $GITHUB_STEP_SUMMARY | |
| echo "${{ steps.publish.outputs.message }}" >> $GITHUB_STEP_SUMMARY | |
| fi |