From 59e54b2d8b2a7f024050f575fdf1be37bcceeed7 Mon Sep 17 00:00:00 2001 From: Mikhail Koliada <88318005+mikhailkoliada@users.noreply.github.com> Date: Thu, 23 Dec 2021 17:34:17 +0300 Subject: [PATCH 1/6] Migrate python-versions pipeline to GH Actions --- .github/workflows/create-pr.yml | 2 +- .github/workflows/python-builder.yml | 220 +++++++++++++++++++++++++++ builders/python-builder.psm1 | 11 +- tests/python-tests.ps1 | 4 +- 4 files changed, 230 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/python-builder.yml diff --git a/.github/workflows/create-pr.yml b/.github/workflows/create-pr.yml index 5a4f5a7..b1d5ef7 100644 --- a/.github/workflows/create-pr.yml +++ b/.github/workflows/create-pr.yml @@ -30,4 +30,4 @@ jobs: -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}" \ No newline at end of file + -PullRequestBody "Update versions-manifest.json for release from ${formattedDate}" diff --git a/.github/workflows/python-builder.yml b/.github/workflows/python-builder.yml new file mode 100644 index 0000000..2fdb91c --- /dev/null +++ b/.github/workflows/python-builder.yml @@ -0,0 +1,220 @@ +name: Build python package + +on: + workflow_dispatch: + inputs: + VERSION: + description: 'Python version to build and upload' + default: '3.9.6' + required: true + PUBLISH_RELEASES: + description: 'Whether to publish releases' + required: true + default: 'false' + pull_request: + paths-ignore: + - 'versions-manifest.json' + - 'LICENSE' + - '**.md' + branches: + - 'main' + +env: + VERSION: ${{ github.event.inputs.VERSION}} +defaults: + run: + shell: pwsh + +jobs: + build_python: + strategy: + fail-fast: false + matrix: + include: + - platform: 'linux-18.04' + os: 'ubuntu-18.04' + arch: 'x64' + - platform: 'linux-20.04' + os: 'ubuntu-20.04' + arch: 'x64' + - platform: 'darwin' + os: 'macos-10.15' + arch: 'x64' + - platform: 'win32' + os: 'windows-2019' + arch: 'x64' + - platform: 'win32' + os: 'windows-2019' + arch: 'x86' + runs-on: ${{ matrix.os }} + env: + ARTIFACT_NAME: python-${{ github.event.inputs.VERSION }}-${{ matrix.platform }}-${{ matrix.arch }} + steps: + + - name: Check out repository code + uses: actions/checkout@v2 + with: + submodules: true + + - name: Build Python ${{ env.VERSION }} + shell: pwsh + run: | + ./builders/build-python.ps1 -Version $env:VERSION ` + -Platform ${{ matrix.platform }} -Architecture ${{ matrix.arch }} + + - name: Publish artifact + uses: actions/upload-artifact@v2 + with: + name: ${{ env.ARTIFACT_NAME }} + path: ${{ runner.temp }}/artifact + + test_python: + needs: build_python + strategy: + fail-fast: false + matrix: + include: + - platform: 'linux-18.04' + os: 'ubuntu-18.04' + arch: 'x64' + - platform: 'linux-20.04' + os: 'ubuntu-20.04' + arch: 'x64' + - platform: 'darwin' + os: 'macos-10.15' + arch: 'x64' + - platform: 'win32' + os: 'windows-2019' + arch: 'x64' + - platform: 'win32' + os: 'windows-2019' + arch: 'x86' + runs-on: ${{ matrix.os }} + env: + ARTIFACT_NAME: python-${{ github.event.inputs.VERSION }}-${{ matrix.platform }}-${{ matrix.arch }} + steps: + + - name: Check out repository code + uses: actions/checkout@v2 + with: + submodules: true + + - name: Fully cleanup the toolcache directory before testing + run: ./helpers/clean-toolcache.ps1 -ToolName "Python" + + - 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 }}.zip" + 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 } + if ('${{ matrix.platform }}' -ne 'win32') { + cp ${{ runner.temp }}/${{ env.ARTIFACT_NAME }}/build_output.txt ${{ runner.temp }} + } + + working-directory: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }} + + - name: Setup Python ${{ env.VERSION }} + uses: actions/setup-python@v2 + with: + python-version: ${{ env.VERSION }} + + - name: Verbose sysconfig dump + run: | + if ('${{ matrix.platform }}' -ne 'win32') { python ./sources/python-config-output.py } + working-directory: ${{ github.workspace }}/tests + + - name: Verbose python binary links + run: | + $pythonLocation = which python + if ('${{ matrix.platform }}' -ne 'win32') { + if ('${{ matrix.platform }}' -eq 'darwin') { otool -L $pythonLocation } else { ldd $pythonLocation } + } + + - name: Run tests + shell: pwsh + run: | + Install-Module Pester -Force -Scope CurrentUser -RequiredVersion 4.10.1 + Import-Module Pester + $pesterParams = @{ + Path="./python-tests.ps1"; + Parameters=@{ + Version="${{ env.VERSION }}"; + Platform="${{ matrix.platform }}"; + } + } + $Result = Invoke-Pester -PassThru -Script $pesterParams -OutputFile "test_results.xml" -OutputFormat NUnitXml + if ($Result.FailedCount -gt 0) { + $host.SetShouldExit($Result.FailedCount) + exit $Result.FailedCount + } + + working-directory: ${{ github.workspace }}/tests + + publish_release: + name: Publish release + if: github.event_name == 'workflow_dispatch' && github.event.inputs.PUBLISH_RELEASES == 'true' + needs: test_python + 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: | + Python ${{ 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' + }); + diff --git a/builders/python-builder.psm1 b/builders/python-builder.psm1 index bb44e56..5c1922e 100644 --- a/builders/python-builder.psm1 +++ b/builders/python-builder.psm1 @@ -41,10 +41,13 @@ class PythonBuilder { PythonBuilder ([semver] $version, [string] $architecture, [string] $platform) { $this.InstallationTemplatesLocation = Join-Path -Path $PSScriptRoot -ChildPath "../installers" - $this.HostedToolcacheLocation = $env:AGENT_TOOLSDIRECTORY - $this.TempFolderLocation = $env:BUILD_SOURCESDIRECTORY - $this.WorkFolderLocation = $env:BUILD_BINARIESDIRECTORY - $this.ArtifactFolderLocation = $env:BUILD_STAGINGDIRECTORY + New-Item -Force -Type Directory (Join-Path $env:RUNNER_TEMP "artifact") + New-Item -Force -Type Directory (Join-Path $env:RUNNER_TEMP "work") + + $this.HostedToolcacheLocation = $env:RUNNER_TOOL_CACHE + $this.TempFolderLocation = $env:RUNNER_TEMP + $this.WorkFolderLocation = Join-Path $env:RUNNER_TEMP "work" + $this.ArtifactFolderLocation = Join-Path $env:RUNNER_TEMP "artifact" $this.Version = $version $this.Architecture = $architecture diff --git a/tests/python-tests.ps1 b/tests/python-tests.ps1 index 7ffd59d..d18c7be 100644 --- a/tests/python-tests.ps1 +++ b/tests/python-tests.ps1 @@ -39,7 +39,7 @@ Describe "Tests" { "python --version" | Should -ReturnZeroExitCode $pythonLocation = (Get-Command "python").Path $pythonLocation | Should -Not -BeNullOrEmpty - $expectedPath = Join-Path -Path $env:AGENT_TOOLSDIRECTORY -ChildPath "Python" + $expectedPath = Join-Path -Path $env:RUNNER_TOOL_CACHE -ChildPath "Python" $pythonLocation.startsWith($expectedPath) | Should -BeTrue } @@ -61,7 +61,7 @@ Describe "Tests" { if (IsNixPlatform $Platform) { It "Check for failed modules in build_output" { - $buildOutputLocation = Join-Path $env:BUILD_BINARIESDIRECTORY "build_output.txt" + $buildOutputLocation = Join-Path $env:RUNNER_TEMP "build_output.txt" Analyze-MissingModules $buildOutputLocation | Should -Be 0 } From 4a2af81ac10e3b4015b4348b68bf61f97fa67386 Mon Sep 17 00:00:00 2001 From: Mikhail Koliada <88318005+mikhailkoliada@users.noreply.github.com> Date: Thu, 13 Jan 2022 19:27:50 +0300 Subject: [PATCH 2/6] Update .github/workflows/python-builder.yml Co-authored-by: Mikhail Timofeev <48208649+miketimofeev@users.noreply.github.com> --- .github/workflows/python-builder.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-builder.yml b/.github/workflows/python-builder.yml index 2fdb91c..a69277a 100644 --- a/.github/workflows/python-builder.yml +++ b/.github/workflows/python-builder.yml @@ -5,7 +5,7 @@ on: inputs: VERSION: description: 'Python version to build and upload' - default: '3.9.6' + default: '3.9.9' required: true PUBLISH_RELEASES: description: 'Whether to publish releases' From 3792b6282ab68d9219e1b53570689df96ae86b28 Mon Sep 17 00:00:00 2001 From: Mikhail Koliada Date: Fri, 14 Jan 2022 12:03:40 +0300 Subject: [PATCH 3/6] misc improvements --- .github/workflows/python-builder.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/python-builder.yml b/.github/workflows/python-builder.yml index a69277a..2d274b5 100644 --- a/.github/workflows/python-builder.yml +++ b/.github/workflows/python-builder.yml @@ -20,7 +20,7 @@ on: - 'main' env: - VERSION: ${{ github.event.inputs.VERSION}} + VERSION: ${{ github.event.inputs.VERSION || '3.9.9' }} defaults: run: shell: pwsh @@ -48,7 +48,7 @@ jobs: arch: 'x86' runs-on: ${{ matrix.os }} env: - ARTIFACT_NAME: python-${{ github.event.inputs.VERSION }}-${{ matrix.platform }}-${{ matrix.arch }} + ARTIFACT_NAME: python-${{ github.event.inputs.VERSION || '3.9.9' }}-${{ matrix.platform }}-${{ matrix.arch }} steps: - name: Check out repository code @@ -91,7 +91,7 @@ jobs: arch: 'x86' runs-on: ${{ matrix.os }} env: - ARTIFACT_NAME: python-${{ github.event.inputs.VERSION }}-${{ matrix.platform }}-${{ matrix.arch }} + ARTIFACT_NAME: python-${{ github.event.inputs.VERSION || '3.9.9' }}-${{ matrix.platform }}-${{ matrix.arch }} steps: - name: Check out repository code @@ -145,7 +145,6 @@ jobs: } - name: Run tests - shell: pwsh run: | Install-Module Pester -Force -Scope CurrentUser -RequiredVersion 4.10.1 Import-Module Pester @@ -156,12 +155,11 @@ jobs: Platform="${{ matrix.platform }}"; } } - $Result = Invoke-Pester -PassThru -Script $pesterParams -OutputFile "test_results.xml" -OutputFormat NUnitXml + $Result = Invoke-Pester -PassThru -Script $pesterParams if ($Result.FailedCount -gt 0) { $host.SetShouldExit($Result.FailedCount) exit $Result.FailedCount } - working-directory: ${{ github.workspace }}/tests publish_release: From 41f641758a2b7c573ebd5c0c4b56fd24f8b96640 Mon Sep 17 00:00:00 2001 From: Mikhail Koliada Date: Fri, 14 Jan 2022 19:53:00 +0300 Subject: [PATCH 4/6] another round of improvements --- .github/workflows/python-builder.yml | 21 ++++++++++----------- builders/python-builder.psm1 | 7 +++++-- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/.github/workflows/python-builder.yml b/.github/workflows/python-builder.yml index 2d274b5..c760321 100644 --- a/.github/workflows/python-builder.yml +++ b/.github/workflows/python-builder.yml @@ -57,7 +57,6 @@ jobs: submodules: true - name: Build Python ${{ env.VERSION }} - shell: pwsh run: | ./builders/build-python.ps1 -Version $env:VERSION ` -Platform ${{ matrix.platform }} -Architecture ${{ matrix.arch }} @@ -120,11 +119,12 @@ jobs: - name: Apply build artifact to the local machine run: | - if ('${{ matrix.platform }}' -eq 'win32') { powershell ./setup.ps1 } else { sh ./setup.sh } - if ('${{ matrix.platform }}' -ne 'win32') { - cp ${{ runner.temp }}/${{ env.ARTIFACT_NAME }}/build_output.txt ${{ runner.temp }} - } - + if ('${{ matrix.platform }}' -eq 'win32') { + powershell ./setup.ps1 + } else { + sh ./setup.sh + cp ${{ runner.temp }}/${{ env.ARTIFACT_NAME }}/build_output.txt ${{ runner.temp }} + } working-directory: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }} - name: Setup Python ${{ env.VERSION }} @@ -133,16 +133,15 @@ jobs: python-version: ${{ env.VERSION }} - name: Verbose sysconfig dump - run: | - if ('${{ matrix.platform }}' -ne 'win32') { python ./sources/python-config-output.py } + if: runner.os == 'Linux' || runner.os == 'macOS' + run: python ./sources/python-config-output.py working-directory: ${{ github.workspace }}/tests - name: Verbose python binary links + if: runner.os == 'Linux' || runner.os == 'macOS' run: | $pythonLocation = which python - if ('${{ matrix.platform }}' -ne 'win32') { - if ('${{ matrix.platform }}' -eq 'darwin') { otool -L $pythonLocation } else { ldd $pythonLocation } - } + if ('${{ matrix.platform }}' -eq 'darwin') { otool -L $pythonLocation } else { ldd $pythonLocation } - name: Run tests run: | diff --git a/builders/python-builder.psm1 b/builders/python-builder.psm1 index 5c1922e..4151379 100644 --- a/builders/python-builder.psm1 +++ b/builders/python-builder.psm1 @@ -41,8 +41,11 @@ class PythonBuilder { PythonBuilder ([semver] $version, [string] $architecture, [string] $platform) { $this.InstallationTemplatesLocation = Join-Path -Path $PSScriptRoot -ChildPath "../installers" - New-Item -Force -Type Directory (Join-Path $env:RUNNER_TEMP "artifact") - New-Item -Force -Type Directory (Join-Path $env:RUNNER_TEMP "work") + $artifactDirectory = Join-Path $env:RUNNER_TEMP "artifact" + $workDirectory = Join-Path $env:RUNNER_TEMP "work" + + New-Item -Force -Type Directory $artifactDirectory + New-Item -Force -Type Directory $workDirectory $this.HostedToolcacheLocation = $env:RUNNER_TOOL_CACHE $this.TempFolderLocation = $env:RUNNER_TEMP From 3beea61c1fee672ae7b7b8fce5edaae53ded1c28 Mon Sep 17 00:00:00 2001 From: Mikhail Koliada Date: Fri, 14 Jan 2022 19:56:43 +0300 Subject: [PATCH 5/6] specify architecture on setup --- .github/workflows/python-builder.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/python-builder.yml b/.github/workflows/python-builder.yml index c760321..5d7b2a7 100644 --- a/.github/workflows/python-builder.yml +++ b/.github/workflows/python-builder.yml @@ -131,6 +131,7 @@ jobs: uses: actions/setup-python@v2 with: python-version: ${{ env.VERSION }} + architecture: ${{ matrix.arch }} - name: Verbose sysconfig dump if: runner.os == 'Linux' || runner.os == 'macOS' From e3851845a3df26f34cb0f0ef71dbfe1059c6f4d2 Mon Sep 17 00:00:00 2001 From: Mikhail Koliada <88318005+mikhailkoliada@users.noreply.github.com> Date: Sat, 15 Jan 2022 14:28:07 +0300 Subject: [PATCH 6/6] Update python-builder.psm1 --- builders/python-builder.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/builders/python-builder.psm1 b/builders/python-builder.psm1 index 4151379..c2541d3 100644 --- a/builders/python-builder.psm1 +++ b/builders/python-builder.psm1 @@ -49,8 +49,8 @@ class PythonBuilder { $this.HostedToolcacheLocation = $env:RUNNER_TOOL_CACHE $this.TempFolderLocation = $env:RUNNER_TEMP - $this.WorkFolderLocation = Join-Path $env:RUNNER_TEMP "work" - $this.ArtifactFolderLocation = Join-Path $env:RUNNER_TEMP "artifact" + $this.WorkFolderLocation = $workDirectory + $this.ArtifactFolderLocation = $artifactDirectory $this.Version = $version $this.Architecture = $architecture