replace travis with github actions (#17)
* replace travis with github actions * add support extract address from public key
This commit is contained in:
parent
8357dda6fb
commit
20322dbf13
|
@ -0,0 +1,155 @@
|
||||||
|
name: Build
|
||||||
|
on: [push, pull_request]
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build on ${{ matrix.vm }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
vm: ["ubuntu-latest", "macos-latest"]
|
||||||
|
runs-on: ${{ matrix.vm }}
|
||||||
|
steps:
|
||||||
|
- name: Setup Go 1.13
|
||||||
|
uses: actions/setup-go@v1
|
||||||
|
with:
|
||||||
|
go-version: 1.13
|
||||||
|
- name: Extract version metadata
|
||||||
|
id: meta
|
||||||
|
run: |
|
||||||
|
echo "::set-output name=os-arch::$(go env GOOS)_$(go env GOARCH)"
|
||||||
|
echo "::set-output name=version::${GITHUB_REF##*/}"
|
||||||
|
- name: Check out project files
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Build
|
||||||
|
id: build
|
||||||
|
run: |
|
||||||
|
make dist
|
||||||
|
notify:
|
||||||
|
name: Notify Slack
|
||||||
|
needs:
|
||||||
|
- build
|
||||||
|
if: always()
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Prepare Slack message
|
||||||
|
id: status
|
||||||
|
uses: actions/github-script@0.8.0
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
////////////////////////////////////
|
||||||
|
// retrieve workflow run data
|
||||||
|
////////////////////////////////////
|
||||||
|
console.log("get workflow run")
|
||||||
|
const wf_run = await github.actions.getWorkflowRun({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
run_id: ${{ github.run_id }}
|
||||||
|
})
|
||||||
|
console.log(wf_run.data)
|
||||||
|
console.log("get jobs for workflow run:", wf_run.data.jobs_url)
|
||||||
|
const jobs_response = await github.request(wf_run.data.jobs_url)
|
||||||
|
////////////////////////////////////
|
||||||
|
// build slack notification message
|
||||||
|
////////////////////////////////////
|
||||||
|
// some utility functions
|
||||||
|
var date_diff_func = function(start, end) {
|
||||||
|
var duration = end - start
|
||||||
|
// format the duration
|
||||||
|
var delta = duration / 1000
|
||||||
|
var days = Math.floor(delta / 86400)
|
||||||
|
delta -= days * 86400
|
||||||
|
var hours = Math.floor(delta / 3600) % 24
|
||||||
|
delta -= hours * 3600
|
||||||
|
var minutes = Math.floor(delta / 60) % 60
|
||||||
|
delta -= minutes * 60
|
||||||
|
var seconds = Math.floor(delta % 60)
|
||||||
|
var format_func = function(v, text, check) {
|
||||||
|
if (v <= 0 && check) {
|
||||||
|
return ""
|
||||||
|
} else {
|
||||||
|
return v + text
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return format_func(days, "d", true) + format_func(hours, "h", true) + format_func(minutes, "m", true) + format_func(seconds, "s", false)
|
||||||
|
}
|
||||||
|
var status_icon_func = function(s) {
|
||||||
|
switch (s) {
|
||||||
|
case "w_success":
|
||||||
|
return ":white_check_mark:"
|
||||||
|
case "w_failure":
|
||||||
|
return ":no_entry:"
|
||||||
|
case "w_cancelled":
|
||||||
|
return ":warning:"
|
||||||
|
case "success":
|
||||||
|
return "\u2713"
|
||||||
|
case "failure":
|
||||||
|
return "\u2717"
|
||||||
|
default:
|
||||||
|
return "\u20e0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const commit = "${{ github.sha }}".substr(0, 6)
|
||||||
|
var pr = ""
|
||||||
|
for (p of wf_run.data.pull_requests) {
|
||||||
|
pr += ",<"+ p.url + "|#" + p.number + ">"
|
||||||
|
}
|
||||||
|
if (pr != "") {
|
||||||
|
pr = "for " + pr.substr(1)
|
||||||
|
}
|
||||||
|
// build the message
|
||||||
|
var fields = []
|
||||||
|
var is_wf_success = true
|
||||||
|
var is_wf_failure = false
|
||||||
|
for (j of jobs_response.data.jobs) {
|
||||||
|
console.log(j.name, ":", j.status, j.conclusion, j.started_at, j.completed_at)
|
||||||
|
// ignore the current job running this script
|
||||||
|
if (j.status != "completed") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (j.conclusion != "success") {
|
||||||
|
is_wf_success = false
|
||||||
|
}
|
||||||
|
if (j.conclusion == "failure") {
|
||||||
|
is_wf_failure = true
|
||||||
|
}
|
||||||
|
fields.push({
|
||||||
|
type: "mrkdwn",
|
||||||
|
text: status_icon_func(j.conclusion) + " <" + j.html_url + "|" + j.name + ">\n \u21b3 completed in " + date_diff_func(new Date(j.started_at), new Date(j.completed_at))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
var workflow_status = "w_cancelled"
|
||||||
|
if (is_wf_success) {
|
||||||
|
workflow_status = "w_success"
|
||||||
|
} else if (is_wf_failure) {
|
||||||
|
workflow_status = "w_failure"
|
||||||
|
}
|
||||||
|
var slack_msg = {
|
||||||
|
blocks: [
|
||||||
|
{
|
||||||
|
type: "section",
|
||||||
|
text: {
|
||||||
|
type: "mrkdwn",
|
||||||
|
text: "<https://github.com/${{ github.repository }}|*${{ github.repository }}*>\nfrom *${{ github.ref }}@" + commit + "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "section",
|
||||||
|
text: {
|
||||||
|
type: "mrkdwn",
|
||||||
|
text: status_icon_func(workflow_status) + " *${{ github.workflow }}* " + pr + "\nWorkflow run <" + wf_run.data.html_url + "|#${{ github.run_number }}> completed in " + date_diff_func(new Date(wf_run.data.created_at), new Date(wf_run.data.updated_at))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "divider"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "section",
|
||||||
|
fields: fields
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
return slack_msg
|
||||||
|
- name: Send to Slack
|
||||||
|
if: success()
|
||||||
|
run: |
|
||||||
|
curl -X POST ${{ secrets.SLACK_WEBHOOK }} -H "Content-type: application/json" --data '${{ steps.status.outputs.result }}'
|
|
@ -3,6 +3,8 @@ on:
|
||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
- 'v*'
|
- 'v*'
|
||||||
|
env:
|
||||||
|
BINTRAY_PACKAGE: istanbul
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Build on ${{ matrix.vm }}
|
name: Build on ${{ matrix.vm }}
|
||||||
|
@ -32,27 +34,17 @@ jobs:
|
||||||
with:
|
with:
|
||||||
name: artifacts-${{ steps.meta.outputs.os-arch }}
|
name: artifacts-${{ steps.meta.outputs.os-arch }}
|
||||||
path: build
|
path: build
|
||||||
deploy:
|
predeploy:
|
||||||
name: Deploy ${{ matrix.os-arch }} dist to Bintray
|
name: Prepare Bintray
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs:
|
|
||||||
- build
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
os-arch: ["linux_amd64", "darwin_amd64"]
|
|
||||||
steps:
|
steps:
|
||||||
- name: Setup jfrog CLI
|
- name: Setup jfrog CLI
|
||||||
uses: jfrog/setup-jfrog-cli@v1
|
uses: jfrog/setup-jfrog-cli@v1
|
||||||
- name: Download artifacts
|
|
||||||
uses: actions/download-artifact@v1
|
|
||||||
with:
|
|
||||||
name: artifacts-${{ matrix.os-arch }}
|
|
||||||
- name: Extract metadata
|
- name: Extract metadata
|
||||||
id: meta
|
id: meta
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=version::${GITHUB_REF##*/}"
|
echo "::set-output name=version::${GITHUB_REF##*/}"
|
||||||
echo "::set-output name=package::istanbul"
|
echo "::set-output name=package::${{ env.BINTRAY_PACKAGE }}"
|
||||||
echo "::set-output name=upload-path::istanbul-tools"
|
|
||||||
- name: Prepare ${{ steps.meta.outputs.package }}@${{ steps.meta.outputs.version }} in Bintray
|
- name: Prepare ${{ steps.meta.outputs.package }}@${{ steps.meta.outputs.version }} in Bintray
|
||||||
run: |
|
run: |
|
||||||
CHECK_PACKAGE="${{ secrets.BINTRAY_ORGANIZATION }}/${{ secrets.BINTRAY_REPOSITORY }}/${{ steps.meta.outputs.package }}"
|
CHECK_PACKAGE="${{ secrets.BINTRAY_ORGANIZATION }}/${{ secrets.BINTRAY_REPOSITORY }}/${{ steps.meta.outputs.package }}"
|
||||||
|
@ -68,12 +60,32 @@ jobs:
|
||||||
--vcs-tag ${{ steps.meta.outputs.version }} --released $(date -u +"%Y-%m-%dT%H:%M:%SZ") \
|
--vcs-tag ${{ steps.meta.outputs.version }} --released $(date -u +"%Y-%m-%dT%H:%M:%SZ") \
|
||||||
$CHECK_VERSION
|
$CHECK_VERSION
|
||||||
fi
|
fi
|
||||||
|
deploy:
|
||||||
|
name: Deploy ${{ matrix.os-arch }} dist to Bintray
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs:
|
||||||
|
- build
|
||||||
|
- predeploy
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os-arch: ["linux_amd64", "darwin_amd64"]
|
||||||
|
steps:
|
||||||
|
- name: Setup jfrog CLI
|
||||||
|
uses: jfrog/setup-jfrog-cli@v1
|
||||||
|
- name: Download artifacts
|
||||||
|
uses: actions/download-artifact@v1
|
||||||
|
with:
|
||||||
|
name: artifacts-${{ matrix.os-arch }}
|
||||||
|
- name: Extract metadata
|
||||||
|
id: meta
|
||||||
|
run: |
|
||||||
|
echo "::set-output name=version::${GITHUB_REF##*/}"
|
||||||
|
echo "::set-output name=package::${{ env.BINTRAY_PACKAGE }}"
|
||||||
- name: Upload to Bintray
|
- name: Upload to Bintray
|
||||||
run: |
|
run: |
|
||||||
jfrog bt upload --key ${{ secrets.BINTRAY_API_KEY }} --user ${{ secrets.BINTRAY_USER }} --publish --override \
|
jfrog bt upload --key ${{ secrets.BINTRAY_API_KEY }} --user ${{ secrets.BINTRAY_USER }} --publish --override \
|
||||||
"artifacts-${{ matrix.os-arch }}/*.*" \
|
"artifacts-${{ matrix.os-arch }}/*.*" \
|
||||||
${{ secrets.BINTRAY_ORGANIZATION }}/${{ secrets.BINTRAY_REPOSITORY }}/${{ steps.meta.outputs.package }}/${{ steps.meta.outputs.version }} \
|
${{ secrets.BINTRAY_ORGANIZATION }}/${{ secrets.BINTRAY_REPOSITORY }}/${{ steps.meta.outputs.package }}/${{ steps.meta.outputs.version }}
|
||||||
${{ steps.meta.outputs.upload-path }}/
|
|
||||||
notify:
|
notify:
|
||||||
name: Notify Slack
|
name: Notify Slack
|
||||||
needs:
|
needs:
|
||||||
|
@ -203,4 +215,4 @@ jobs:
|
||||||
- name: Send to Slack
|
- name: Send to Slack
|
||||||
if: success()
|
if: success()
|
||||||
run: |
|
run: |
|
||||||
curl -X POST ${{ secrets.SLACK_WEBHOOK_URL}} -H "Content-type: application/json" --data '${{ steps.status.outputs.result }}'
|
curl -X POST ${{ secrets.SLACK_WEBHOOK }} -H "Content-type: application/json" --data '${{ steps.status.outputs.result }}'
|
46
.travis.yml
46
.travis.yml
|
@ -1,46 +0,0 @@
|
||||||
language: go
|
|
||||||
sudo: required
|
|
||||||
go:
|
|
||||||
- 1.11.5
|
|
||||||
- 1.12.4
|
|
||||||
env:
|
|
||||||
- TEST=unit
|
|
||||||
- TEST=istanbul
|
|
||||||
- TEST=quorum
|
|
||||||
|
|
||||||
services:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
install:
|
|
||||||
- go get github.com/onsi/ginkgo/ginkgo
|
|
||||||
- unset GOPATH
|
|
||||||
|
|
||||||
script:
|
|
||||||
- 'if [ ${TEST} = "unit" ]; then
|
|
||||||
travis_wait 30 go test -v ./... --timeout 30m;
|
|
||||||
elif [ ${TEST} = "istanbul" ]; then
|
|
||||||
cd ${TRAVIS_BUILD_DIR}/tests/functional && travis_wait 120 ginkgo -r --progress;
|
|
||||||
elif [ ${TEST} = "quorum" ]; then
|
|
||||||
cd ${TRAVIS_BUILD_DIR}/tests/quorum && travis_wait 120 ginkgo -r --progress;
|
|
||||||
else
|
|
||||||
echo "Invalid env"
|
|
||||||
exit 2;
|
|
||||||
fi'
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
include:
|
|
||||||
- stage: release
|
|
||||||
go: 1.11
|
|
||||||
if: tag =~ ^v
|
|
||||||
env:
|
|
||||||
- TEST=none
|
|
||||||
- REV="$TRAVIS_TAG"
|
|
||||||
deploy:
|
|
||||||
provider: releases
|
|
||||||
api_key: "$GITHUB_OAUTH_TOKEN"
|
|
||||||
skip_cleanup: true
|
|
||||||
on:
|
|
||||||
tags: true
|
|
|
@ -1,9 +1,12 @@
|
||||||
package address
|
package address
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/ecdsa"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
)
|
)
|
||||||
|
@ -15,20 +18,32 @@ var (
|
||||||
Usage: "Extract validator address",
|
Usage: "Extract validator address",
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
nodeKeyHexFlag,
|
nodeKeyHexFlag,
|
||||||
|
nodeIdHexFlag,
|
||||||
},
|
},
|
||||||
Description: `Extract validator address`,
|
Description: `Extract validator address`,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func address(ctx *cli.Context) error {
|
func address(ctx *cli.Context) error {
|
||||||
if !ctx.IsSet(nodeKeyHexFlag.Name) {
|
if (!ctx.IsSet(nodeKeyHexFlag.Name) && !ctx.IsSet(nodeIdHexFlag.Name)) || (ctx.IsSet(nodeKeyHexFlag.Name) && ctx.IsSet(nodeIdHexFlag.Name)) {
|
||||||
return cli.NewExitError("Must supply nodekey hex", 10)
|
return cli.NewExitError("Must supply nodekey or nodeid hex", 10)
|
||||||
}
|
}
|
||||||
nodeKeyHex := ctx.String(nodeKeyHexFlag.Name)
|
var publicKey ecdsa.PublicKey
|
||||||
privKey, err := crypto.HexToECDSA(nodeKeyHex)
|
if ctx.IsSet(nodeKeyHexFlag.Name) {
|
||||||
if err != nil {
|
nodeKeyHex := ctx.String(nodeKeyHexFlag.Name)
|
||||||
return err
|
privKey, err := crypto.HexToECDSA(nodeKeyHex)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
publicKey = privKey.PublicKey
|
||||||
}
|
}
|
||||||
fmt.Printf("0x%s\n", hex.EncodeToString(crypto.PubkeyToAddress(privKey.PublicKey).Bytes()))
|
if ctx.IsSet(nodeIdHexFlag.Name) {
|
||||||
|
pubKey, err := enode.HexPubkey(ctx.String(nodeIdHexFlag.Name))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
publicKey = *pubKey
|
||||||
|
}
|
||||||
|
fmt.Printf("0x%s\n", hex.EncodeToString(crypto.PubkeyToAddress(publicKey).Bytes()))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,4 +9,8 @@ var (
|
||||||
Name: "nodekeyhex",
|
Name: "nodekeyhex",
|
||||||
Usage: "Node key as hex",
|
Usage: "Node key as hex",
|
||||||
}
|
}
|
||||||
|
nodeIdHexFlag = cli.StringFlag{
|
||||||
|
Name: "nodeidhex",
|
||||||
|
Usage: "Public key as hex, usually used as enode address",
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue