name: valet-issue-ops on: issue_comment: types: [created] permissions: contents: read issues: write env: GITHUB_INSTANCE_URL: https://github.com GITHUB_ACCESS_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }} JENKINS_INSTANCE_URL: https://jenkout.westus2.cloudapp.azure.com JENKINS_USERNAME: ${{ secrets.jenkins_username }} JENKINS_ACCESS_TOKEN: ${{ secrets.jenkins_access_token }} JENKINSFILE_ACCESS_TOKEN: ${{ secrets.jenkinsfile_access_token }} AZURE_DEVOPS_ACCESS_TOKEN: ${{ secrets.azure_devops_access_token }} TRAVIS_CI_ACCESS_TOKEN: ${{ secrets.travis_ci_access_token }} TRAVIS_CI_SOURCE_GITHUB_ACCESS_TOKEN: ${{ secrets.travis_ci_source_github_access_token }} GITLAB_ACCESS_TOKEN: ${{ secrets.gitlab_access_token }} CIRCLE_CI_ACCESS_TOKEN: ${{ secrets.circle_ci_access_token }} CIRCLE_CI_SOURCE_GITHUB_ACCESS_TOKEN: ${{ secrets.circle_ci_source_github_access_token }} jobs: execute-valet: runs-on: ubuntu-latest outputs: command: ${{ steps.prepare.outputs.command }} log-filename: ${{ steps.logs.outputs.filename }} container: image: ghcr.io/valet-customers/valet-cli:latest credentials: username: ${{ secrets.valet_ghcr_username }} password: ${{ secrets.valet_ghcr_password }} steps: - uses: actions-ecosystem/action-add-labels@v1 if: always() with: github_token: ${{ secrets.GITHUB_TOKEN }} labels: valet-running - uses: actions/checkout@v2 - name: Install dependencies run: bundle install --without development - name: Prepare arguments id: prepare run: | echo "${{ toJSON(github.event.issue.labels.*.name) }}" ./bin/parse_issue "${{ github.event.issue.body }}" "${{ github.event.comment.body }}" "${{ toJSON(github.event.issue.labels.*.name) }}" - name: Validate arguments run: | if [ -z "${{ steps.prepare.outputs.provider }}" ]; then echo "Unable to determine provider" exit 1 elif [ -z "${{ steps.prepare.outputs.command }}" ]; then echo "Unable to determine command" exit 1 fi - id: installation-id run: | id=$(echo "{\"issueOpsRepository\":\"$(echo $GITHUB_REPOSITORY | sha1sum)\" }" | base64) echo ::set-output name=id::$id - name: execute valet env: INSTALLATION_ID: ${{ steps.installation-id.outputs.id }} run: | valet ${{ steps.prepare.outputs.command }} ${{ steps.prepare.outputs.provider }} \ ${{ steps.prepare.outputs.args }} \ --output-dir /data/output - uses: actions/upload-artifact@v2 if: always() with: path: /data/output/ name: output - if: always() id: logs run: | path=$(ls /data/output/log/*.log | head -1) filename=$(basename "$path") echo "LOG_FILE_PATH=$path" >> $GITHUB_ENV echo "::set-output name=filename::$filename" - uses: actions/upload-artifact@v2 if: always() with: path: ${{ env.LOG_FILE_PATH }} name: logs audit: runs-on: ubuntu-latest if: needs.execute-valet.outputs.command == 'audit' needs: execute-valet steps: - uses: actions/download-artifact@v2 if: always() with: name: output - uses: actions/github-script@v5 with: script: | const fs = require('fs') const summaryText = fs.readFileSync("./audit_summary.md", "utf8") const artifactUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${process.env.GITHUB_RUN_ID}` const body = `Audit successfully completed :rocket:
Audit summary :point_down: \`\`\` ${summaryText} \`\`\`
Download full results [here](${artifactUrl}) ` await github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body }) dry-run: runs-on: ubuntu-latest if: needs.execute-valet.outputs.command == 'dry-run' needs: execute-valet steps: - uses: actions/download-artifact@v2 if: always() with: name: output - uses: actions/github-script@v5 with: script: | const fs = require('fs') const directory = "${{ github.workspace }}/" const globber = await glob.create(`${directory}**/*.yml`) const workflows = [] for await (const file of globber.globGenerator()) { const content = fs.readFileSync(file, 'utf8') workflows.push( "
", ` ${file.substring(directory.length)}`, "", "```yaml", content, "```", "
", "" ); } const body = `Dry run was successful :boom: Transformed workflows: ${workflows.join("\n")} ` await github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body }) migrate: runs-on: ubuntu-latest if: needs.execute-valet.outputs.command == 'migrate' needs: execute-valet steps: - uses: actions/download-artifact@v2 if: always() with: name: logs - id: pull-request-url run: | pullRequest=$(grep "${{ env.pullRequestPattern }}" ${{ needs.execute-valet.outputs.log-filename }} | sed -rn "s/^.*${{ env.pullRequestPattern }}'(.+)'.*$/\1/p") echo $pullRequest echo ::set-output name=output::$pullRequest env: pullRequestPattern: "Pull request: " - uses: actions/github-script@v5 env: PULL_REQUEST_URL: "${{ steps.pull-request-url.outputs.output }}" with: script: | const body = `Migration was successful :sparkles: Continue to the [pull request](${process.env.PULL_REQUEST_URL}) to complete the migration. ` try { await github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body }) } catch(e) { console.log(e) } cleanup: runs-on: ubuntu-latest needs: [execute-valet, audit, migrate, dry-run] if: always() steps: - uses: actions/download-artifact@v2 if: always() && needs.execute-valet.result == 'failure' with: name: logs - uses: actions/github-script@v5 if: always() && needs.execute-valet.result == 'failure' with: script: | const fs = require('fs') const body = `Something went wrong. Please check the logs for more information.
Logs :point_down: \`\`\` ${fs.readFileSync("${{ needs.execute-valet.outputs.log-filename }}", "utf8")} \`\`\`
` await github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body }) - uses: actions-ecosystem/action-remove-labels@v1 if: always() with: github_token: ${{ secrets.GITHUB_TOKEN }} labels: valet-running