Connecting to CircleCI
This lesson first reveals you how to properly set up the CircleCI config.yml
file, which is used to specify the environment and the commands executed in the CircleCI environment.
Subsequently, you’ll have a look at the CircleCI web interface to explore the Continuous Integration (CI) tasks, you have defined and which were run after pushing your changes to GitHub.
Note: If you want to learn more about things you can specify in the circleci/config.yml
, check out the official documentation.
00:00 Now you’re ready to connect a CircleCI pipeline to your project. Before it knows how to run your build, you need to give it a config file in a specific format.
00:10
Inside your repo, add a .circleci
folder.
00:20
CircleCI will look for a config.yml
file in here, so go ahead and make that as well. The .yml
file uses a serialization language called YAML, which is designed to be pretty human-readable.
00:37
Go ahead and copy and paste in the following code, and we’ll quickly discuss what each line is doing. These first lines are telling CircleCI which Docker container to load up to run your project in. Docker could get its own set of tutorials, so for now, just think of these Docker containers as minimal virtual machines that have just enough resources to run your code. version
is selecting the CircleCI API, and then for jobs
, you can specify multiple things that you would like to be checked. If you only have one job, you have to call it build
. You then tell CircleCI to go to Docker and then load this pre-installed circleci/python3.7
container.
01:18 CircleCI has a bunch of options around running multiple jobs, so if you’re interested, you can take a look at their documentation. For example, you could run your code on multiple versions of Python to check compatibility.
01:30
This working_directory
goes and creates a temporary directory on the build server to store all the files. Now, take a look at steps
.
01:39
The first thing that it’s going to do is checkout
the repo from GitHub, and then it’s going to create the virtual environment and install dependencies. run
says it’s going to do a set of steps that you have named install dependencies
, and then command
is just going to be the actual shell commands to get the environment set up. So it creates a virtual environment, it activates that virtual environment, and then from the requirements.txt
file, it installs all the required packages. Once it’s done that, it’s going to go to the next step, where it’s going to run the tests. It’s going to make sure that the environment’s activated and then it’s going to run flake8
and pytest
. Okay!
02:19
Now that this is here, using your Git client, add in these changes and then commit them. I’m just going to say something like 'add config files for circleci'
.
02:44 and now it’s time to go to CircleCI. Stopping over real quick, let’s make sure that the repo is updated. You should see everything that you’ve added, and I can tell right away I made a typo in the folder name, so let’s go back and change that.
03:02 Let me rename this, make sure—oops.
03:11
Make sure you spell circle
correctly. Let’s go ahead and just add that real quick.
03:32 Push that, let me refresh, there we go. Cool. And head to CircleCI. When you create your account, you can choose to log in with GitHub, which is what I did, and once you’re logged in, you should see this dashboard.
03:48
Right now, I have no projects building on CircleCI, so click on Add Project. And you should see all of your repositories here. CalculatorLibrary is what we want. And now for the setup, because you’ve already added this config.yml
file, you can just go right to Start Building. So click on that,
04:21 and this will bring you to a Jobs dashboard. If everything was correct, you should see SUCCESS, and you can actually go through here and see what it was doing.
04:33 First, it was setting up the environment, so there’s a bunch of information there. Here’s where it checked out the code from GitHub,
04:43 and then install your dependencies, and running your tests. You can see the same output that you saw before.
04:53 Now that you’ve connected your project to CircleCI, it’s time to make some changes and see how the pipeline can help you safely modify your code. Thanks for watching.
Joe Tatusko RP Team on Dec. 17, 2019
Hi Patrick, sorry for the delay, it took a while to reproduce the error on my end. You have the yml file copied almost precisely, but note the pipe operators after “command:”
CircleCI used the “|” symbol to indicate that there will be multiple lines of commands, and then handles them accordingly. Try that out and let me know if it works!
Dave Wilson on Feb. 5, 2020
My build failed due to a line in the requirements, pkg-resources==0.0.0
.
I looked into this, and apparently it is a known issue with ubuntu: github.com/pypa/pip/issues/4022.
My build passed when I removed this line from requirements.txt. Thanks for the tutorial!
Joe Tatusko RP Team on Feb. 5, 2020
That’s a great catch, thanks for sharing the fix!
Billa123 on March 24, 2020
My tests are failing while building in CircleCI. Any suggestion?
#!/bin/bash -eo pipefail
./manage.py test
/bin/bash: ./manage.py: No such file or directory
Exited with code exit status 127
CircleCI received exit code 127
Billa123 on March 24, 2020
I’m able to solve the problem. Ignore my previous comments.
Joe Tatusko RP Team on March 25, 2020
Hi Naresh, were you able to solve the unit test errors as well?
Glad to know you got it working!
Billa123 on March 25, 2020
Yes, I’m able to solve it.
Nursultan on April 27, 2020
Hey @Billa123,
how did you resolve the issue? I have the same error : /manage.py: No such file or directory
Nursultan on April 27, 2020
Hi, please disregard my previous comment. I was able to solve the issue.
Howard M Sherman on May 10, 2020
@Billa123, I got that same problem you mentioned in your message on March 24, the “./manage.py no such file or directory” error. How did you fix it?
Ricky White RP Team on May 11, 2020
Hi @Howard. That usually means you are in the wrong directory when you are accessing the manage.py
script. So you will need to fix the path
.
Mike Allan Nillo on June 20, 2020
Hi! I have received a build error: No configuration was found in your project. I run the first build while having a typo in folder, I think it has something to do with cache. How can I solve it?
Marko on Feb. 21, 2022
Hi is there a poetry variant for this config.yml file?
Megafire on Nov. 9, 2022
I am having issues with the build in circleci, Build-agent version 1.0.147923-e34ae598 (2022-11-08T15:20:13+0000) System information: Server Version: 20.10.18 Storage Driver: overlay2 Backing Filesystem: xfs Cgroup Driver: cgroupfs Cgroup Version: 1 Kernel Version: 5.15.0-1021-aws Operating System: Ubuntu 20.04.5 LTS OSType: linux Architecture: x86_64
Starting container image cache not found on this host, downloading
invalid reference format
version: 2
jobs:
build:
docker:
-image: circleci/python:3.9
working_directory: ~/repo
steps:
- checkout
- run:
name: install dependencies
command: |
python3 -m venv venv
. venv/bin/activate
pip install -r requirement.txt
- run:
name: run tests
command: |
. venv/bin/activate
flake8 --exclude=venv* --statistics
pytest -v --cov=calculator
my python environment is 3.9 so in the ymal i changed the docker image to 3.9 instead of 3.7 but it is not working, even i changed it to 3.7 still complaints about invalid reference format… I am not sure which part of the format isn’t right?
Zeph Chai on Dec. 22, 2023
Thanks for the tutorial. I just want to point out that circleci uses new images now so the config should be updated to something like this. cimg
instead of circleci
docker:
- image: cimg/python:3.12
Martin Breuss RP Team on Dec. 22, 2023
Thanks for thinking along and posting this @Zeph Chai! :D
Become a Member to join the conversation.
W Patrick Jones on Dec. 15, 2019
Installing dependencies failed for me because it ran
python3 -m venv venv . venv/bin/activate pip install -r requirements.txt
all on the same line. I copied your yml file precisely, but it is running all three commands on the same line, causing an unrecognized arguments error. Suggestions?