I have a simple workflow with two servers. One clones a repository, zips it and transfers the zipped file via scp to the other server. The other server is responsible for unpacking the file, building it, killing the currently running binary and then running the freshly built binary in the specified directory.
The problem here is that the pipeline stalls with these steps. When I comment out the line to run the binary, then the problem is gone. Here are the files, I am only going to share the parts that I think are relevant:
deploy_hft_001.yml:
name: Deploy to hft_001
env:
HOST_NAME: hft_001
on:
workflow_dispatch:
jobs:
deploy:
runs-on: hft_000
steps:
- name: Check out repository code
uses: actions/checkout#v3
- name: Run deploy script
run: |
. deploy_common.sh
. deploy.sh "${HOST_NAME}"
deploy.sh:
...
echo "-> Removing build directory"
rm -rf ${BUILD_DIR}
echo "-> Killing the running app."
echo ${HOST_PASS} | sudo -S pkill -f ${BINARY_NAME}
echo "-> Killed the running app."
cd ${DEPLOYMENT_DIR}
echo "-> Running the freshly deployed app."
./${BINARY_NAME}
echo "-> Ran the freshly deployed app."
echo "-> Deployment successful to ${HOST_NAME} on folder: ${DEPLOYMENT_DIR}"
exit
echo "-> Bash exited"
EOT
echo "-> After EOT."
deploy_common.sh file is just a file to import host usernames, IPs and passwords from environment variables in the cloner server.
This is a part of the output in the workflow:
...
-> Creating build directory
-> Extracting repository
-> Deleting archive
-> Opening build directory
-> Building project
-- The CXX compiler identification is GNU 10.1.0
-- Check for working CXX compiler: /usr/local/bin/c++
-- Check for working CXX compiler: /usr/local/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/hft_001/github-actions/builds/af175d8ae26b19cf5e022e5b2ed19510a00656e2/build
Scanning dependencies of target config_manager
[ 12%] Building CXX object CMakeFiles/config_manager.dir/src/main.cpp.o
[ 25%] Building CXX object CMakeFiles/config_manager.dir/src/epoll_helper.cpp.o
[ 87%] Building CXX object CMakeFiles/config_manager.dir/src/file_helper.cpp.o
[ 87%] Building CXX object CMakeFiles/config_manager.dir/src/string_helper.cpp.o
[ 87%] Building CXX object CMakeFiles/config_manager.dir/src/socket_helper.cpp.o
[ 87%] Building CXX object CMakeFiles/config_manager.dir/src/instrument_manager.cpp.o
[ 87%] Building CXX object CMakeFiles/config_manager.dir/src/json_helper.cpp.o
[100%] Linking CXX executable config_manager
[100%] Built target config_manager
-> Creating deployment directory
-> Copying binaries into deployment directory
-> Writing deployment information
-> Removing build directory
-> Killing the running app.
-> Killed the running app.
-> Running the freshly deployed app.
I'm a daemon process, please check the output log:
sudo tail -f /var/log/config_manager.log
-> Ran the freshly deployed app.
-> Deployment successful to hft_001 on folder: ~/workspace/deployments/bist_mp_v2.0/config
-> After EOT.
[sudo] password for hft_001:
Pipeline stalls probably due to the the fact that it is prompted to provide a sudo password for some reason. I am only using sudo to pkill the app, and I am providing the host password there with echo and it works because I observe that app is killed at that line. So, I have no idea why is the runner prompted for a password? Am I missing something here?
Note that the freshly deployed application is a daemon and it runs just fine!
Related
Ok, so I am trying to split my Appium tests by their timing in CircleCI for running the test in parallel. My tests are written in behave(Python) and I am generating the JUnit XML file. Here is my config.yml file
version: 2.1
orbs:
macos: circleci/macos#2.2.0
jobs:
example-job:
macos:
xcode: 13.4.1
parallelism: 4
resource_class: large
steps:
- checkout
- run:
name: Install appium server
command: |
sudo npm update -g
sudo npm install -g appium
sudo npm install -g wd
- run:
name: Start appium server
command: appium --address localhost --port 4723
background: true
- run:
name: Installing Dependencies
command: pip3 install -r requirements.txt
- run:
name: Test application
command: |
TEST=$(circleci tests glob "features/featurefiles/*.feature" | circleci tests split --split-by=timings --timings-type=classname)
echo $TEST
behave $TEST --junit
- store_test_results:
path: reports
- store_artifacts:
path: ./Logs
destination: logs-file
- store_artifacts:
path: ./screenshots
workflows:
example-workflow:
jobs:
- example-job
When I am running the test, I am getting the error "No timing found for "features/featurefiles/XXX.feature" and it is splitting the test by the filename. It runs well but the split is not happening by the timing.
When the execution is done, I can see the data in the TESTS tab, also in the Timing Tab
I believe CircleCI is not able to read the JUnit file generated by Behave, it is searching for the different JUnit XML file. How can we make CircleCI read the JUnit file generated by Behave?
If anyone face such issue, please take a look at the classname in the JUnit report. There is a format in which CircleCI read the classname. In my case, the classname in the JUnit report was mentioned as
features.featurefiles.Login.feature
But the CircleCI was looking for the classname in below format
features/featurefiles/Login.feature
I had to write a utility to change the classname in the report once the execution was completed.Once it was done, CircleCI was able to read the timings.
Hope it help someone :)
I have 2 java projects on GitHub, the first project produces a java library and the second project uses it.
The first project is build via first job in yaml file and it installs the library in /home/runner/.m2/repository/ successfully
Then when the second project is build via the second job in the same yaml file , it fails with error
Failed to execute goal on project <>: Could not resolve dependencies
for project Could not find artifact <>:jar:1.0-
SNAPSHOT -> [Help 1]
In my second project, I have included the dependency to load this library jar(produced by first project) from the repository.
MY understanding is that my second project should load the jar library from the /home/runner/.m2/repository/ but its not loading it.
Any help is appreciated.
Also can we access /home/runner/.m2/repository/ to check if it contains the library jar.
./project_account_library/account_library => Contains maven project
./project_account_service/account_service => Contains maven project
./.github/workflows/build.yml
Here is the yml file
name: Build account service
on:
push:
branches: [main]
env:
IMAGE_NAME: accountservice
jobs:
build_dependency:
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- uses: actions/checkout#v2
- uses: actions/setup-java#v2
with:
distribution: 'temurin' # See 'Supported distributions' for available options
java-version: '17'
- name: Build Dependency
run: |
cd ./project_account_library/account_library
mvn clean install
build_accountservice:
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- uses: actions/checkout#v2
- uses: actions/setup-java#v2
with:
distribution: 'temurin' # See 'Supported distributions' for available options
java-version: '17'
- name: Build Account Service
run: |
cd ./project_account_service/account_service
mvn clean install
First Step
[INFO] Installing /home/runner/work/<>/<>/target/account_
library_1.0-SNAPSHOT.jar to
/home/runner/.m2/repository/com/<>/<>/account_library/1.0-
SNAPSHOT/account_library-1.0-SNAPSHOT.jar
Second Step
Error: Failed to execute goal on project <>: Could not resolve
dependencies for project <>: Could not find artifact com.<>.
<>:account_library:jar:1.0-SNAPSHOT -> [Help 1]
Thanks Frennky
I now used only 1 job and below is my new .yml file
- name: Build Account Service
run: |
cd ./project_account_library/account_library
mvn clean install
cd ../../project_account_service/account_service
mvn clean install
First directory is successfully built but it fails to cd to ../../project_account_service/account_service and fails to build with below error
/home/runner/work/_temp/ea229141-b0c3-455d-82f0-12ff588d420a.sh: line 12: cd ../../project_account_service/account_service: No such file or directory
The reason you're missing dependencies on your second job is because those 2 jobs, by default, run in parallel and they do so on 2 different runners. From docs:
Each job will run inside its own virtual machine runner, or inside a
container...
There's few ways you can go around this. I can suggest one quick and easy, and another that would probably be a way to go, but require slightly more effort.
Easy way out of this is to put all steps in a single job.
Better way would be to make use of Github Package repository, where
you could push your lib/dependencies and then resolve them for your
service.
For more details on Github Package repository you can check docs.
Update:
Ok, I've reread your new error and I think I understand the issue.
If I got it right your dir structure is as follows:
repo
project_account_library
account_library
project_account_service
account_service
Each run step actually starts at root of you repo. You can use working-directory like so:
# ...
- name: Build Dependency
run: mvn clean install
working-directory: ./project_account_library/account_library
# ...
- name: Build Account Service
run: mvn clean install
working-directory: ./project_account_service/account_service
I have the following file in the directory for my Openshift project which uses s2i to create a build image. This script attempts to install the cairo package.
.s2i/bin/assemble
#!/bin/bash
echo "Before assembling"
sudo yum install cairo
/usr/libexec/s2i/assemble
rc=$?
if [ $rc -eq 0 ]; then
echo "After successful assembling"
else
echo "After failed assembling"
fi
exit $rc
However, it fails with a "sudo": command not found.
This isn't a package that can be added in the requirements.txt file, and I need it for use with the WeasyPrint package. I've tried several different approaches, and this is the closest I've been able to get. (and this approach successfully builds despite the error)
Unfortunately you can't use root on open shift by default. You need to add your dependencies to DockerFile
I manually installed alamofire using the tutorial on their GitHub. It was working great until I accidentally changed what used to be Alamofire.xcodeproj to ParkR.xcodeproj. Ever since then I have received the error.
No Such Module 'Alamofire'
I would be so grateful to anyone who can solve this as I have VERY limited time to finish my project and this error has stopped me in my tracks for 5+ hours now! THANKS!
You can do it by another way by using cocoapod Depencency manager . It will take approx 10 minutes time to do . Create a new project and Just follow these steps :
1. Open the terminal and install cocoapod by just writing the command
$ gem install cocoapods
or $ sudo gem install cocoapods
After that go to the path of your project on the terminal.
$ cd "Write your path of the project or simply drag the project folder on the terminal"
Now crate the pod file by the command
$ pod init
4 . open the pod file and write your dependency name like "pod 'Alamofire' " in your case . To open pod file
$ open -a xcode podfile
and just copy past the following in your pod file (not forget to change your
target name , if you are pasting this)
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0'
use_frameworks!
target '<Your Target Name>' do
pod 'Alamofire',
end
Now , install your dependencies by
$ pod install
Once the dependencies installation is successful . Close the project and open the newly crated .XCWORKSPACE file . And write import Alamofire on the top of your class . All the best and thanks
On my platform, I need to add (set! *compile-path* (str *compile-path* ":.")) in order for (compile) to find my scripts. I'd prefer not to have to type that every time I want to compile something.
The easiest way to handle setting your "compile path" in Clojure is to use a build tool like Leiningen or Cake to manage your project. Using these tools, you get an idiomatic project structure, all your source code automatically on the compile/class path, and nice command-line tools to handle dependency retrieval, running unit tests and building your projects.
Here are some of the basic command-line tasks defined by Leiningen, and thus available to you in any project:
classpath Show the classpath of the current project.
clean Remove compiled artifacts and jars from project.
compile Compile Clojure source into .class files.
deps Download all dependencies and place them in the :library-path.
help Display a list of tasks or help for a given task.
install Install the current project or download the project specified.
interactive Enter interactive shell for calling tasks without relaunching JVM.
jar Package up all the project's files into a jar file.
javac Compile Java source files.
new Create a new project skeleton.
plugin Manage user-level plugins.
pom Write a pom.xml file to disk for Maven interop.
repl Start a repl session either with the current project or standalone.
run Run a -main function with optional command-line arguments.
swank Launch swank server for Emacs to connect.
test Run the project's tests.
test! Run a project's tests after cleaning and fetching dependencies.
uberjar Package up all the project's files and dependencies into a jar file.
So you start a new project by running lein new <name of project>, which generates a standard directory structure for a Clojure project. After you've written your code, you can run lein compile to simply compile your Clojure source, or you can go right to lein jar to package your code as a Jar file. For an executable jar that includes the Clojure language and all dependencies necessary to run your program, use lein uberjar instead.
If you don't use these tools, then you need to manage the classpath manually, to include where you store your dependency jars and where your source code lives. I highly recommend using one of the above-mentioned build tools.
You can specify -i when running Clojure to have it evaluate a file when starting up.
Below is the script I use to run Clojure as an example:
#!/bin/bash
# GUI mode
if [ "$1" != "--no-fork" ]; then
gnome-terminal -t Clojure -x $0 --no-fork $* &
exit
fi
shift
breakchars="(){}[],^%$##\"\";:''|\\"
if [ -f project.clj ]; then
lein repl
else
rlwrap --remember -c -b "$breakchars" \
java -Djava.ext.dirs=$HOME/.clojure clojure.main \
-i $HOME/.clojurerc --repl
fi
Leiningen will load ~/.lein/init.clj every time it launches. In addition, you can add a :repl-init key to your project.clj files to have that namespace loaded in each repl. Clojure is really not meant to be used standalone without any supporting tools, so calling (compile [...]) on your own is almost never the right answer.
In Clojure this is managed at the Java level (classpath etc) rather than having a .rc file. When I first started programming in Clojure I had a bash script that I would run, but now I use Leiningen.