mirror of
https://github.com/stackbuilders/hapistrano.git
synced 2024-12-28 22:46:22 +03:00
Merge pull request #155 from stackbuilders/add_working_directory
[#149] Add working directory
This commit is contained in:
commit
ffbe5b6263
2
.gitignore
vendored
2
.gitignore
vendored
@ -16,3 +16,5 @@ cabal.sandbox.config
|
|||||||
.stack-work/
|
.stack-work/
|
||||||
dist-newstyle
|
dist-newstyle
|
||||||
result
|
result
|
||||||
|
nix/
|
||||||
|
shell.nix
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
## 0.4.2.0
|
## 0.4.2.0
|
||||||
|
### Added
|
||||||
|
* Add support for working directory
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
* GHC support for versions older than 8.0. Bounds for base corrected
|
* GHC support for versions older than 8.0. Bounds for base corrected
|
||||||
|
@ -139,7 +139,7 @@ main = do
|
|||||||
release <- if configVcAction
|
release <- if configVcAction
|
||||||
then Hap.pushRelease (task releaseFormat)
|
then Hap.pushRelease (task releaseFormat)
|
||||||
else Hap.pushReleaseWithoutVc (task releaseFormat)
|
else Hap.pushReleaseWithoutVc (task releaseFormat)
|
||||||
rpath <- Hap.releasePath configDeployPath release
|
rpath <- Hap.releasePath configDeployPath release configWorkingDir
|
||||||
forM_ (toMaybePath configSource) $ \src ->
|
forM_ (toMaybePath configSource) $ \src ->
|
||||||
Hap.scpDir src rpath
|
Hap.scpDir src rpath
|
||||||
forM_ configCopyFiles $ \(C.CopyThing src dest) -> do
|
forM_ configCopyFiles $ \(C.CopyThing src dest) -> do
|
||||||
@ -158,7 +158,7 @@ main = do
|
|||||||
(Hap.linkToShared configTargetSystem rpath configDeployPath)
|
(Hap.linkToShared configTargetSystem rpath configDeployPath)
|
||||||
forM_ configLinkedDirs
|
forM_ configLinkedDirs
|
||||||
(Hap.linkToShared configTargetSystem rpath configDeployPath)
|
(Hap.linkToShared configTargetSystem rpath configDeployPath)
|
||||||
forM_ configBuildScript (Hap.playScript configDeployPath release)
|
forM_ configBuildScript (Hap.playScript configDeployPath release configWorkingDir)
|
||||||
Hap.registerReleaseAsComplete configDeployPath release
|
Hap.registerReleaseAsComplete configDeployPath release
|
||||||
Hap.activateRelease configTargetSystem configDeployPath release
|
Hap.activateRelease configTargetSystem configDeployPath release
|
||||||
Hap.dropOldReleases configDeployPath keepReleases
|
Hap.dropOldReleases configDeployPath keepReleases
|
||||||
|
3
example/.gitignore
vendored
Normal file
3
example/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
.stack-work/
|
||||||
|
*~
|
||||||
|
.vagrant
|
50
example/README.md
Normal file
50
example/README.md
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# Example project to test hapistrano's working_dir feature
|
||||||
|
|
||||||
|
We're going to test the hapistrano's `working_dir` feature by deploying this project to a local server (Virtual machine).
|
||||||
|
To do this we need to:
|
||||||
|
|
||||||
|
1. Install [VirtualBox][virtualbox]
|
||||||
|
2. Install [Vagrant][vagrant]
|
||||||
|
3. Make sure you have hapistrano installed. You can install it via [stack] by running
|
||||||
|
```bash
|
||||||
|
stack install hapistrano
|
||||||
|
```
|
||||||
|
4. You must have a ssh key with the name `id_rsa`.If you're not sure this [article][ssh] can be helfpul.
|
||||||
|
5. Go to the `/hapistano/example` directory.
|
||||||
|
6. Execute in your terminal the next line. `*`
|
||||||
|
```bash
|
||||||
|
#This could take a couple of minutes
|
||||||
|
$ vagrant up
|
||||||
|
$ hap deploy
|
||||||
|
```
|
||||||
|
If everything went fine, this should trigger the deployment procces to the virtual machine.
|
||||||
|
7. To check if the project was built you can ssh the vagrant vm, and do the folowing:
|
||||||
|
```bash
|
||||||
|
vagrant ssh
|
||||||
|
cd /tmp/hap-examle/current/example
|
||||||
|
stack build
|
||||||
|
```
|
||||||
|
Nothing should happen since your project is already compiled.
|
||||||
|
|
||||||
|
`*` A known issue occurs if you have other vagrant vms. When trying to run `hap deploy` you could get the following console result. To avoid this issue remove the line that contains the previous RSA host key and try running `hap deploy` again.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
|
||||||
|
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
|
||||||
|
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
|
||||||
|
It is also possible that the RSA host key has just been changed.
|
||||||
|
The fingerprint for the RSA key sent by the remote host is
|
||||||
|
<host key>.
|
||||||
|
Please contact your system administrator.
|
||||||
|
Add correct host key in /path/to/.ssh/known_hosts to get rid of this message.
|
||||||
|
Offending key in /path/to/.ssh/known_hosts:<line>
|
||||||
|
RSA host key for [ip-or-host]:<port> has changed and you have requested strict checking.
|
||||||
|
Host key verification failed.
|
||||||
|
```
|
||||||
|
|
||||||
|
[virtualbox]: https://www.virtualbox.org/wiki/Downloads
|
||||||
|
[vagrant]: https://www.vagrantup.com/docs/installation
|
||||||
|
[ssh]: https://docs.github.com/en/github/authenticating-to-github/checking-for-existing-ssh-keys
|
||||||
|
[stack]: https://docs.haskellstack.org/en/stable/README/
|
2
example/Setup.hs
Normal file
2
example/Setup.hs
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
import Distribution.Simple
|
||||||
|
main = defaultMain
|
16
example/Vagrantfile
vendored
Normal file
16
example/Vagrantfile
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vm.box = "debian/buster64"
|
||||||
|
config.vm.provider "virtualbox" do |v|
|
||||||
|
v.memory = 1024
|
||||||
|
v.cpus = 2
|
||||||
|
end
|
||||||
|
|
||||||
|
# ~/.ssh/id_rsa.pub is a file in the host machine
|
||||||
|
config.vm.provision "file", source: "~/.ssh/id_rsa.pub", destination: "~/.ssh/me.pub"
|
||||||
|
config.vm.provision "shell", inline: <<-SCRIPT
|
||||||
|
apt update
|
||||||
|
apt install -y curl
|
||||||
|
curl -sSL https://get.haskellstack.org/ | sh
|
||||||
|
cat /home/vagrant/.ssh/me.pub >> /home/vagrant/.ssh/authorized_keys
|
||||||
|
SCRIPT
|
||||||
|
end
|
6
example/app/Main.hs
Normal file
6
example/app/Main.hs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
module Main where
|
||||||
|
|
||||||
|
import Lib
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = helloWorld
|
41
example/example.cabal
Normal file
41
example/example.cabal
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
cabal-version: 1.12
|
||||||
|
name: example
|
||||||
|
version: 0.1.0.0
|
||||||
|
description:
|
||||||
|
This is an example project that has been created in order to test
|
||||||
|
the deployment process using the working_dir feature of hapistrano.
|
||||||
|
author: Justin Leitgeb
|
||||||
|
maintainer: jpaucar@stackbuilders.com
|
||||||
|
copyright: 2015-Present Stack Builders Inc.
|
||||||
|
license: MIT
|
||||||
|
license-file: ../LICENSE
|
||||||
|
build-type: Simple
|
||||||
|
extra-source-files:
|
||||||
|
README.md
|
||||||
|
|
||||||
|
source-repository head
|
||||||
|
type: git
|
||||||
|
location: https://github.com/stackbuilders/hapistrano/
|
||||||
|
|
||||||
|
library
|
||||||
|
exposed-modules:
|
||||||
|
Lib
|
||||||
|
other-modules:
|
||||||
|
Paths_example
|
||||||
|
hs-source-dirs:
|
||||||
|
src
|
||||||
|
build-depends:
|
||||||
|
base >=4.7 && <5
|
||||||
|
default-language: Haskell2010
|
||||||
|
|
||||||
|
executable example-exe
|
||||||
|
main-is: Main.hs
|
||||||
|
other-modules:
|
||||||
|
Paths_example
|
||||||
|
hs-source-dirs:
|
||||||
|
app
|
||||||
|
ghc-options: -threaded -rtsopts -with-rtsopts=-N
|
||||||
|
build-depends:
|
||||||
|
base >=4.7 && <5
|
||||||
|
, example
|
||||||
|
default-language: Haskell2010
|
9
example/hap.yaml
Normal file
9
example/hap.yaml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
deploy_path: "/tmp/hap-example"
|
||||||
|
repo: "https://github.com/stackbuilders/hapistrano.git"
|
||||||
|
revision: "origin/master"
|
||||||
|
host: vagrant@127.0.0.1
|
||||||
|
port: 2222
|
||||||
|
working_directory: example
|
||||||
|
|
||||||
|
build_script:
|
||||||
|
- stack build -j1
|
6
example/src/Lib.hs
Normal file
6
example/src/Lib.hs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
module Lib
|
||||||
|
( helloWorld
|
||||||
|
) where
|
||||||
|
|
||||||
|
helloWorld :: IO ()
|
||||||
|
helloWorld = putStrLn "Hello world!"
|
3
example/stack.yaml
Normal file
3
example/stack.yaml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
resolver: lts-17.10
|
||||||
|
packages:
|
||||||
|
- .
|
12
example/stack.yaml.lock
Normal file
12
example/stack.yaml.lock
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# This file was autogenerated by Stack.
|
||||||
|
# You should not edit this file by hand.
|
||||||
|
# For more information, please see the documentation at:
|
||||||
|
# https://docs.haskellstack.org/en/stable/lock_files
|
||||||
|
|
||||||
|
packages: []
|
||||||
|
snapshots:
|
||||||
|
- completed:
|
||||||
|
size: 567241
|
||||||
|
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/17/10.yaml
|
||||||
|
sha256: 321b3b9f0c7f76994b39e0dabafdc76478274b4ff74cc5e43d410897a335ad3b
|
||||||
|
original: lts-17.10
|
@ -56,4 +56,5 @@ defaultConfiguration =
|
|||||||
, configTargetSystem = GNULinux
|
, configTargetSystem = GNULinux
|
||||||
, configReleaseFormat = Nothing
|
, configReleaseFormat = Nothing
|
||||||
, configKeepReleases = Nothing
|
, configKeepReleases = Nothing
|
||||||
|
, configWorkingDir = Nothing
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import Data.List (isPrefixOf)
|
|||||||
import Data.Maybe (mapMaybe)
|
import Data.Maybe (mapMaybe)
|
||||||
import Numeric.Natural
|
import Numeric.Natural
|
||||||
import Path
|
import Path
|
||||||
|
import Path.Internal (Path(..))
|
||||||
import Path.IO
|
import Path.IO
|
||||||
import System.Directory (getCurrentDirectory, listDirectory)
|
import System.Directory (getCurrentDirectory, listDirectory)
|
||||||
import qualified System.Hapistrano as Hap
|
import qualified System.Hapistrano as Hap
|
||||||
@ -29,6 +30,12 @@ import Test.QuickCheck
|
|||||||
testBranchName :: String
|
testBranchName :: String
|
||||||
testBranchName = "another_branch"
|
testBranchName = "another_branch"
|
||||||
|
|
||||||
|
workingDir :: Path Rel Dir
|
||||||
|
workingDir = $(mkRelDir "working_dir")
|
||||||
|
|
||||||
|
releaseDir :: Path Rel Dir
|
||||||
|
releaseDir = $(mkRelDir "releases")
|
||||||
|
|
||||||
spec :: Spec
|
spec :: Spec
|
||||||
spec = do
|
spec = do
|
||||||
describe "execWithInheritStdout" $
|
describe "execWithInheritStdout" $
|
||||||
@ -93,12 +100,33 @@ spec = do
|
|||||||
it "returns the default value" $
|
it "returns the default value" $
|
||||||
fromMaybeKeepReleases Nothing Nothing `Hspec.shouldBe` 5
|
fromMaybeKeepReleases Nothing Nothing `Hspec.shouldBe` 5
|
||||||
around withSandbox $ do
|
around withSandbox $ do
|
||||||
|
describe "releasePath" $ do
|
||||||
|
context "when the configWorkingDir is Nothing" $
|
||||||
|
it "should return the release path" $ \(deployPath, repoPath) -> do
|
||||||
|
(rpath, release) <- runHap $ do
|
||||||
|
release <- Hap.pushRelease $ mkTask deployPath repoPath
|
||||||
|
(,) <$> Hap.releasePath deployPath release Nothing
|
||||||
|
<*> pure release
|
||||||
|
|
||||||
|
rel <- parseRelDir $ renderRelease release
|
||||||
|
rpath `shouldBe` deployPath </> releaseDir </> rel
|
||||||
|
|
||||||
|
context "when the configWorkingDir is Just" $
|
||||||
|
it "should return the release path with WorkingDir" $ \(deployPath, repoPath) -> do
|
||||||
|
(rpath, release) <- runHap $ do
|
||||||
|
release <- Hap.pushRelease $ mkTask deployPath repoPath
|
||||||
|
(,) <$> Hap.releasePath deployPath release (Just workingDir)
|
||||||
|
<*> pure release
|
||||||
|
|
||||||
|
rel <- parseRelDir $ renderRelease release
|
||||||
|
rpath `shouldBe` deployPath </> releaseDir </> rel </> workingDir
|
||||||
|
|
||||||
describe "pushRelease" $ do
|
describe "pushRelease" $ do
|
||||||
it "sets up repo all right in Zsh" $ \(deployPath, repoPath) ->
|
it "sets up repo all right in Zsh" $ \(deployPath, repoPath) ->
|
||||||
runHapWithShell Zsh $ do
|
runHapWithShell Zsh $ do
|
||||||
let task = mkTask deployPath repoPath
|
let task = mkTask deployPath repoPath
|
||||||
release <- Hap.pushRelease task
|
release <- Hap.pushRelease task
|
||||||
rpath <- Hap.releasePath deployPath release
|
rpath <- Hap.releasePath deployPath release Nothing
|
||||||
-- let's check that the dir exists and contains the right files
|
-- let's check that the dir exists and contains the right files
|
||||||
(liftIO . readFile . fromAbsFile) (rpath </> $(mkRelFile "foo.txt")) `shouldReturn`
|
(liftIO . readFile . fromAbsFile) (rpath </> $(mkRelFile "foo.txt")) `shouldReturn`
|
||||||
"Foo!\n"
|
"Foo!\n"
|
||||||
@ -106,7 +134,7 @@ spec = do
|
|||||||
runHap $ do
|
runHap $ do
|
||||||
let task = mkTask deployPath repoPath
|
let task = mkTask deployPath repoPath
|
||||||
release <- Hap.pushRelease task
|
release <- Hap.pushRelease task
|
||||||
rpath <- Hap.releasePath deployPath release
|
rpath <- Hap.releasePath deployPath release Nothing
|
||||||
-- let's check that the dir exists and contains the right files
|
-- let's check that the dir exists and contains the right files
|
||||||
(liftIO . readFile . fromAbsFile) (rpath </> $(mkRelFile "foo.txt")) `shouldReturn`
|
(liftIO . readFile . fromAbsFile) (rpath </> $(mkRelFile "foo.txt")) `shouldReturn`
|
||||||
"Foo!\n"
|
"Foo!\n"
|
||||||
@ -114,7 +142,7 @@ spec = do
|
|||||||
runHap $ do
|
runHap $ do
|
||||||
let task = mkTaskWithCustomRevision deployPath repoPath testBranchName
|
let task = mkTaskWithCustomRevision deployPath repoPath testBranchName
|
||||||
release <- Hap.pushRelease task
|
release <- Hap.pushRelease task
|
||||||
rpath <- Hap.releasePath deployPath release
|
rpath <- Hap.releasePath deployPath release Nothing
|
||||||
-- let's check that the dir exists and contains the right files
|
-- let's check that the dir exists and contains the right files
|
||||||
(liftIO . readFile . fromAbsFile) (rpath </> $(mkRelFile "bar.txt")) `shouldReturn`
|
(liftIO . readFile . fromAbsFile) (rpath </> $(mkRelFile "bar.txt")) `shouldReturn`
|
||||||
"Bar!\n"
|
"Bar!\n"
|
||||||
@ -138,7 +166,7 @@ spec = do
|
|||||||
let task = mkTask deployPath repoPath
|
let task = mkTask deployPath repoPath
|
||||||
release <- Hap.pushRelease task
|
release <- Hap.pushRelease task
|
||||||
Hap.activateRelease currentSystem deployPath release
|
Hap.activateRelease currentSystem deployPath release
|
||||||
rpath <- Hap.releasePath deployPath release
|
rpath <- Hap.releasePath deployPath release Nothing
|
||||||
let rc :: Hap.Readlink Dir
|
let rc :: Hap.Readlink Dir
|
||||||
rc =
|
rc =
|
||||||
Hap.Readlink currentSystem (Hap.currentSymlinkPath deployPath)
|
Hap.Readlink currentSystem (Hap.currentSymlinkPath deployPath)
|
||||||
@ -171,7 +199,7 @@ spec = do
|
|||||||
let task = mkTask deployPath repoPath
|
let task = mkTask deployPath repoPath
|
||||||
rs <- replicateM 5 (Hap.pushRelease task)
|
rs <- replicateM 5 (Hap.pushRelease task)
|
||||||
Hap.rollback currentSystem deployPath 2
|
Hap.rollback currentSystem deployPath 2
|
||||||
rpath <- Hap.releasePath deployPath (rs !! 2)
|
rpath <- Hap.releasePath deployPath (rs !! 2) Nothing
|
||||||
let rc :: Hap.Readlink Dir
|
let rc :: Hap.Readlink Dir
|
||||||
rc =
|
rc =
|
||||||
Hap.Readlink currentSystem (Hap.currentSymlinkPath deployPath)
|
Hap.Readlink currentSystem (Hap.currentSymlinkPath deployPath)
|
||||||
@ -184,7 +212,7 @@ spec = do
|
|||||||
rs <- replicateM 5 (Hap.pushRelease task)
|
rs <- replicateM 5 (Hap.pushRelease task)
|
||||||
forM_ (take 3 rs) (Hap.registerReleaseAsComplete deployPath)
|
forM_ (take 3 rs) (Hap.registerReleaseAsComplete deployPath)
|
||||||
Hap.rollback currentSystem deployPath 2
|
Hap.rollback currentSystem deployPath 2
|
||||||
rpath <- Hap.releasePath deployPath (rs !! 0)
|
rpath <- Hap.releasePath deployPath (rs !! 0) Nothing
|
||||||
let rc :: Hap.Readlink Dir
|
let rc :: Hap.Readlink Dir
|
||||||
rc =
|
rc =
|
||||||
Hap.Readlink currentSystem (Hap.currentSymlinkPath deployPath)
|
Hap.Readlink currentSystem (Hap.currentSymlinkPath deployPath)
|
||||||
@ -201,10 +229,10 @@ spec = do
|
|||||||
Hap.dropOldReleases deployPath 5
|
Hap.dropOldReleases deployPath 5
|
||||||
-- two oldest releases should not survive:
|
-- two oldest releases should not survive:
|
||||||
forM_ (take 2 rs) $ \r ->
|
forM_ (take 2 rs) $ \r ->
|
||||||
(Hap.releasePath deployPath r >>= doesDirExist) `shouldReturn` False
|
(Hap.releasePath deployPath r Nothing >>= doesDirExist) `shouldReturn` False
|
||||||
-- 5 most recent releases should stay alive:
|
-- 5 most recent releases should stay alive:
|
||||||
forM_ (drop 2 rs) $ \r ->
|
forM_ (drop 2 rs) $ \r ->
|
||||||
(Hap.releasePath deployPath r >>= doesDirExist) `shouldReturn` True
|
(Hap.releasePath deployPath r Nothing >>= doesDirExist) `shouldReturn` True
|
||||||
-- two oldest completion tokens should not survive:
|
-- two oldest completion tokens should not survive:
|
||||||
forM_ (take 2 rs) $ \r ->
|
forM_ (take 2 rs) $ \r ->
|
||||||
(Hap.ctokenPath deployPath r >>= doesFileExist) `shouldReturn` False
|
(Hap.ctokenPath deployPath r >>= doesFileExist) `shouldReturn` False
|
||||||
@ -218,7 +246,7 @@ spec = do
|
|||||||
let task = mkTask deployPath repoPath
|
let task = mkTask deployPath repoPath
|
||||||
sharedDir = Hap.sharedPath deployPath
|
sharedDir = Hap.sharedPath deployPath
|
||||||
release <- Hap.pushRelease task
|
release <- Hap.pushRelease task
|
||||||
rpath <- Hap.releasePath deployPath release
|
rpath <- Hap.releasePath deployPath release Nothing
|
||||||
Hap.exec $ Hap.Rm sharedDir
|
Hap.exec $ Hap.Rm sharedDir
|
||||||
Hap.linkToShared currentSystem rpath deployPath "thing" `shouldReturn`
|
Hap.linkToShared currentSystem rpath deployPath "thing" `shouldReturn`
|
||||||
()
|
()
|
||||||
@ -227,7 +255,7 @@ spec = do
|
|||||||
runHap
|
runHap
|
||||||
(do let task = mkTask deployPath repoPath
|
(do let task = mkTask deployPath repoPath
|
||||||
release <- Hap.pushRelease task
|
release <- Hap.pushRelease task
|
||||||
rpath <- Hap.releasePath deployPath release
|
rpath <- Hap.releasePath deployPath release Nothing
|
||||||
Hap.linkToShared currentSystem rpath deployPath "foo.txt") `shouldThrow`
|
Hap.linkToShared currentSystem rpath deployPath "foo.txt") `shouldThrow`
|
||||||
anyException
|
anyException
|
||||||
context "when it attemps to link a file" $ do
|
context "when it attemps to link a file" $ do
|
||||||
@ -237,7 +265,7 @@ spec = do
|
|||||||
(do let task = mkTask deployPath repoPath
|
(do let task = mkTask deployPath repoPath
|
||||||
sharedDir = Hap.sharedPath deployPath
|
sharedDir = Hap.sharedPath deployPath
|
||||||
release <- Hap.pushRelease task
|
release <- Hap.pushRelease task
|
||||||
rpath <- Hap.releasePath deployPath release
|
rpath <- Hap.releasePath deployPath release Nothing
|
||||||
justExec sharedDir "mkdir foo/"
|
justExec sharedDir "mkdir foo/"
|
||||||
justExec sharedDir "echo 'Bar!' > foo/bar.txt"
|
justExec sharedDir "echo 'Bar!' > foo/bar.txt"
|
||||||
Hap.linkToShared currentSystem rpath deployPath "foo/bar.txt") `shouldThrow`
|
Hap.linkToShared currentSystem rpath deployPath "foo/bar.txt") `shouldThrow`
|
||||||
@ -248,7 +276,7 @@ spec = do
|
|||||||
let task = mkTask deployPath repoPath
|
let task = mkTask deployPath repoPath
|
||||||
sharedDir = Hap.sharedPath deployPath
|
sharedDir = Hap.sharedPath deployPath
|
||||||
release <- Hap.pushRelease task
|
release <- Hap.pushRelease task
|
||||||
rpath <- Hap.releasePath deployPath release
|
rpath <- Hap.releasePath deployPath release Nothing
|
||||||
justExec sharedDir "echo 'Bar!' > bar.txt"
|
justExec sharedDir "echo 'Bar!' > bar.txt"
|
||||||
Hap.linkToShared currentSystem rpath deployPath "bar.txt"
|
Hap.linkToShared currentSystem rpath deployPath "bar.txt"
|
||||||
(liftIO . readFile . fromAbsFile)
|
(liftIO . readFile . fromAbsFile)
|
||||||
@ -261,7 +289,7 @@ spec = do
|
|||||||
(do let task = mkTask deployPath repoPath
|
(do let task = mkTask deployPath repoPath
|
||||||
sharedDir = Hap.sharedPath deployPath
|
sharedDir = Hap.sharedPath deployPath
|
||||||
release <- Hap.pushRelease task
|
release <- Hap.pushRelease task
|
||||||
rpath <- Hap.releasePath deployPath release
|
rpath <- Hap.releasePath deployPath release Nothing
|
||||||
justExec sharedDir "mkdir foo/"
|
justExec sharedDir "mkdir foo/"
|
||||||
justExec sharedDir "echo 'Bar!' > foo/bar.txt"
|
justExec sharedDir "echo 'Bar!' > foo/bar.txt"
|
||||||
justExec sharedDir "echo 'Baz!' > foo/baz.txt"
|
justExec sharedDir "echo 'Baz!' > foo/baz.txt"
|
||||||
@ -272,7 +300,7 @@ spec = do
|
|||||||
let task = mkTask deployPath repoPath
|
let task = mkTask deployPath repoPath
|
||||||
sharedDir = Hap.sharedPath deployPath
|
sharedDir = Hap.sharedPath deployPath
|
||||||
release <- Hap.pushRelease task
|
release <- Hap.pushRelease task
|
||||||
rpath <- Hap.releasePath deployPath release
|
rpath <- Hap.releasePath deployPath release Nothing
|
||||||
justExec sharedDir "mkdir foo/"
|
justExec sharedDir "mkdir foo/"
|
||||||
justExec sharedDir "echo 'Bar!' > foo/bar.txt"
|
justExec sharedDir "echo 'Bar!' > foo/bar.txt"
|
||||||
justExec sharedDir "echo 'Baz!' > foo/baz.txt"
|
justExec sharedDir "echo 'Baz!' > foo/baz.txt"
|
||||||
|
@ -96,7 +96,7 @@ activateRelease
|
|||||||
-> Release -- ^ Release identifier to activate
|
-> Release -- ^ Release identifier to activate
|
||||||
-> Hapistrano ()
|
-> Hapistrano ()
|
||||||
activateRelease ts deployPath release = do
|
activateRelease ts deployPath release = do
|
||||||
rpath <- releasePath deployPath release
|
rpath <- releasePath deployPath release Nothing
|
||||||
let tpath = tempSymlinkPath deployPath
|
let tpath = tempSymlinkPath deployPath
|
||||||
cpath = currentSymlinkPath deployPath
|
cpath = currentSymlinkPath deployPath
|
||||||
exec (Ln ts rpath tpath) -- create a symlink for the new candidate
|
exec (Ln ts rpath tpath) -- create a symlink for the new candidate
|
||||||
@ -129,7 +129,7 @@ dropOldReleases
|
|||||||
dropOldReleases deployPath n = do
|
dropOldReleases deployPath n = do
|
||||||
dreleases <- deployedReleases deployPath
|
dreleases <- deployedReleases deployPath
|
||||||
forM_ (genericDrop n dreleases) $ \release -> do
|
forM_ (genericDrop n dreleases) $ \release -> do
|
||||||
rpath <- releasePath deployPath release
|
rpath <- releasePath deployPath release Nothing
|
||||||
exec (Rm rpath)
|
exec (Rm rpath)
|
||||||
creleases <- completedReleases deployPath
|
creleases <- completedReleases deployPath
|
||||||
forM_ (genericDrop n creleases) $ \release -> do
|
forM_ (genericDrop n creleases) $ \release -> do
|
||||||
@ -141,10 +141,11 @@ dropOldReleases deployPath n = do
|
|||||||
playScript
|
playScript
|
||||||
:: Path Abs Dir -- ^ Deploy path
|
:: Path Abs Dir -- ^ Deploy path
|
||||||
-> Release -- ^ Release identifier
|
-> Release -- ^ Release identifier
|
||||||
|
-> Maybe (Path Rel Dir) -- ^ Working directory
|
||||||
-> [GenericCommand] -- ^ Commands to execute
|
-> [GenericCommand] -- ^ Commands to execute
|
||||||
-> Hapistrano ()
|
-> Hapistrano ()
|
||||||
playScript deployDir release cmds = do
|
playScript deployDir release mWorkingDir cmds = do
|
||||||
rpath <- releasePath deployDir release
|
rpath <- releasePath deployDir release mWorkingDir
|
||||||
forM_ cmds (execWithInheritStdout . Cd rpath)
|
forM_ cmds (execWithInheritStdout . Cd rpath)
|
||||||
|
|
||||||
-- | Plays the given script on your machine locally.
|
-- | Plays the given script on your machine locally.
|
||||||
@ -201,7 +202,7 @@ cloneToRelease
|
|||||||
-> Release -- ^ 'Release' to create
|
-> Release -- ^ 'Release' to create
|
||||||
-> Hapistrano ()
|
-> Hapistrano ()
|
||||||
cloneToRelease deployPath release = do
|
cloneToRelease deployPath release = do
|
||||||
rpath <- releasePath deployPath release
|
rpath <- releasePath deployPath release Nothing
|
||||||
let cpath = cacheRepoPath deployPath
|
let cpath = cacheRepoPath deployPath
|
||||||
exec (GitClone False (Right cpath) rpath)
|
exec (GitClone False (Right cpath) rpath)
|
||||||
|
|
||||||
@ -214,7 +215,7 @@ setReleaseRevision
|
|||||||
-> String -- ^ Revision to checkout
|
-> String -- ^ Revision to checkout
|
||||||
-> Hapistrano ()
|
-> Hapistrano ()
|
||||||
setReleaseRevision deployPath release revision = do
|
setReleaseRevision deployPath release revision = do
|
||||||
rpath <- releasePath deployPath release
|
rpath <- releasePath deployPath release Nothing
|
||||||
exec (Cd rpath (GitCheckout revision))
|
exec (Cd rpath (GitCheckout revision))
|
||||||
|
|
||||||
-- | Return a list of all currently deployed releases sorted newest first.
|
-- | Return a list of all currently deployed releases sorted newest first.
|
||||||
@ -279,12 +280,16 @@ linkToShared configTargetSystem rpath configDeployPath thingToLink = do
|
|||||||
releasePath
|
releasePath
|
||||||
:: Path Abs Dir -- ^ Deploy path
|
:: Path Abs Dir -- ^ Deploy path
|
||||||
-> Release -- ^ 'Release' identifier
|
-> Release -- ^ 'Release' identifier
|
||||||
|
-> Maybe (Path Rel Dir) -- ^ Working directory
|
||||||
-> Hapistrano (Path Abs Dir)
|
-> Hapistrano (Path Abs Dir)
|
||||||
releasePath deployPath release = do
|
releasePath deployPath release mWorkingDir =
|
||||||
let rendered = renderRelease release
|
let rendered = renderRelease release
|
||||||
case parseRelDir rendered of
|
in case parseRelDir rendered of
|
||||||
Nothing -> failWith 1 (Just $ "Could not append path: " ++ rendered)
|
Nothing -> failWith 1 (Just $ "Could not append path: " ++ rendered)
|
||||||
Just rpath -> return (releasesPath deployPath </> rpath)
|
Just rpath ->
|
||||||
|
return $ case mWorkingDir of
|
||||||
|
Nothing -> releasesPath deployPath </> rpath
|
||||||
|
Just workingDir -> releasesPath deployPath </> rpath </> workingDir
|
||||||
|
|
||||||
-- | Return the full path to the git repo used for cache purposes on the
|
-- | Return the full path to the git repo used for cache purposes on the
|
||||||
-- target host filesystem.
|
-- target host filesystem.
|
||||||
|
@ -62,6 +62,7 @@ data Config = Config
|
|||||||
-- ^ The number of releases to keep, the '--keep-releases' argument passed via
|
-- ^ The number of releases to keep, the '--keep-releases' argument passed via
|
||||||
-- the CLI takes precedence over this value. If neither CLI or configuration
|
-- the CLI takes precedence over this value. If neither CLI or configuration
|
||||||
-- file value is specified, it defaults to 5
|
-- file value is specified, it defaults to 5
|
||||||
|
, configWorkingDir :: !(Maybe (Path Rel Dir))
|
||||||
} deriving (Eq, Ord, Show)
|
} deriving (Eq, Ord, Show)
|
||||||
|
|
||||||
-- | Information about source and destination locations of a file\/directory
|
-- | Information about source and destination locations of a file\/directory
|
||||||
@ -115,6 +116,7 @@ instance FromJSON Config where
|
|||||||
configTargetSystem <- o .:? "linux" .!= GNULinux
|
configTargetSystem <- o .:? "linux" .!= GNULinux
|
||||||
configReleaseFormat <- o .:? "release_format"
|
configReleaseFormat <- o .:? "release_format"
|
||||||
configKeepReleases <- o .:? "keep_releases"
|
configKeepReleases <- o .:? "keep_releases"
|
||||||
|
configWorkingDir <- o .:? "working_directory"
|
||||||
return Config {..}
|
return Config {..}
|
||||||
|
|
||||||
instance FromJSON CopyThing where
|
instance FromJSON CopyThing where
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
resolver: lts-17.7
|
resolver: lts-17.10
|
||||||
packages:
|
packages:
|
||||||
- '.'
|
- .
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
packages: []
|
packages: []
|
||||||
snapshots:
|
snapshots:
|
||||||
- completed:
|
- completed:
|
||||||
size: 565715
|
size: 567241
|
||||||
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/17/7.yaml
|
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/17/10.yaml
|
||||||
sha256: 1b5e4124989399e60e7a7901f0cefd910beea546131fb07a13a7208c4cc8b7ee
|
sha256: 321b3b9f0c7f76994b39e0dabafdc76478274b4ff74cc5e43d410897a335ad3b
|
||||||
original: lts-17.7
|
original: lts-17.10
|
||||||
|
Loading…
Reference in New Issue
Block a user