Skip to content

Commit

Permalink
Add github handling (#28)
Browse files Browse the repository at this point in the history
  • Loading branch information
saschagrunert committed Jun 28, 2019
1 parent dc1a035 commit cde206e
Show file tree
Hide file tree
Showing 16 changed files with 390 additions and 105 deletions.
31 changes: 31 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,34 @@
[![Coverage](https://coveralls.io/repos/github/saschagrunert/performabot/badge.svg?branch=master)](https://coveralls.io/github/saschagrunert/performabot?branch=master)
[![Doc](https://img.shields.io/badge/doc-performabot-orange.svg)](https://saschagrunert.github.io/performabot)
[![License MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/saschagrunert/performabot/blob/master/LICENSE)

Welcome to performabot! This little helper can be used to provide Continuous
Performance Reports within your GitHub project.

## How it works

## Depdendencies

There is only one dependency needed to get started with this project:
[nix](https://nixos.org/nix)

To build the project, simply run:

```shell
> make
```

If you need a shell where all build dependencies are already in `$PATH`, then
run:

```shell
> make shell
```

There are other useful targets within the [Makefile](Makefile), which are used
by the CI and could be worth a look.

## Contributing

You want to contribute to this project? Wow, thanks! So please just fork it and
send me a pull request.
17 changes: 11 additions & 6 deletions app/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ import Data.List ( intercalate )

import Environment
( Environment(Environment), commit, commitEnvVars
, fillEnvironment, pullRequest, pullRequestEnvVars, repoSlug
, repoSlugEnvVars, tokenEnvVars )
, fillEnvironment, owner, ownerEnvVars, pullRequest
, pullRequestEnvVars, repository, repositoryEnvVars
, tokenEnvVars )

import Log as L ( info )
import Log ( initLogger, notice, warn )
Expand Down Expand Up @@ -72,9 +73,12 @@ environment = Environment <$> strOption (long "commit" <> short 'c'
<*> strOption (long "pull-request" <> short 'p'
<> envHelp "Pull request number" pullRequestEnvVars
<> metavar "PULL_REQUEST" <> value "")
<*> strOption (long "repo-slug" <> short 'r'
<> envHelp "GitHub repository slug (owner/repo)"
repoSlugEnvVars <> metavar "REPOSLUG" <> value "")
<*> strOption (long "repository" <> short 'r'
<> envHelp "GitHub repository" repositoryEnvVars
<> metavar "REPOSITORY" <> value "")
<*> strOption (long "owner" <> short 'o'
<> envHelp "GitHub owner" ownerEnvVars <> metavar "OWNER"
<> value "")
<*> strOption (long "token" <> short 't' <> envHelp "Token" tokenEnvVars
<> metavar "TOKEN" <> value "") <**> helper
where
Expand Down Expand Up @@ -114,7 +118,8 @@ run (Args e v d) = do
env <- fillEnvironment e d
L.info . printf "Using commit: %s" $ env ^. commit
L.info . printf "Using pull request: %s" $ env ^. pullRequest
L.info . printf "Using repository slug: %s" $ env ^. repoSlug
L.info . printf "Using repository: %s" $ env ^. repository
L.info . printf "Using owner: %s" $ env ^. owner

-- Parse loop
notice "Processing input from stdin..."
Expand Down
15 changes: 8 additions & 7 deletions nix/default.nix
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{ mkDerivation, aeson, ansi-terminal, base, hpack, hslogger, lens
, megaparsec, optparse-applicative, persistent, persistent-sqlite
, persistent-template, regex-compat, split, stdenv, tasty
, tasty-hspec, tasty-quickcheck, text, time
{ mkDerivation, ansi-terminal, base, bytestring, github, hpack
, hslogger, lens, megaparsec, optparse-applicative, persistent
, persistent-sqlite, persistent-template, regex-compat, stdenv
, tasty, tasty-hspec, tasty-quickcheck, text, time, vector
}:
mkDerivation {
pname = "performabot";
Expand All @@ -10,15 +10,16 @@ mkDerivation {
isLibrary = true;
isExecutable = true;
libraryHaskellDepends = [
aeson ansi-terminal base hslogger lens megaparsec persistent
persistent-sqlite persistent-template regex-compat split text time
ansi-terminal base bytestring github hslogger lens megaparsec
persistent persistent-sqlite persistent-template regex-compat text
time vector
];
libraryToolDepends = [ hpack ];
executableHaskellDepends = [
base hslogger lens optparse-applicative
];
testHaskellDepends = [
aeson base lens megaparsec tasty tasty-hspec tasty-quickcheck
base lens megaparsec tasty tasty-hspec tasty-quickcheck
];
prePatch = "hpack";
homepage = "https://github.com/saschagrunert/performabot#readme";
Expand Down
6 changes: 3 additions & 3 deletions nix/nixpkgs.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"url": "https://github.com/nixos/nixpkgs",
"rev": "80172aa0a6fad62d1371dee8318725573e7ac808",
"date": "2019-06-23T14:58:17+01:00",
"sha256": "0gsjad0mlg32mhr7cb5sgpilafmm7fjbch2nvvhc3y8f52r20nrw",
"rev": "2072043efbd74b40ef107e235287ba91e489695b",
"date": "2019-06-27T14:15:37+02:00",
"sha256": "1f8jdb4w6sg6h66gn4n1gaq6bivjmlagxzwni9n7nqz3h39ivpwx",
"fetchSubmodules": false
}
28 changes: 28 additions & 0 deletions nix/overlay.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
_: pkgs: {
haskellPackages = pkgs.haskellPackages.override (old: {
overrides = pkgs.lib.composeExtensions (old.overrides or (_: _: {})) (self: super: {
binary-instances = pkgs.haskell.lib.dontCheck (pkgs.haskell.lib.overrideCabal super.binary-instances (old: {
libraryHaskellDepends = old.libraryHaskellDepends ++ [
self.binary-orphans_1_0_1
];
broken = false;
}));
binary-orphans_1_0_1 = pkgs.haskell.lib.dontCheck super.binary-orphans_1_0_1;
github = pkgs.haskell.lib.overrideCabal super.github (old: {
broken = false;
version = "0.22";
sha256 = "15py79qcpj0k331i42njgwkirwyiacbc5razmxnm4672dvvip2qk";
libraryHaskellDepends = old.libraryHaskellDepends ++ [
self.binary-instances self.exceptions self.transformers-compat
];
});
time-compat = pkgs.haskell.lib.dontCheck (pkgs.haskell.lib.overrideCabal super.time-compat (old: {
version = "1.9.2.2";
sha256 = "05va0rqs759vbridbcl6hksp967j9anjvys8vx72fnfkhlrn2s52";
libraryHaskellDepends = old.libraryHaskellDepends ++ [
self.base-orphans
];
}));
});
});
}
4 changes: 3 additions & 1 deletion nix/release-static.nix
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
let
pkgs = (import ./nixpkgs.nix { }).pkgsMusl;
pkgs = (import ./nixpkgs.nix {
overlays = [(import ./overlay.nix)];
}).pkgsMusl;
in
(pkgs.haskellPackages.callPackage ./default.nix { }).overrideAttrs(old: {
doCheck = false;
Expand Down
2 changes: 1 addition & 1 deletion nix/release.nix
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
let
pkgs = import ./nixpkgs.nix { };
pkgs = import ./nixpkgs.nix { overlays = [(import ./overlay.nix)]; };
in
pkgs.haskellPackages.callPackage ./default.nix { }
6 changes: 3 additions & 3 deletions package.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -55,18 +55,19 @@ executables:
library:
source-dirs: src
dependencies:
- aeson
- ansi-terminal
- bytestring
- github
- hslogger
- lens
- megaparsec
- persistent
- persistent-sqlite
- persistent-template
- regex-compat
- split
- text
- time
- vector
when:
- condition: flag(static)
cc-options: -static -fPIC
Expand All @@ -81,7 +82,6 @@ tests:
- -threaded
- -with-rtsopts=-N
dependencies:
- aeson
- lens
- megaparsec
- performabot
Expand Down
14 changes: 8 additions & 6 deletions performabot.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ cabal-version: 1.12
--
-- see: https://github.com/sol/hpack
--
-- hash: 7b4271c5f25eb1fc060842b0673460b631c6ed5e1ea28a244b5546a597ae7d70
-- hash: 0c627d55fff6db0f3745e774010e624c0adbc7fa265e79a60506b182fbc4f8c9

name: performabot
version: 0.1.0
Expand All @@ -31,10 +31,12 @@ flag static
library
exposed-modules:
Environment
Github
Log
Model
Parser
ParserGo
Pretty
Result
other-modules:
Paths_performabot
Expand All @@ -43,19 +45,20 @@ library
default-extensions: GADTs GeneralizedNewtypeDeriving MultiParamTypeClasses OverloadedStrings QuasiQuotes TemplateHaskell TypeFamilies
ghc-options: -Werror -Weverything -Wno-all-missed-specialisations -Wno-implicit-prelude -Wno-missed-specialisations -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-unsafe
build-depends:
aeson
, ansi-terminal
ansi-terminal
, base
, bytestring
, github
, hslogger
, lens
, megaparsec
, persistent
, persistent-sqlite
, persistent-template
, regex-compat
, split
, text
, time
, vector
if flag(static)
cc-options: -static -fPIC
ld-options: -static -fPIC
Expand Down Expand Up @@ -90,8 +93,7 @@ test-suite performabot-test
default-extensions: GADTs GeneralizedNewtypeDeriving MultiParamTypeClasses OverloadedStrings QuasiQuotes TemplateHaskell TypeFamilies
ghc-options: -Werror -Weverything -Wno-all-missed-specialisations -Wno-implicit-prelude -Wno-missed-specialisations -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-unsafe -rtsopts -threaded -with-rtsopts=-N
build-depends:
aeson
, base
base
, lens
, megaparsec
, performabot
Expand Down
55 changes: 22 additions & 33 deletions src/Environment.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,20 @@ module Environment
, commit
, commitEnvVars
, fillEnvironment
, owner
, ownerEnvVars
, pullRequest
, pullRequestEnvVars
, repoSlug
, repoSlugEnvVars
, repository
, repositoryEnvVars
, token
, tokenEnvVars
) where

import Control.Lens ( (.~), (^.), makeLenses )
import Control.Monad ( mapM, msum )

import Data.Aeson.TH
( defaultOptions, deriveJSON, fieldLabelModifier )
import Data.List ( intercalate )
import Data.List.Split ( splitOn )

import Log ( err )

Expand All @@ -30,62 +30,57 @@ import Text.Printf ( printf )

data Environment = Environment { _commit :: String
, _pullRequest :: String
, _repoSlug :: String
, _repository :: String
, _owner :: String
, _token :: String
}
deriving Show

$(makeLenses ''Environment)

deriveJSON defaultOptions { fieldLabelModifier = drop 1 } ''Environment

-- | Try to fill the environment from local variables
fillEnvironment :: Environment -> Bool -> IO Environment
fillEnvironment e d = do
c <- getEnv (e ^. commit) "commit" commitEnvVars
p <- getEnv (e ^. pullRequest) "pull request" pullRequestEnvVars
r <- getEnv (e ^. repoSlug) "repo slug" repoSlugEnvVars
r <- getEnv (e ^. repository) "repository" repositoryEnvVars
o <- getEnv (e ^. owner) "owner" ownerEnvVars
t <- getEnv (e ^. token) "token" tokenEnvVars

-- Validate the other environment variables
if not d && any null [ c, p, r, t ]
then exitFailure
else return $ token .~ t $ pullRequest .~ p $ commit .~ c $
repoSlug .~ r $ e
else return $ token .~ t $ pullRequest .~ p $ commit .~ c $ owner .~ o $
repository .~ r $ e

-- | The prefix for local env vars
prefix :: String -> String
prefix = (++) "PB_"

-- | The split chars for defining multiple env vars in one single value
envVarSplit :: String
envVarSplit = "/$"

-- | Possible token environment variables sorted by priority
tokenEnvVars :: [String]
tokenEnvVars = [ prefix "TOKEN" ]

-- | Possible repository slug (`username/project`) environment variables sorted
-- by priority
repoSlugEnvVars :: [String]
repoSlugEnvVars =
[ prefix "REPOSLUG"
, "CIRCLE_PROJECT_USERNAME" ++ envVarSplit ++ "CIRCLE_PROJECT_REPONAME"
, "TRAVIS_REPO_SLUG"
]
-- | Possible repository environment variables sorted by priority
repositoryEnvVars :: [String]
repositoryEnvVars = [ prefix "REPOSITORY", "CIRCLE_PROJECT_REPONAME" ]

-- | Possible repository environment variables sorted by priority
ownerEnvVars :: [String]
ownerEnvVars = [ prefix "OWNER", "CIRCLE_PROJECT_USERNAME" ]

-- | Possible commit environment variables sorted by priority
commitEnvVars :: [String]
commitEnvVars = [ prefix "COMMIT", "CIRCLE_SHA1", "TRAVIS_COMMIT" ]
commitEnvVars = [ prefix "COMMIT", "CIRCLE_SHA1" ]

-- | Possible pull request environment variables sorted by priority
pullRequestEnvVars :: [String]
pullRequestEnvVars =
[ prefix "PULL_REQUEST", "CIRCLE_PR_NUMBER", "TRAVIS_PULL_REQUEST" ]
pullRequestEnvVars = [ prefix "PULL_REQUEST", "CIRCLE_PR_NUMBER" ]

-- | Generic environment variable retrieval
getEnv :: String -> String -> [String] -> IO String
getEnv "" t v = do
e <- mapM lookupSplitEnv v
e <- mapM lookupEnv v
case msum e of
Just b -> return b
_ -> do
Expand All @@ -97,9 +92,3 @@ getEnv "" t v = do
return ""

getEnv x _ _ = return x

-- | Lookup env vars but split them by `envVarSplit` before
lookupSplitEnv :: String -> IO (Maybe String)
lookupSplitEnv i = do
e <- mapM lookupEnv $ splitOn envVarSplit i
return $ intercalate "/" <$> sequence e
Loading

0 comments on commit cde206e

Please sign in to comment.