diff --git a/.github/workflows/build-node-packages.yml b/.github/workflows/build-node-packages.yml index d2ce3cc..906d6d1 100644 --- a/.github/workflows/build-node-packages.yml +++ b/.github/workflows/build-node-packages.yml @@ -1,15 +1,17 @@ -name: Generate Node.js package +name: Generate Node.js packages +run-name: Generate Node.js ${{ inputs.VERSION || '18.12.0' }} on: workflow_dispatch: inputs: VERSION: description: 'Node.js version to build and upload' required: true - default: '14.2.0' + default: '18.12.0' PUBLISH_RELEASES: description: 'Whether to publish releases' required: true - default: 'false' + type: boolean + default: false pull_request: paths-ignore: - 'versions-manifest.json' @@ -18,155 +20,12 @@ on: branches: - 'main' -env: - VERSION: ${{ github.event.inputs.VERSION || '14.0.0' }} -defaults: - run: - shell: pwsh - jobs: - build_node: - name: Build Node.js ${{ github.event.inputs.VERSION || '14.0.0' }} [${{ matrix.platform }}] - runs-on: ubuntu-latest - env: - ARTIFACT_NAME: node-${{ github.event.inputs.VERSION || '14.0.0' }}-${{ matrix.platform }}-x64 - strategy: - fail-fast: false - matrix: - platform: [linux, darwin, win32] - steps: - - uses: actions/checkout@v2 - with: - submodules: true - - - name: Build Node.js ${{ env.VERSION }} - run: | - ./builders/build-node.ps1 -Version $env:VERSION ` - -Platform ${{ matrix.platform }} - - - name: Publish artifact - uses: actions/upload-artifact@v2 - with: - name: ${{ env.ARTIFACT_NAME }} - path: ${{ runner.temp }}/artifact - - test_node: - name: Test Node.js ${{ github.event.inputs.VERSION || '14.0.0' }} [${{ matrix.platform }}] - needs: build_node - runs-on: ${{ matrix.os }} - env: - ARTIFACT_NAME: node-${{ github.event.inputs.VERSION || '14.0.0' }}-${{ matrix.platform }}-x64 - strategy: - fail-fast: false - matrix: - include: - - os: ubuntu-latest - platform: linux - - os: macos-latest - platform: darwin - - os: windows-latest - platform: win32 - steps: - - uses: actions/checkout@v2 - with: - submodules: true - - - name: Fully cleanup the toolcache directory before testing - run: ./helpers/clean-toolcache.ps1 -ToolName "node" - - - name: Download artifact - uses: actions/download-artifact@v2 - with: - path: ${{ runner.temp }} - - - name: Extract files - run: | - if ('${{ matrix.platform }}' -eq 'win32') { - $artifactName = "${{ env.ARTIFACT_NAME }}.7z" - 7z.exe x "$artifactName" -y | Out-Null - } else { - $artifactName = "${{ env.ARTIFACT_NAME }}.tar.gz" - tar -xzf $artifactName - } - working-directory: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }} - - - name: Apply build artifact to the local machine - run: | - if ('${{ matrix.platform }}' -eq 'win32') { powershell ./setup.ps1 } else { sh ./setup.sh } - working-directory: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }} - - - name: Setup Node.js ${{ env.VERSION }} - uses: actions/setup-node@v2.1.2 - with: - node-version: ${{ env.VERSION }} - - - name: Wait for the logs - run: | - Write-Host "Fake step that do nothing" - Write-Host "We need it because log of previous step 'Setup Node' is not available here yet." - Write-Host "In testing step (Node.Tests.ps1) we analyze build log of 'Setup Node' task" - Write-Host "to determine if Node.js version was consumed from cache and was downloaded" - for ($i = 0; $i -lt 200; $i++) { Get-Random } - - - name: Run tests - run: | - Install-Module Pester -Force -Scope CurrentUser - Import-Module Pester - Invoke-Pester -Script ./Node.Tests.ps1 -EnableExit - working-directory: ./tests - - publish_release: - name: Publish release - if: github.event_name == 'workflow_dispatch' && github.event.inputs.PUBLISH_RELEASES == 'true' - needs: test_node - runs-on: ubuntu-latest - steps: - - uses: actions/download-artifact@v2 - - - name: Publish Release ${{ env.VERSION }} - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ env.VERSION }}-${{ github.run_id }} - release_name: ${{ env.VERSION }} - body: | - Node.js ${{ env.VERSION }} - - - name: Upload release assets - uses: actions/github-script@v2 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const fs = require('fs'); - - for (let artifactDir of fs.readdirSync('.')) { - let artifactName = fs.readdirSync(`${artifactDir}`)[0]; - - console.log(`Upload ${artifactName} asset`); - github.repos.uploadReleaseAsset({ - owner: context.repo.owner, - repo: context.repo.repo, - release_id: ${{ steps.create_release.outputs.id }}, - name: artifactName, - data: fs.readFileSync(`./${artifactDir}/${artifactName}`) - }); - } - - trigger_pr: - name: Trigger "Create Pull Request" workflow - needs: publish_release - runs-on: ubuntu-latest - steps: - - name: Trigger "Create Pull Request" workflow - uses: actions/github-script@v3 - with: - github-token: ${{ secrets.PERSONAL_TOKEN }} - script: | - github.actions.createWorkflowDispatch({ - owner: context.repo.owner, - repo: context.repo.repo, - workflow_id: 'create-pr.yml', - ref: 'main' - }); \ No newline at end of file + node: + name: Node + uses: actions/versions-package-tools/.github/workflows/build-tool-packages.yml@main + with: + tool-name: "node" + tool-version: ${{ inputs.VERSION || '18.12.0' }} + publish-release: ${{ inputs.PUBLISH_RELEASES || false }} + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/create-pr.yml b/.github/workflows/create-pr.yml index 69984ba..22e0a3c 100644 --- a/.github/workflows/create-pr.yml +++ b/.github/workflows/create-pr.yml @@ -2,32 +2,9 @@ name: Create Pull Request on: workflow_dispatch: -defaults: - run: - shell: pwsh - jobs: - create_pr: - name: Create Pull Request - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - with: - submodules: true - - - name: Create versions-manifest.json - run: | - ./helpers/packages-generation/manifest-generator.ps1 -RepositoryFullName "$env:GITHUB_REPOSITORY" ` - -GitHubAccessToken "${{secrets.GITHUB_TOKEN}}" ` - -OutputFile "./versions-manifest.json" ` - -ConfigurationFile "./config/node-manifest-config.json" - - name: Create GitHub PR - run: | - $formattedDate = Get-Date -Format "MM/dd/yyyy" - ./helpers/github/create-pull-request.ps1 ` - -RepositoryFullName "$env:GITHUB_REPOSITORY" ` - -AccessToken "${{secrets.GITHUB_TOKEN}}" ` - -BranchName "update-versions-manifest-file" ` - -CommitMessage "Update versions-manifest" ` - -PullRequestTitle "[versions-manifest] Update for release from ${formattedDate}" ` - -PullRequestBody "Update versions-manifest.json for release from ${formattedDate}" + create-pr: + uses: actions/versions-package-tools/.github/workflows/create-pr-to-update-manifest.yml@main + with: + tool-name: "node" + secrets: inherit diff --git a/.github/workflows/get-node-versions.yml b/.github/workflows/get-node-versions.yml index 41c8236..19badd4 100644 --- a/.github/workflows/get-node-versions.yml +++ b/.github/workflows/get-node-versions.yml @@ -4,94 +4,10 @@ on: - cron: '0 3,15 * * *' workflow_dispatch: -env: - TOOL_NAME: "Node" -defaults: - run: - shell: pwsh - jobs: - find_new_versions: - name: Find new versions - runs-on: ubuntu-latest - outputs: - versions_output: ${{ steps.Get_new_versions.outputs.TOOL_VERSIONS }} - steps: - - uses: actions/checkout@v2 - with: - submodules: true - - - id: Get_new_versions - name: Get new versions - run: ./helpers/get-new-tool-versions/get-new-tool-versions.ps1 -ToolName ${{ env.TOOL_NAME }} - - check_new_versions: - name: Check new versions - runs-on: ubuntu-latest - needs: find_new_versions - env: - TOOL_VERSIONS: ${{needs.find_new_versions.outputs.versions_output}} - steps: - - uses: actions/checkout@v2 - with: - submodules: true - - - name: Check Versions - if: success() && env.TOOL_VERSIONS == '' - run: | - Write-Host "No new versions were found" - Import-Module "./helpers/github/github-api.psm1" - $gitHubApi = Get-GitHubApi -RepositoryFullName "$env:GITHUB_REPOSITORY" ` - -AccessToken "${{ secrets.PERSONAL_TOKEN }}" - - $gitHubApi.CancelWorkflow("$env:GITHUB_RUN_ID") - Start-Sleep -Seconds 60 - - - name: Send Slack notification - run: | - $pipelineUrl = "$env:GITHUB_SERVER_URL/$env:GITHUB_REPOSITORY/actions/runs/$env:GITHUB_RUN_ID" - $message = "The following versions of '${{ env.TOOL_NAME }}' are available to upload: ${{ env.TOOL_VERSIONS }}\nLink to the pipeline: $pipelineUrl" - ./helpers/get-new-tool-versions/send-slack-notification.ps1 -Url "${{ secrets.SLACK_CHANNEL_URL }}" ` - -ToolName "${{ env.TOOL_NAME }}" ` - -ImageUrl "https://nodejs.org/static/images/logo-hexagon-card.png" ` - -Text "$message" - - trigger_builds: - name: Trigger builds - runs-on: ubuntu-latest - needs: [find_new_versions, check_new_versions] - env: - TOOL_VERSIONS: ${{needs.find_new_versions.outputs.versions_output}} - environment: Get Available Tools Versions - Publishing Approval - steps: - - uses: actions/checkout@v2 - with: - submodules: true - - - name: Trigger "Build Node packages" workflow - run: - ./helpers/github/run-ci-builds.ps1 -RepositoryFullName "$env:GITHUB_REPOSITORY" ` - -AccessToken "${{ secrets.PERSONAL_TOKEN }}" ` - -WorkflowFileName "build-node-packages.yml" ` - -WorkflowDispatchRef "main" ` - -ToolVersions "${{ env.TOOL_VERSIONS }}" ` - -PublishReleases "true" - - check_build: - name: Check build for failures - runs-on: ubuntu-latest - needs: [find_new_versions, check_new_versions, trigger_builds] - if: failure() - steps: - - uses: actions/checkout@v2 - with: - submodules: true - - - name: Send Slack notification if build fails - run: | - $pipelineUrl = "$env:GITHUB_SERVER_URL/$env:GITHUB_REPOSITORY/actions/runs/$env:GITHUB_RUN_ID" - $message = "The build of the '${{ env.TOOL_NAME }}' detection pipeline failed :progress-error:\nLink to the pipeline: $pipelineUrl" - ./helpers/get-new-tool-versions/send-slack-notification.ps1 -Url "${{ secrets.SLACK_CHANNEL_URL }}" ` - -ToolName "${{ env.TOOL_NAME }}" ` - -Text "$message" ` - -ImageUrl "https://nodejs.org/static/images/logo-hexagon-card.png" + get-new-node-versions: + uses: actions/versions-package-tools/.github/workflows/get-new-tool-versions.yml@main + with: + tool-name: "Node" + image-url: "https://nodejs.org/static/images/logo-hexagon-card.png" + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/validate-manifest.yml b/.github/workflows/validate-manifest.yml index 1981aea..7206bf8 100644 --- a/.github/workflows/validate-manifest.yml +++ b/.github/workflows/validate-manifest.yml @@ -1,48 +1,21 @@ name: Validate manifest - on: +# The GITHUB_TOKEN secret is used to create a PR +# The pull_request event will not be triggered by it +# That's one of the reasons we need the schedule to validate the versions-manifest.json file schedule: - cron: '0 8,20 * * *' - + workflow_dispatch: pull_request: branches: - main paths: - 'versions-manifest.json' -env: - TOOL_NAME: "Node" - -defaults: - run: - shell: pwsh - jobs: - validation: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - with: - submodules: true - - - name: Validate node-versions manifest - run: .\helpers\packages-generation\manifest-validator.ps1 -ManifestPath '.\versions-manifest.json' - - check_build: - name: Check validation for failures - runs-on: ubuntu-latest - needs: [validation] - if: failure() - steps: - - uses: actions/checkout@v2 - with: - submodules: true - - - name: Send Slack notification if validation fails - run: | - $pipelineUrl = "$env:GITHUB_SERVER_URL/$env:GITHUB_REPOSITORY/actions/runs/$env:GITHUB_RUN_ID" - $message = "The validation of node-versions manifest failed. \nLink to the pipeline: $pipelineUrl" - .\helpers\get-new-tool-versions\send-slack-notification.ps1 -Url "${{ secrets.SLACK_CHANNEL_URL }}" ` - -ToolName "${{ env.TOOL_NAME }}" ` - -Text "$message" ` - -ImageUrl "https://nodejs.org/static/images/logo-hexagon-card.png" + manifest: + uses: actions/versions-package-tools/.github/workflows/validate-manifest.yml@main + with: + tool-name: "Node" + image-url: "https://nodejs.org/static/images/logo-hexagon-card.png" + secrets: inherit \ No newline at end of file