name: 'run-tests' description: 'Runs go test and upload a step summary' inputs: filter: description: 'The go test pattern for the tests to run' required: false default: '' upload-logs-name: description: 'Choose the name of the log artifact' required: false default: logs-${{ github.job }}-${{ strategy.job-index }} upload-logs: description: 'If true uploads logs of each tests as an artifact' required: false default: 'true' runs: using: composite steps: - uses: actions/github-script@v6 with: github-token: none # No reason to grant access to the GITHUB_TOKEN script: | let myOutput = ''; var fs = require('fs'); var uploadLogs = process.env.UPLOAD_LOGS === 'true'; if(uploadLogs) { await io.mkdirP('logs'); } var filename = null; const options = {}; options.ignoreReturnCode = true; options.env = Object.assign({}, process.env); delete options.env.ACTIONS_RUNTIME_URL; delete options.env.ACTIONS_RUNTIME_TOKEN; delete options.env.ACTIONS_CACHE_URL; options.listeners = { stdout: (data) => { for(line of data.toString().split('\n')) { if(/^\s*(===\s[^\s]+\s|---\s[^\s]+:\s)/.test(line)) { if(uploadLogs) { var runprefix = "=== RUN "; if(line.startsWith(runprefix)) { filename = "logs/" + line.substring(runprefix.length).replace(/[^A-Za-z0-9]/g, '-') + ".txt"; fs.writeFileSync(filename, line + "\n"); } else if(filename) { fs.appendFileSync(filename, line + "\n"); filename = null; } } myOutput += line + "\n"; } else if(filename) { fs.appendFileSync(filename, line + "\n"); } } } }; var args = ['test', '-v', '-cover', '-coverprofile=coverage.txt', '-covermode=atomic', '-timeout', '20m']; var filter = process.env.FILTER; if(filter) { args.push('-run'); args.push(filter); } args.push('./...'); var exitcode = await exec.exec('go', args, options); if(process.env.GITHUB_STEP_SUMMARY) { core.summary.addCodeBlock(myOutput); await core.summary.write(); } process.exit(exitcode); env: FILTER: ${{ inputs.filter }} UPLOAD_LOGS: ${{ inputs.upload-logs }} - uses: actions/upload-artifact@v3 if: always() && inputs.upload-logs == 'true' && !env.ACT with: name: ${{ inputs.upload-logs-name }} path: logs