From 414a9c4d19a9792c5d8fb39571635452dc9925c6 Mon Sep 17 00:00:00 2001 From: MaksimZhukov Date: Wed, 19 Aug 2020 13:38:27 +0300 Subject: [PATCH] Move CI --- .github/workflows/build-node-packages.yml | 202 ++++++++++++++++++++++ .github/workflows/create-pr.yml | 37 ++++ builders/node-builder.psm1 | 4 +- tests/Node.Tests.ps1 | 12 +- 4 files changed, 250 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/build-node-packages.yml create mode 100644 .github/workflows/create-pr.yml diff --git a/.github/workflows/build-node-packages.yml b/.github/workflows/build-node-packages.yml new file mode 100644 index 0000000..adc5498 --- /dev/null +++ b/.github/workflows/build-node-packages.yml @@ -0,0 +1,202 @@ +name: Generate Node.js +on: +# TODO: currently workflow dispatch endpoint does not work. I will investigate + workflow_dispatch: + inputs: + VERSION: + description: 'Node version to build and upload' + required: true + default: '14.2.0' + PUBLISH_RELEASES: + description: 'Whether to publish releases' + required: true + default: 'false' + +env: + VERSION: ${{ github.event.inputs.VERSION }} + ARCHITECTURE: x64 + +jobs: + build_node: + name: Build Node ${{ github.event.inputs.VERSION }} ${{ matrix.platform }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + platform: [linux, darwin, win32] + steps: + - uses: actions/checkout@v2 + with: + submodules: true + + - name: Create artifact directories + run: | + binariesDirectory=$RUNNER_WORKSPACE/binaries + echo ::set-env name=BINARIES_DIRECTORY::$binariesDirectory + mkdir $binariesDirectory + + artifactDirectory=$RUNNER_WORKSPACE/artifact + echo ::set-env name=ARTIFACT_DIRECTORY::$artifactDirectory + mkdir $artifactDirectory + + - name: Build Node ${{ env.VERSION }} + run: | + ./builders/build-node.ps1 -Version $env:VERSION ` + -Platform ${{ matrix.platform }} ` + -Architecture $env:ARCHITECTURE + shell: pwsh + + - name: Publish artifact + uses: actions/upload-artifact@v2 + with: + name: node-${{ env.VERSION }}-${{ matrix.platform }} + path: /home/runner/work/node-versions/artifact + + test_node: + name: Test Node ${{ github.event.inputs.VERSION }} ${{ matrix.platform }} + needs: build_node + runs-on: ${{ matrix.os }}-latest + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu + platform: linux + - os: macos + platform: darwin + - os: windows + platform: win32 + steps: + - uses: actions/checkout@v2 + with: + submodules: true + + - name: Set AGENT_TOOLSDIRECTORY variable + if: matrix.platform == 'win32' + run: | + # GitHub Windows images don't have `AGENT_TOOLSDIRECTORY` variable + echo ::set-env name=AGENT_TOOLSDIRECTORY::$RUNNER_TOOL_CACHE + shell: bash + + - name: Fully cleanup the toolcache directory before testing + run: | + ./helpers/clean-toolcache.ps1 -ToolName "node" + shell: pwsh + + - name: Download artifact + uses: actions/download-artifact@v2 + with: + path: ${{ runner.temp }} + + - name: Extract files + run: | + if ('${{ matrix.platform }}' -eq 'win32') { + $artifactName = "node-${{ env.VERSION }}-${{ matrix.platform }}-${{ env.ARCHITECTURE }}.7z" + 7z.exe x "$artifactName" -y | Out-Null + } else { + $artifactName = "node-${{ env.VERSION }}-${{ matrix.platform }}-${{ env.ARCHITECTURE }}.tar.gz" + tar -xzf $artifactName + } + working-directory: ${{ runner.temp }}/node-${{ env.VERSION }}-${{ matrix.platform }} + shell: pwsh + + - 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 }}/node-${{ env.VERSION }}-${{ matrix.platform }} + shell: pwsh + + - name: Setup node ${{ env.VERSION }} + uses: actions/setup-node@v2.1.1 + 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" + shell: pwsh + + - name: Run tests + run: | + Install-Module Pester -Force -Scope CurrentUser -RequiredVersion 4.10.1 + Import-Module Pester + $pesterParams = @{ + Path="./Node.Tests.ps1"; + Parameters=@{ + Version="$env:VERSION"; + } + } + Invoke-Pester -Script $pesterParams -EnableExit -OutputFile "test_results.xml" -OutputFormat NUnitXml + working-directory: ./tests + shell: pwsh + + publish_release: + name: Publish release + if: github.event.inputs.PUBLISH_RELEASES == 'true' + needs: test_node + runs-on: ubuntu-latest + outputs: + upload_url: ${{ steps.create_release.outputs.upload_url }} + steps: + - 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: | + Upload Node.js ${{ env.VERSION }} + + upload_assets: + name: Upload assets for ${{ matrix.platform }} + needs: publish_release + runs-on: ubuntu-latest + env: + UPLOAD_URL: ${{ needs.publish_release.outputs.upload_url }} + strategy: + matrix: + extension: ['tar.gz'] + platform: [linux, darwin] + include: + - platform: win32 + extension: 7z + steps: + - uses: actions/download-artifact@v2 + with: + name: node-${{ env.VERSION }}-${{ matrix.platform }} + + - name: Upload Release Asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ env.UPLOAD_URL }} + asset_path: ./node-${{ env.VERSION }}-${{ matrix.platform }}-${{ env.ARCHITECTURE }}.${{ matrix.extension }} + asset_name: node-${{ env.VERSION }}-${{ matrix.platform }}-${{ env.ARCHITECTURE }}.${{ matrix.extension }} + asset_content_type: application/zip + + create_pr: + name: Create Pull Request + needs: upload_assets + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: true + + - name: Trigger "Create Pull Request" workflow + uses: actions/github-script@v2 + with: + github-token: ${{ secrets.PERSONAL_TOKEN }} + script: | + # TODO: currently 'actions.createWorkflowDispatch' function does not work. I will investigate + github.repos.createDispatchEvent({ + owner: context.repo.owner, + repo: context.repo.repo, + event_type: 'create-pr' + }); \ No newline at end of file diff --git a/.github/workflows/create-pr.yml b/.github/workflows/create-pr.yml new file mode 100644 index 0000000..7ed0ca1 --- /dev/null +++ b/.github/workflows/create-pr.yml @@ -0,0 +1,37 @@ +name: Create Pull Request +on: +# TODO: currently workflow dispatch endpoint does not work. I will investigate + repository_dispatch: + types: [create-pr] + workflow_dispatch: +jobs: + build: + name: Create Pull Request + env: + REPOSITORY_NAME: 'node-versions' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: true + + - name: Create versions-manifest.json + shell: pwsh + run: | + ./helpers/packages-generation/manifest-generator.ps1 -GitHubRepositoryOwner "${{github.repository_owner}}" ` + -GitHubRepositoryName "$env:REPOSITORY_NAME"` + -GitHubAccessToken "${{secrets.GITHUB_TOKEN}}"` + -OutputFile "./versions-manifest.json"` + -ConfigurationFile "./config/node-manifest-config.json" + - name: Create GitHub PR + shell: pwsh + run: | + $formattedDate = Get-Date -Format "MM/dd/yyyy" + ./helpers/github/create-pull-request.ps1 ` + -RepositoryOwner "${{github.repository_owner}}" ` + -RepositoryName "$env:REPOSITORY_NAME" ` + -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}" diff --git a/builders/node-builder.psm1 b/builders/node-builder.psm1 index d3688c9..9c3326e 100644 --- a/builders/node-builder.psm1 +++ b/builders/node-builder.psm1 @@ -40,8 +40,8 @@ class NodeBuilder { $this.Architecture = $architecture $this.TempFolderLocation = [IO.Path]::GetTempPath() - $this.WorkFolderLocation = $env:BUILD_BINARIESDIRECTORY - $this.ArtifactFolderLocation = $env:BUILD_STAGINGDIRECTORY + $this.WorkFolderLocation = $env:BINARIES_DIRECTORY + $this.ArtifactFolderLocation = $env:ARTIFACT_DIRECTORY $this.InstallationTemplatesLocation = Join-Path -Path $PSScriptRoot -ChildPath "../installers" diff --git a/tests/Node.Tests.ps1 b/tests/Node.Tests.ps1 index 3df4c21..831cecf 100644 --- a/tests/Node.Tests.ps1 +++ b/tests/Node.Tests.ps1 @@ -6,11 +6,17 @@ param ( Import-Module (Join-Path $PSScriptRoot "../helpers/pester-extensions.psm1") function Get-UseNodeLogs { - $logsFolderPath = Join-Path -Path $env:AGENT_HOMEDIRECTORY -ChildPath "_diag" | Join-Path -ChildPath "pages" + $homeDir = $env:HOME + if ([string]::IsNullOrEmpty($homeDir)) { + # GitHub Windows images don't have `HOME` variable + $homeDir = $env:HOMEDRIVE + } + + $logsFolderPath = Join-Path -Path $homeDir -ChildPath "runners/*/_diag/pages" -Resolve $useNodeLogFile = Get-ChildItem -Path $logsFolderPath | Where-Object { $logContent = Get-Content $_.Fullname -Raw - return $logContent -match "Use Node" + return $logContent -match "setup-node@v" } | Select-Object -First 1 return $useNodeLogFile.Fullname } @@ -37,7 +43,7 @@ Describe "Node.js" { $useNodeLogFile = Get-UseNodeLogs $useNodeLogFile | Should -Exist $useNodeLogContent = Get-Content $useNodeLogFile -Raw - $useNodeLogContent | Should -Match "Found tool in cache" + $useNodeLogContent | Should -Match "Found in cache" } It "Run simple code" {