From 6ce1157aa8f826671cf8a3bdfbd07092307949d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Miri=C4=87?= Date: Fri, 25 Sep 2020 16:23:03 +0200 Subject: [PATCH] Add Windows packaging and release job, split build into standalone job --- .github/workflows/all.yml | 352 +++++++++++------- .../{v0.29.0-test2.md => v0.29.0-test3.md} | 0 2 files changed, 224 insertions(+), 128 deletions(-) rename release notes/{v0.29.0-test2.md => v0.29.0-test3.md} (100%) diff --git a/.github/workflows/all.yml b/.github/workflows/all.yml index a176369a0fc..5de5a05cc95 100644 --- a/.github/workflows/all.yml +++ b/.github/workflows/all.yml @@ -19,135 +19,110 @@ env: GODEBUG: netdns=go+1 jobs: - # deps: - # runs-on: ubuntu-latest - # defaults: - # run: - # shell: bash - # steps: - # - name: Checkout code - # uses: actions/checkout@v2 - # - name: Install Go - # uses: actions/setup-go@v2 - # with: - # go-version: 1.14.x - # - name: Check dependencies - # run: | - # go version - # test -z "$(go mod vendor && git status --porcelain)" - # go mod verify + deps: + runs-on: ubuntu-latest + defaults: + run: + shell: bash + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Install Go + uses: actions/setup-go@v2 + with: + go-version: 1.14.x + - name: Check dependencies + run: | + go version + test -z "$(go mod vendor && git status --porcelain)" + go mod verify - # lint: - # runs-on: ubuntu-latest - # defaults: - # run: - # shell: bash - # env: - # GOLANGCI_VERSION: v1.31 - # GO111MODULE: 'on' - # steps: - # - name: Checkout code - # uses: actions/checkout@v2 - # with: - # fetch-depth: 0 - # - name: Lint - # # Why is `go mod vendor` needed here!? If it's not run then - # # golangci-lint fails because of inconsistent vendoring... - # run: | - # go get github.com/golangci/golangci-lint/cmd/golangci-lint@$GOLANGCI_VERSION - # BASEREV=$(git merge-base HEAD origin/master) - # echo "Base revision: $BASEREV" - # export PATH="$HOME/go/bin:$PATH" - # go mod vendor - # golangci-lint run --out-format=tab --new-from-rev "$BASEREV" ./... + lint: + runs-on: ubuntu-latest + defaults: + run: + shell: bash + env: + GOLANGCI_VERSION: v1.31 + GO111MODULE: 'on' + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Lint + # Why is `go mod vendor` needed here!? If it's not run then + # golangci-lint fails because of inconsistent vendoring... + run: | + go get github.com/golangci/golangci-lint/cmd/golangci-lint@$GOLANGCI_VERSION + BASEREV=$(git merge-base HEAD origin/master) + echo "Base revision: $BASEREV" + export PATH="$HOME/go/bin:$PATH" + go mod vendor + golangci-lint run --out-format=tab --new-from-rev "$BASEREV" ./... - # test: - # strategy: - # matrix: - # go-version: [1.14.x, 1.15.x] - # platform: [ubuntu-latest, windows-latest] - # runs-on: ${{ matrix.platform }} - # defaults: - # run: - # shell: bash - # steps: - # - name: Checkout code - # uses: actions/checkout@v2 - # - name: Install Go - # uses: actions/setup-go@v2 - # with: - # go-version: ${{ matrix.go-version }} - # - name: Run tests with code coverage - # run: | - # go version - # export GOMAXPROCS=2 - # export PATH=$GOPATH/bin:$PATH - # echo "mode: set" > coverage.txt - # for pkg in $(go list ./... | grep -v vendor); do - # list=$(go list -test -f '{{ join .Deps "\n"}}' $pkg | grep github.com/loadimpact/k6 | grep -v vendor || true) - # if [ -n "$list" ]; then - # list=$(echo "$list" | cut -f1 -d ' ' | sort -u | paste -sd, -) - # fi + test: + strategy: + matrix: + go-version: [1.14.x, 1.15.x] + platform: [ubuntu-latest, windows-latest] + runs-on: ${{ matrix.platform }} + defaults: + run: + shell: bash + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Install Go + uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go-version }} + - name: Run tests with code coverage + run: | + go version + export GOMAXPROCS=2 + export PATH=$GOPATH/bin:$PATH + echo "mode: set" > coverage.txt + for pkg in $(go list ./... | grep -v vendor); do + list=$(go list -test -f '{{ join .Deps "\n"}}' $pkg | grep github.com/loadimpact/k6 | grep -v vendor || true) + if [ -n "$list" ]; then + list=$(echo "$list" | cut -f1 -d ' ' | sort -u | paste -sd, -) + fi - # go test -v -race -timeout 800s --coverpkg="$list" -coverprofile=$(echo $pkg | tr / -).coverage $pkg - # done - # grep -h -v "^mode:" *.coverage >> coverage.txt - # rm -f *.coverage - # bash <(curl --fail -s https://codecov.io/bash) - # go tool cover -html=coverage.txt -o coverage.html - # - name: Upload coverage report - # uses: actions/upload-artifact@v2 - # with: - # name: test-coverage-report - # path: coverage.html + go test -v -race -timeout 800s --coverpkg="$list" -coverprofile=$(echo $pkg | tr / -).coverage $pkg + done + grep -h -v "^mode:" *.coverage >> coverage.txt + rm -f *.coverage + bash <(curl --fail -s https://codecov.io/bash) + go tool cover -html=coverage.txt -o coverage.html + - name: Upload coverage report + uses: actions/upload-artifact@v2 + with: + name: test-coverage-report + path: coverage.html - # docker: - # runs-on: ubuntu-latest - # needs: [lint, test] - # steps: - # - name: Checkout code - # uses: actions/checkout@v2 - # - name: Build - # run: docker build -t $DOCKER_IMAGE_ID . - # - name: Check - # run: | - # docker run $DOCKER_IMAGE_ID version - # docker run $DOCKER_IMAGE_ID --help - # docker run $DOCKER_IMAGE_ID help - # docker run $DOCKER_IMAGE_ID run --help - # docker run $DOCKER_IMAGE_ID inspect --help - # docker run $DOCKER_IMAGE_ID status --help - # docker run $DOCKER_IMAGE_ID stats --help - # docker run $DOCKER_IMAGE_ID scale --help - # docker run $DOCKER_IMAGE_ID pause --help - # docker run $DOCKER_IMAGE_ID resume --help - # - name: Publish - # if: github.event_name != 'pull_request' - # run: | - # echo "REF=${{ github.ref }}" - # echo "DOCKER_IMAGE_ID=$DOCKER_IMAGE_ID" - # # - # # Log into registry - # echo "${{ secrets.DOCKER_PASS }}" | docker login -u "${{ secrets.DOCKER_USER }}" --password-stdin - # # Strip git ref prefix from version - # VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,') - # # Strip "v" prefix from tag name - # [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo "$VERSION" | sed -e 's/^v//') - # echo "VERSION=$VERSION" - # docker tag "$DOCKER_IMAGE_ID" "$DOCKER_IMAGE_ID:$VERSION" - # docker push "$DOCKER_IMAGE_ID:$VERSION" - # # We also want to tag the latest stable version as latest - # if [[ "$VERSION" != "master" ]] && [[ ! "$VERSION" =~ (RC|rc) ]]; then - # docker tag "$DOCKER_IMAGE_ID" "$DOCKER_IMAGE_ID:latest" - # docker push "$DOCKER_IMAGE_ID:latest" - # fi + configure: + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/v') + defaults: + run: + shell: bash + outputs: + version: ${{ steps.get_version.outputs.version }} + steps: + - name: Get version + id: get_version + run: | + VERSION="${GITHUB_REF##*/}" + echo "VERSION=${VERSION}" + echo "::set-output name=version::${VERSION}" - release: + build: runs-on: ubuntu-latest defaults: run: shell: bash - # needs: [lint, test] + needs: [deps, lint, test] if: startsWith(github.ref, 'refs/tags/v') steps: - name: Checkout code @@ -157,10 +132,8 @@ jobs: with: go-version: 1.14.x - name: Install package builders - # Needed so that `go get` doesn't try to install glide as as a k6 - # dependency, which would fail if run from the k6 directory because of - # Go modules. - working-directory: /tmp + env: + GO111MODULE: 'off' run: | gopath="$(go env GOPATH)" go get github.com/Masterminds/glide @@ -178,14 +151,137 @@ jobs: run: | go version ./build-release.sh + - name: Upload artifacts + uses: actions/upload-artifact@v2 + with: + name: binaries + path: dist/ + + publish-docker: + runs-on: ubuntu-latest + needs: [deps, lint, test, configure] + env: + VERSION: ${{ needs.configure.outputs.version }} + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Build + run: docker build -t $DOCKER_IMAGE_ID . + - name: Check + run: | + docker run $DOCKER_IMAGE_ID version + docker run $DOCKER_IMAGE_ID --help + docker run $DOCKER_IMAGE_ID help + docker run $DOCKER_IMAGE_ID run --help + docker run $DOCKER_IMAGE_ID inspect --help + docker run $DOCKER_IMAGE_ID status --help + docker run $DOCKER_IMAGE_ID stats --help + docker run $DOCKER_IMAGE_ID scale --help + docker run $DOCKER_IMAGE_ID pause --help + docker run $DOCKER_IMAGE_ID resume --help + - name: Publish + if: github.event_name != 'pull_request' + run: | + echo "REF=${{ github.ref }}" + echo "DOCKER_IMAGE_ID=$DOCKER_IMAGE_ID" + # Log into registry + echo "${{ secrets.DOCKER_PASS }}" | docker login -u "${{ secrets.DOCKER_USER }}" --password-stdin + VERSION="${VERSION#v}" + echo "VERSION=$VERSION" + docker tag "$DOCKER_IMAGE_ID" "$DOCKER_IMAGE_ID:$VERSION" + docker push "$DOCKER_IMAGE_ID:$VERSION" + # We also want to tag the latest stable version as latest + if [[ "$VERSION" != "master" ]] && [[ ! "$VERSION" =~ (RC|rc) ]]; then + docker tag "$DOCKER_IMAGE_ID" "$DOCKER_IMAGE_ID:latest" + docker push "$DOCKER_IMAGE_ID:latest" + fi + + publish-github: + runs-on: ubuntu-latest + defaults: + run: + shell: bash + needs: [deps, lint, test, configure, build] + if: startsWith(github.ref, 'refs/tags/v') + env: + VERSION: ${{ needs.configure.outputs.version }} + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Download binaries + uses: actions/download-artifact@v2 + with: + name: binaries + path: dist - name: Create release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | set -x assets=() for asset in ./dist/*; do assets+=("-a" "$asset") done - tag_name="${GITHUB_REF##*/}" - hub release create "${assets[@]}" -m "$tag_name" -m "$(cat ./release\ notes/${tag_name}.md)" "$tag_name" - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + hub release create "${assets[@]}" -m "$VERSION" -m "$(cat ./release\ notes/${VERSION}.md)" "$VERSION" + # - name: Upload packages to Bintray + # run: | + # # Publishing deb + # curl --fail -H "X-GPG-PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}" -T "dist/k6-$VERSION-amd64.deb" \ + # "https://${{ secrets.BINTRAY_USER }}:${{ secrets.BINTRAY_KEY }}@api.bintray.com/content/loadimpact/deb/k6/${VERSION#v}/k6-${VERSION}-amd64.deb;deb_distribution=stable;deb_component=main;deb_architecture=amd64;publish=1;override=1" + # # Publishing rpm + # curl --fail -H "X-GPG-PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}" -T "dist/k6-$VERSION-amd64.rpm" \ + # "https://${{ secrets.BINTRAY_USER }}:${{ secrets.BINTRAY_KEY }}@api.bintray.com/content/loadimpact/rpm/k6/${VERSION#v}/k6-${VERSION}-amd64.rpm?publish=1&override=1" + + publish-windows: + runs-on: windows-latest + defaults: + run: + shell: powershell + needs: [deps, lint, test, configure, build] + if: startsWith(github.ref, 'refs/tags/v') + env: + VERSION: ${{ needs.configure.outputs.version }} + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Install pandoc + uses: crazy-max/ghaction-chocolatey@v1 + with: + args: install -y pandoc + - name: Install wix tools + run: | + curl -O wix311-binaries.zip https://github.com/wixtoolset/wix3/releases/download/wix3112rtm/wix311-binaries.zip + Expand-Archive -Path .\wix311-binaries.zip -DestinationPath .\wix311\ + echo "::add-path::$($pwd.path)\wix311" + - name: Download binaries + uses: actions/download-artifact@v2 + with: + name: binaries + path: dist + - name: Unzip Windows binary + run: | + Expand-Archive -Path ".\dist\k6-$env:VERSION-win64.zip" -DestinationPath .\packaging\ + move .\packaging\k6-$env:VERSION-win64\k6.exe .\packaging\ + rmdir .\packaging\k6-$env:VERSION-win64\ + - name: Create MSI package + run: | + $env:VERSION = $env:VERSION -replace 'v(\d{1,}\.\d{1,}\.\d{1,}).*','$1' + pandoc -s -f markdown -t rtf -o packaging\LICENSE.rtf LICENSE.md + cd .\packaging + candle.exe -arch x64 "-dVERSION=$env:VERSION" k6.wxs + light.exe -ext WixUIExtension k6.wixobj + - name: Prepare Chocolatey package + run: | + $env:VERSION = $env:VERSION.TrimStart("v", " ") + cd .\packaging + (Get-Content '.\k6.portable.nuspec' -Raw).Replace("__REPLACE__", "$env:VERSION") | Out-File '.\k6.portable.nuspec' + - name: Create Chocolatey package + uses: crazy-max/ghaction-chocolatey@v1 + with: + args: pack --verbose --outputdirectory .\packaging .\packaging\k6.portable.nuspec + # - name: Upload packages to Bintray + # run: | + # cd .\packaging + # $env:VERSION = $env:VERSION.TrimStart("v", " ") + # curl --fail -H "X-GPG-PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}" -T .\k6.msi "https://${{ secrets.BINTRAY_USER }}:${{ secrets.BINTRAY_KEY }}@api.bintray.com/content/loadimpact/windows/k6/$env:VERSION/k6-v$env:VERSION-amd64.msi?publish=1&override=1" + # curl --fail -H "X-GPG-PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}" -T .\k6.portable.$env:VERSION.nupkg "https://${{ secrets.BINTRAY_USER }}:${{ secrets.BINTRAY_KEY }}@api.bintray.com/content/loadimpact/choco/k6.portable/$env:VERSION/k6.portable.$env:VERSION.nupkg?publish=1&override=1"' diff --git a/release notes/v0.29.0-test2.md b/release notes/v0.29.0-test3.md similarity index 100% rename from release notes/v0.29.0-test2.md rename to release notes/v0.29.0-test3.md