name: Renovate CI on: pull_request: jobs: get-last-commit-message: if: contains(github.head_ref, 'renovate/') runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4.1.7 - name: Get last commit message id: get-last-commit-message run: | echo "last_commit_message=$(git log -1 --pretty=%B)" >> $GITHUB_OUTPUT update-config: needs: get-last-commit-message if: "!contains(${{ needs.get-last-commit-message.outputs.last_commit_message }}, '[ready]')" runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4.1.7 with: fetch-depth: 0 token: ${{ secrets.PERSONAL_TOKEN }} - name: Get changed files uses: jitterbit/get-changed-files@v1 id: files - name: Apply config update run: | for changed_file in ${{ steps.files.outputs.all }}; do echo "Changed file: $changed_file" # example: apps/jackett/docker-compose.yml if [[ $changed_file == *"docker-compose.yml"* ]]; then app_name=$(echo $changed_file | cut -d'/' -f 2) echo "App name: $app_name" ./.github/workflows/renovate-app-version.sh $app_name fi done - name: Commit and push changes uses: EndBug/add-and-commit@v9 with: author_name: Tipi CI author_email: ci@runtipi.io message: "Update app version [ready]" commit: --no-verify push: origin HEAD:${{ github.head_ref }} ci: needs: - update-config - get-last-commit-message if: contains(${{ needs.get-last-commit-message.outputs.last_commit_message }}, '[ready]') runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4.1.7 - name: Install Node.js uses: actions/setup-node@v4 with: node-version: 18 - uses: pnpm/action-setup@v4.0.0 name: Install pnpm id: pnpm-install with: version: 8 run_install: false - name: Get pnpm store directory id: pnpm-cache run: | echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT - uses: actions/cache@v4 name: Setup pnpm cache with: path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | ${{ runner.os }}-pnpm-store- - name: Install dependencies run: pnpm install - name: Run global tests run: pnpm test - name: Run linter run: pnpm run lint - name: Check bumped version id: check-bumped-version uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const semver = require('semver') const { data } = await github.rest.pulls.listFiles({ owner: context.repo.owner, repo: context.repo.repo, pull_number: context.issue.number }); const modifiedFiles = data.map(file => file.filename); const filesInAppsFolder = modifiedFiles.filter(file => file.includes('apps/')) if (filesInAppsFolder.length < modifiedFiles.length) { console.log('Not all files are in apps folder, skipping automerge') core.setOutput('major_bump', 'true') return } const configs = modifiedFiles.filter(file => file.includes('config.json')) let majorBump = 'false' for (const configFile of configs) { const baseContent = await github.rest.repos.getContent({ owner: context.repo.owner, repo: context.repo.repo, path: configFile, ref: context.payload.pull_request.base.ref }); const baseConfig = JSON.parse(Buffer.from(baseContent.data.content, 'base64').toString('utf-8')) const currentContent = await github.rest.repos.getContent({ owner: context.repo.owner, repo: context.repo.repo, path: configFile, ref: context.payload.pull_request.head.ref }); const currentConfig = JSON.parse(Buffer.from(currentContent.data.content, 'base64').toString('utf-8')) const baseVersion = semver.coerce(baseConfig.version) const currentVersion = semver.coerce(currentConfig.version) if (currentVersion?.major > baseVersion?.major) { console.log('Major bump detected, skipping automerge') majorBump = 'true' break } } core.setOutput('major_bump', majorBump) - name: Label this PR as "automerge" if major_bump is false if: steps.check-bumped-version.outputs.major_bump == 'false' uses: actions/github-script@v7 with: github-token: ${{ secrets.PERSONAL_TOKEN }} script: | github.rest.issues.addLabels({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, labels: ["automerge"] })