Author SHA1 Message Date
pi-ux-ce 267f753452 using the testing branch
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-03-16 14:36:44 +00:00
pi-ux-ce c33e463e09 addign a restart after restarT
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-03-16 14:32:41 +00:00
pi-ux-ce 40cfc3c9f5 prevent main runner to run if there was a testing change 2026-03-16 14:21:39 +00:00
pi-ux-ce 632ba5257e fixing image name
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m39s
2026-03-16 10:42:57 +00:00
pi-ux-ce 7127effdaf trying to setup the django testing image 2026-03-16 10:39:26 +00:00
pi-ux-ce ca3f7e964e change title page
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m2s
2026-03-03 23:12:26 +00:00
pi-ux-ce 904e779b59 changing the extra >
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m23s
2026-03-03 22:55:55 +00:00
pi-ux-ce 63054b4a3a adding some print
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m56s
2026-02-05 20:11:01 +00:00
pi-ux-ce 871f3c5ba8 put lower var
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 7m54s
2026-02-03 14:51:21 +00:00
pi-ux-ce 9c706bb9b1 Update .gitea/workflows/dockerfile_runner.yaml
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m14s
2026-01-20 00:02:19 +00:00
pi-ux-ce 06c57ca837 try v6
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 2s
2026-01-19 23:55:53 +00:00
pi-ux-ce 39a3ec055b try again
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-01-19 23:54:36 +00:00
pi-ux-ce 401cf8e1a7 Update .gitea/workflows/dockerfile_runner.yaml
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 10s
2026-01-19 23:46:19 +00:00
pi-ux-ce f50d624d22 set git location
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 10s
2026-01-19 23:45:27 +00:00
pi-ux-ce 4aeee1acb5 manually git pull
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 7s
2026-01-19 23:43:31 +00:00
pi-ux-ce b6a9cfed19 do not clean before checkout
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-01-19 23:36:15 +00:00
pi-ux-ce a67dcf763b trigger new build
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-01-19 23:31:52 +00:00
pi-ux-ce 0f58c2dcae only if present
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m12s
2026-01-19 20:53:13 +00:00
pi-ux-ce 9cb1418b0d avoid crashing if no source file
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 10s
2026-01-19 20:48:49 +00:00
pi-ux-ce f62e6ca651 trying to cache git folder
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 8s
2026-01-19 20:47:06 +00:00
pi-ux-ce 0c6ddd4904 trying host_runner
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m38s
2026-01-19 19:46:48 +00:00
Pierre Geeraert 14d4dbfe97 update runner to add curl
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-01-19 17:53:28 +00:00
Pierre Geeraert 50d0c2cd4d debug
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 5m57s
2026-01-19 17:43:25 +00:00
Pierre Geeraert 4fe45169c3 try with the exact version of the runner
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1m36s
2026-01-19 17:40:43 +00:00
Pierre Geeraert 78d93a16eb remove kubeconfig
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 23s
2026-01-19 17:25:50 +00:00
Pierre Geeraert b94bf528be display kubeconfig
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-01-19 17:23:49 +00:00
Pierre Geeraert 11ad57bce4 no need to download docker.io as the base image is doing it now 2026-01-19 17:16:07 +00:00
Pierre Geeraert 495a55f8c1 try to install docker
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 7m17s
2026-01-19 16:54:55 +00:00
Pierre Geeraert c611360c04 try debug
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 29s
2026-01-19 16:52:17 +00:00
Pierre Geeraert ada418374b trying gitea.tryton.geeraert.eu/pi-ux-ce/custom-runner-debian-slim:latest
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 35s
2026-01-19 15:57:09 +00:00
Pierre Geeraert 3bf7f2a195 trying to use debian
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 5m41s
2026-01-19 13:46:25 +00:00
pi-ux-ce 2d22cab6e7 changing to debian image
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-01-19 11:54:38 +00:00
pi-ux-ce 96dcbe1798 Update django_code/django_code/urls.py
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m14s
2026-01-08 23:58:04 +00:00
pi-ux-ce ac6dc5b426 revert e2d3868a9e
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1m58s
revert add prowlarr script in tash until I create a prowlarr project with celery
2026-01-08 23:53:12 +00:00
pi-ux-ce b4f22ffeea update due to some errors
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 2m14s
2026-01-08 23:42:30 +00:00
pi-ux-ce ca3ed630ed adding the URL
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m42s
2026-01-08 23:34:27 +00:00
pi-ux-ce e2d3868a9e add prowlarr script in tash until I create a prowlarr project with celery
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-01-08 23:31:22 +00:00
Pierre Geeraert 47314620be can only concatenate str (not bytes) to str
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m35s
2026-01-07 17:57:22 +00:00
Pierre Geeraert f26f3f2665 try a new function with clearing the key
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m45s
2026-01-07 13:42:47 +00:00
Pierre Geeraert 938b37e920 add some comments
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m52s
2026-01-07 13:31:57 +00:00
Pierre Geeraert 2c5a989306 fix syntax error
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m1s
2026-01-07 13:19:24 +00:00
Pierre Geeraert 88a6dd9316 adding the default page in case there is no redis entry
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 2m12s
2026-01-07 12:08:03 +00:00
Pierre Geeraert 77742c1d6f ubuntu-slim wasn't working
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m33s
2025-12-09 10:20:21 +00:00
Pierre Geeraert ba16c6475a Merge branch 'main' of https://gitea.tryton.geeraert.eu/pi-ux-ce/Django_kube
Gitea Actions Demo / Explore-Gitea-Actions (push) Waiting to run
2025-12-09 09:50:42 +00:00
Pierre Geeraert 1735098b3a trying ubuntu-slim 2025-12-09 09:49:49 +00:00
pierre geeraert 2fdaaa47ab f you are just trying to redirect to an absolute URL stored in Redis, your code should work provided the string is clean.
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m58s
A robust way to ensure it's treated as a simple URL might involve using Django's HttpResponseRedirect directly instead of the redirect shortcut:
2025-12-08 23:44:06 +00:00
pierre geeraert bd4e4aed27 try to debug it
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m1s
2025-12-08 23:34:41 +00:00
pierre geeraert 94a8240ad4 In Django, the <str:key> part of your URL pattern is designed to capture a value from the URL (e.g., if someone visits /redirect/go/xyz123) and pass it to the view function as a keyword argument named key.
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m51s
2025-12-08 23:22:27 +00:00
pierre geeraert be03af61ea prepare new function
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m44s
2025-12-08 23:14:34 +00:00
pierre geeraert 4da34c98f3 forgot dependencies
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m15s
2025-12-08 23:05:49 +00:00
pierre geeraert 12253f0621 try to work on the redirection
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m8s
2025-12-08 23:00:46 +00:00
Pierre Geeraert 369954f5d2 changing form submit path
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m3s
2025-12-08 09:16:20 +00:00
pierre geeraert 4eee702dce add the comment for later review
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m0s
2025-12-07 23:46:59 +00:00
pierre geeraert e90daa2e61 forgot the url
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m19s
2025-12-07 23:39:45 +00:00
pierre geeraert cc8570d02f adding reddit downloader
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m48s
2025-12-07 23:22:46 +00:00
Pierre Geeraert 98e5ea965c forgot one variable
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m59s
2025-12-05 11:16:44 +00:00
Pierre Geeraert 7a98ab1c6d cache seems good , doing a test
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 2m49s
2025-12-05 11:12:30 +00:00
Pierre Geeraert 70973a63fb frogot the step to move the cache
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m36s
2025-12-05 10:30:33 +00:00
Pierre Geeraert ad82f73c1d promising solution using volume mount
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-05 10:24:44 +00:00
Pierre Geeraert e08016c103 promising solution using volume mount
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-05 10:08:57 +00:00
Pierre Geeraert a65e99b199 another test
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-05 10:04:07 +00:00
Pierre Geeraert 4853150f07 another test
Gitea Actions Demo / Explore-Gitea-Actions (push) Waiting to run
2025-12-05 10:02:22 +00:00
Pierre Geeraert a341e66c13 another test
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-05 09:53:55 +00:00
pierre geeraert 874779d230 now reverting
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m15s
2025-12-04 23:52:19 +00:00
pierre geeraert 779e8a8b0f to revert, just a try
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 23:46:47 +00:00
pierre geeraert 8f35e88ce4 to revert, just a try
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 23:42:58 +00:00
pierre geeraert 71e874cfb4 to revert, just a try
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 23:40:27 +00:00
pierre geeraert 622b8942b5 to revert, just a try
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 23:40:16 +00:00
pierre geeraert 7aeb7d094c to revert, just a try
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 27s
2025-12-04 23:39:10 +00:00
pierre geeraert 4ee80f8b7e to revert, just a try
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 23:37:57 +00:00
pierre geeraert 4859fa6877 No matching distribution found for json
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m2s
2025-12-04 23:17:56 +00:00
pierre geeraert a1d831cdf2 another cache try
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 23:17:08 +00:00
pierre geeraert a3ee639d77 put the steps for a reddit downloader
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 5m1s
2025-12-04 22:59:15 +00:00
pierre geeraert cd274aea81 change path
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m49s
2025-12-04 19:59:53 +00:00
Pierre Geeraert aaa548eb21 1.651 IndentationError: unindent does not match any outer indentation level
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m22s
2025-12-04 18:08:51 +00:00
Pierre Geeraert 99f05a055d add the retry function
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 5m46s
2025-12-04 17:00:48 +00:00
Pierre Geeraert e614d50f9c also clean .gitea/python_build
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m55s
2025-12-04 16:54:01 +00:00
Pierre Geeraert 20526c829c revert everything
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 16:53:18 +00:00
pi-ux-ce c9ed33f108 Merge pull request 'addign this for the syntax but this solution is too slow' (#6) from revert-caching into main
Gitea Actions Demo / changes (push) Successful in 24s
Gitea Actions Demo / Build-dockerfile (push) Has been cancelled
Gitea Actions Demo / Explore-Gitea-Actions (push) Has started running
Reviewed-on: #6
2025-12-04 16:50:07 +00:00
23 changed files with 913 additions and 136 deletions
-16
View File
@@ -1,16 +0,0 @@
FROM gitea.tryton.geeraert.eu/pi-ux-ce/python:3
ENV PYTHONUNBUFFERED 1
WORKDIR /code/
# Copy only the requirements file first (Changes infrequently)
COPY requirements.txt ./
RUN --mount=type=cache,target=/root/.cache/pip pip install --upgrade pip
RUN --mount=type=cache,target=/root/.cache/pip pip list --outdated
RUN --mount=type=cache,target=/root/.cache/pip pip install --upgrade wheel
RUN --mount=type=cache,target=/root/.cache/pip pip install --upgrade setuptools
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements.txt
-15
View File
@@ -1,15 +0,0 @@
django
psycopg2
requests
proxmoxer
docker
kubernetes
ruamel.yaml
pyyaml
django-bootstrap-v5
jinja2
watchdog
celery
redis
lxml
requests
+41 -87
View File
@@ -2,96 +2,41 @@ name: Gitea Actions Demo
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
on:
push:
#paths-ignore:
# - 'requirements.txt'
branches:
- main
paths-ignore:
- 'django_testing/dockerfile'
issue_comment:
types: [created]
jobs:
# Job to check for file changes and set an output
changes:
runs-on: ubuntu-latest
outputs:
requirements_changed: ${{ steps.filter.outputs.requirements }}
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
requirements:
- 'requirements.txt'
Build-dockerfile:
runs-on: ubuntu-latest
needs: changes
if: ${{ needs.changes.outputs.requirements_changed == 'true' }}
steps:
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- name: Check out repository code
uses: actions/checkout@v4
- run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
- name: List files in the repository
run: |
ls ${{ gitea.workspace }}
- name: Compute next version
id: versioning
run: |
latest="${{ vars.PYTHON_VERSION }}"
next_version=$(echo "$latest" | awk -F. -v OFS=. '{$NF += 1 ; print}')
echo "next_version=$next_version" >> $GITHUB_ENV
echo "Variables used :"
echo "------------------------------------------------"
echo "Next version: $next_version"
- uses: actions/cache@v3
with:
path: /root/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: inject cache into docker
uses: reproducible-containers/buildkit-cache-dance@v3.1.0
with:
cache-source: /root/.cache/pip
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to gitea
uses: docker/login-action@v3
with:
registry: gitea.tryton.geeraert.eu
username: ${{ secrets.USERNAME_GITEA }}
password: ${{ secrets.PASSWORD_GITEA }}
- name: Build and push
uses: docker/build-push-action@v6
with:
context: "{{defaultContext}}:.gitea/python_build"
push: true
tags: |
gitea.tryton.geeraert.eu/pi-ux-ce/modified-python:latest
gitea.tryton.geeraert.eu/pi-ux-ce/modified-python:${{ env.next_version }}
cache-from: type=registry,ref=gitea.tryton.geeraert.eu/pi-ux-ce/modified-python:buildcache
cache-to: type=registry,ref=gitea.tryton.geeraert.eu/pi-ux-ce/modified-python:buildcache,mode=max
- name: update version in the variable
run: |
curl -X PUT -H "Content-Type: application/json" \
--user ${{ secrets.USERNAME_GITEA }}:${{ secrets.PASSWORD_GITEA }} \
https://gitea.tryton.geeraert.eu/api/v1/repos/pi-ux-ce/${{ github.event.repository.name }}/actions/variables/PYTHON_VERSION \
-d "{\"Value\":\"$next_version\"}"
Explore-Gitea-Actions:
runs-on: ubuntu-latest
env:
RUNNER_TOOL_CACHE: /toolcache
container:
image: gitea.tryton.geeraert.eu/pi-ux-ce/custom-runner-debian-slim:1.0.6
volumes:
- act-toolcache:/opt/hostedtoolcache # this is where Runner store their cache default
runs-on: host-runner
steps:
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- name: restore git folder if exist
run: if [ -d "/opt/hostedtoolcache/${{ github.event.repository.name }}/" ]; then cp -r /opt/hostedtoolcache/${{ github.event.repository.name }}/ ${{ gitea.workspace }}; fi
- name: Check Docker Version
run: whereis docker
- name: Check out repository code
uses: actions/checkout@v4
clean: false
# - name: Manually check out repository code
# run: cd ${{ gitea.workspace }} ; git pull origin main
- run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
- name: List files in the repository
run: |
ls ${{ gitea.workspace }}
@@ -106,18 +51,19 @@ jobs:
echo "------------------------------------------------"
echo "Next version: $next_version"
- uses: actions/cache@v3
- name: Cache Docker layers
uses: actions/cache@v4
with:
path: /root/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
path: /opt/hostedtoolcache/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-pip-
${{ runner.os }}-buildx-
- name: inject cache into docker
uses: reproducible-containers/buildkit-cache-dance@v3.1.0
with:
cache-source: /root/.cache/pip
cache-source: /opt/hostedtoolcache/pip
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
@@ -136,8 +82,13 @@ jobs:
tags: |
gitea.tryton.geeraert.eu/pi-ux-ce/django-python:latest
gitea.tryton.geeraert.eu/pi-ux-ce/django-python:${{ env.next_version }}
cache-from: type=registry,ref=gitea.tryton.geeraert.eu/pi-ux-ce/django-python:buildcache
cache-to: type=registry,ref=gitea.tryton.geeraert.eu/pi-ux-ce/django-python:buildcache,mode=max
cache-from: type=local,src=/opt/hostedtoolcache/.buildx-cache
cache-to: type=local,dest=/opt/hostedtoolcache/.buildx-cache-new,mode=max
- name: Move cache
run: |
rm -rf /opt/hostedtoolcache/.buildx-cache
mv /opt/hostedtoolcache/.buildx-cache-new /opt/hostedtoolcache/.buildx-cache
- name: Rollout Django to force pulling the new image
uses: actions-hub/kubectl@master
@@ -160,3 +111,6 @@ jobs:
--user ${{ secrets.USERNAME_GITEA }}:${{ secrets.PASSWORD_GITEA }} \
https://gitea.tryton.geeraert.eu/api/v1/repos/pi-ux-ce/${{ github.event.repository.name }}/actions/variables/VERSION \
-d "{\"Value\":\"$next_version\"}"
- name: backup git for future use
run: cp -r ${{ gitea.workspace }} /opt/hostedtoolcache/${{ github.event.repository.name }}/
@@ -0,0 +1,69 @@
name: Gitea Actions Demo
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
on:
push:
branches:
- "testing"
paths:
- 'django_testing/dockerfile'
tags-ignore:
- '*'
jobs:
Explore-Gitea-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- name: Check out repository code
uses: actions/checkout@v4
- run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
- name: List files in the repository
run: |
ls ${{ gitea.workspace }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Compute next version
id: versioning
run: |
latest="${{ vars.VERSION_TESTING }}"
next_version=$(echo "$latest" | awk -F. -v OFS=. '{$NF += 1 ; print}')
echo "next_version=$next_version" >> $GITHUB_ENV
echo "Variables used :"
echo "------------------------------------------------"
echo "Next version: $next_version"
- name: Login to gitea
uses: docker/login-action@v3
with:
registry: gitea.tryton.geeraert.eu
username: ${{ secrets.USERNAME_GITEA }}
password: ${{ secrets.PASSWORD_GITEA }}
- name: Build and push
uses: docker/build-push-action@v6
with:
context: django_testing/
push: true
tags: |
gitea.tryton.geeraert.eu/pi-ux-ce/django-testing:latest
gitea.tryton.geeraert.eu/pi-ux-ce/django-testing:${{ env.next_version }}
cache-from: type=registry,ref=gitea.tryton.geeraert.eu/pi-ux-ce/geoip2-nginx:buildcache
cache-to: type=registry,ref=gitea.tryton.geeraert.eu/pi-ux-ce/geoip2-nginx:buildcache,mode=max
- name: update version in the variable
run: |
curl -X PUT -H "Content-Type: application/json" \
--user ${{ secrets.USERNAME_GITEA }}:${{ secrets.PASSWORD_GITEA }} \
https://gitea.tryton.geeraert.eu/api/v1/repos/pi-ux-ce/${{ github.event.repository.name }}/actions/variables/VERSION_TESTING \
-d "{\"Value\":\"$next_version\"}"
- name: Rollout Django to force pulling the new image
uses: actions-hub/kubectl@master
env:
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
with:
args: rollout restart deployment django-testing -n django-testing
- run: echo "🍏 This job's status is ${{ job.status }}."
@@ -0,0 +1,23 @@
name: Gitea Actions Demo
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
on:
push:
branches:
- "testing"
tags-ignore:
- '*'
jobs:
Explore-Gitea-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- name: Rollout Django to force pulling the new image
uses: actions-hub/kubectl@master
env:
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
with:
args: rollout restart deployment django-testing -n django-testing
- run: echo "🍏 This job's status is ${{ job.status }}."
+1 -1
View File
@@ -56,7 +56,7 @@ TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
#'DIRS': ["/code/django_code/templates","/code/django_code/dashboard/templates/"],
'DIRS': [BASE_DIR / "templates","django_code/dashboard/templates/","django_code/stash_management/templates"],
'DIRS': [BASE_DIR / "templates","django_code/dashboard/templates/","django_code/stash_management/templates","django_code/website_redirection/templates"],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
+14 -3
View File
@@ -25,6 +25,7 @@ from dashboard import views as dashboardview
from kubernetes_connection import apps as kubernetes_connection
from stash_management import apps as stashapp
from stash_management import views as stashview
from website_redirection import apps as website_redirectionapp
urlpatterns = [
# path('admin/', admin.site.urls),
@@ -34,7 +35,16 @@ urlpatterns = [
path('simpsons/', random_simpsons.simpsons),
path('download_file/', random_simpsons.download_file),
################### paperless ###################
################### Redirect ###################
path('redirect/hello/', website_redirectionapp.hello),
path('redirect/set/', website_redirectionapp.redirect),
path('redirect/get/<str:key>', website_redirectionapp.display_key),
path('redirect/go/<str:key>', website_redirectionapp.redirect_to_key),
path('redirect/redirect-form/', website_redirectionapp.redirect_process, name='submit_form'),
path('redirect/clearkey/', website_redirectionapp.clearkey_process, name='submit_form'),
################### paperless ###################
path('paperless/hello/', paperless_django.hello),
# path('simpsons/', random_simpsons.simpsons),
@@ -59,17 +69,18 @@ urlpatterns = [
path('kubernetes_connection/scale_up/<str:namespace_name>/<str:deploy_name>', kubernetes_connection.scale_up),
path('kubernetes_connection/scale_down/<str:namespace_name>/<str:deploy_name>', kubernetes_connection.scale_down),
################## kubernetes_connection#####
################## stash#####
path('stash/', stashview.home),
path('stash/hello/', stashapp.hello),
path('stash/form/', stashapp.form),
path('stash/incremental/', stashapp.incremental),
path('stash/album/', stashapp.album),
path('stash/album-form/', stashapp.album_form, name='submit_form'),
path('stash/simple/', stashapp.simple),
path('stash/simple-form/', stashapp.simple_form, name='submit_form'),
path('stash/submit-form/', stashapp.handle_survey_form, name='submit_form'),
path('stash/incremental-form/', stashapp.incremental_form, name='submit_form'),
# path('bookstack/', docker_connection.apps.hello),
# path('test/', docker_connection.apps.http_call_test),
# path('proxmox/', docker_connection.apps.proxmox),
+63 -4
View File
@@ -2,7 +2,6 @@ from django.apps import AppConfig
from django.http import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect
#from jinja2 import Environment, FileSystemLoader
from django.core.files import File
from kubernetes import client, config
from celery import shared_task
@@ -10,6 +9,7 @@ from celery import shared_task
from lxml import html
import requests
import os
import json
import time
import random
import mimetypes
@@ -33,7 +33,7 @@ proxies = {
"https" : proxy_url
}
destination_folder = "/tmp/stash/"
destination_folder = "/stash/"
def hello(request):
return HttpResponse('<h1>Hello stash!</h1>')
@@ -41,7 +41,8 @@ def form(request):
return render(request, 'stash_form.html',{})
def album(request):
return render(request, 'album_form.html',{})
def simple(request):
return render(request, 'simple_form.html',{})
def check_and_create_destination_folder(name):
#check if the output directory exist and create if not
if not os.path.isdir(destination_folder):
@@ -116,10 +117,67 @@ def images_downloader(name,images_url_list,destination_named_folder):
opener = urlrequest.build_opener(proxy)
urlrequest.install_opener(opener)
try:
urlrequest.urlretrieve(image_url, filename )
except:
print("Can't download "+filename+" -- "+image_url)
individual_image_downloader.delay(image_url=image_url, filename=filename)
return 0
@shared_task()
def individual_image_downloader(image_url, filename ):
print("Downloading again: "+filename+" -- "+image_url)
opener = urlrequest.build_opener(proxy)
urlrequest.install_opener(opener)
try:
urlrequest.urlretrieve(image_url, filename )
except:
print("Still Can't download "+filename+" -- "+image_url+" == Cancelling")
return 0
def simple_form(request):
name = request.GET.get('name')
reddit_downloader(username=name)
text_generated = "successfully sent to the reddit downloader"
return HttpResponse(text_generated, content_type="text/plain")
def reddit_downloader(username):
#create the prerequisites folder
destination_named_folder = check_and_create_destination_folder(name=username)
url = "https://www.reddit.com/user/"+username+"/submitted/.json?limit=1000"
opener = urlrequest.build_opener(proxy)
urlrequest.install_opener(opener)
req = urlrequest.Request(url)
urlcurl = urlrequest.urlopen(req).read()
data = json.loads(urlcurl)
picture_list=[]
for children in data['data']['children']:
print("adding to the list : "+children['data']['url'])
picture_list.append(children['data']['url'])
images_downloader.delay(name=username,images_url_list=picture_list,destination_named_folder=destination_named_folder)
return 0
def redgif_donloader(username):
#on te front page of the user , https://www.redgifs.com/users/princesspizookie
# F12 and search network , find something that start as api.redgifs.com
# and the file is search?order=new&count=40&type=g
# copy as curl and you got the bearer
#curl curl 'https://api.redgifs.com/v2/users/princesspizookie/search?order=new&count=40&type=g'
#and you get the URLS , needs to be parsedw
return 0
def incremental(request):
return render(request, 'incremental_form.html',{})
@@ -165,9 +223,10 @@ def increment_and_download(minimum_increment,maximum_increment,url,url_suffix,na
increment_generated ='000' + str(increment)
url_generated = url+increment_generated+url_suffix
print(url_generated)
destination_filename = increment_generated+url_suffix
destination_file = os.path.join(destination_named_folder,destination_filename)
print(destination_file)
opener = urlrequest.build_opener(proxy)
urlrequest.install_opener(opener)
urlrequest.urlretrieve(url_generated, destination_file )
@@ -10975,7 +10975,7 @@
</div>
<!-- Product actions-->
<div class="card-footer p-4 pt-0 border-top-0 bg-transparent">
<div class="text-center"><a class="btn btn-outline-dark mt-auto" href="#">Add to cart</a></div>
<div class="text-center"><a class="btn btn-outline-dark mt-auto" href="/stash/simple">Visit</a></div>
</div>
</div>
</div>
@@ -0,0 +1,275 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Simple form</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto|Varela+Round">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<style>
@charset "UTF-8";
.m-b-xs {
margin-bottom: 2%;
}
.m-b-md {
margin-bottom: 10%;
}
.m-t-xs {
margin-top: 2%;
}
.m-t-sm {
margin-top: 5%;
}
* {
outline: 0 !important;
}
body {
padding: 2% 0;
background-color: #37404a;
}
h1 {
font-family: "Roboto", sans-serif;
font-size: 2.2em;
font-weight: 300;
color: #85ffc7;
text-transform: uppercase;
}
p {
font-family: "Roboto", sans-serif;
font-size: 1.1em;
font-weight: 300;
color: #fff;
}
a {
color: #fff;
}
a:hover {
text-decoration: none;
color: #fff;
}
#survey-form label,
#survey-form .labels {
display: block;
margin-bottom: 2%;
font-family: "Roboto", sans-serif;
font-size: 1.1em;
font-weight: 300;
color: #fff;
letter-spacing: 0.5px;
}
#survey-form input::-webkit-input-placeholder {
color: transparent !important;
}
#survey-form input::-moz-placeholder {
color: transparent !important;
}
#survey-form input:-ms-input-placeholder {
color: transparent !important;
}
#survey-form input:-moz-placeholder {
color: transparent !important;
}
#survey-form input,
#survey-form select {
display: block;
width: 100%;
overflow: hidden;
outline: none;
border: 2px solid #333;
}
#survey-form input {
margin-top: 1.5%;
padding: 0 0 5px 0;
background: transparent;
border: none;
outline: none;
border-bottom: 2px solid #fff;
font-size: 1.1em;
font-weight: 300;
color: #85ffc7;
}
#survey-form input:focus {
border-color: #85ffc7;
}
#survey-form [type=checkbox],
#survey-form [type=radio] {
display: inline-block;
width: auto;
margin: 0px 10px 0 0;
}
#survey-form [type=checkbox],
#survey-form [type=radio] {
display: inline-block;
margin: 0 10px 0 0 !important;
position: relative;
top: 5px;
right: 0;
bottom: 0;
left: 0;
-webkit-appearance: none;
-moz-appearance: none;
-o-appearance: none;
appearance: none;
height: 23px;
width: 23px;
transition: all 0.15s ease-out 0s;
background: #37404a;
color: #fff;
cursor: pointer;
outline: none;
z-index: 1000;
border: 1px solid #fff;
}
#survey-form [type=checkbox]:hover,
#survey-form [type=radio]:hover {
border-color: #85ffc7;
}
#survey-form [type=checkbox]:checked:before,
#survey-form [type=radio]:checked:before {
display: inline-block;
height: 21px;
width: 21px;
position: relative;
left: 0;
bottom: 0;
content: "";
text-align: center;
font-family: "Glyphicons Halflings";
line-height: 20px;
font-size: 15px;
color: #85ffc7;
}
#survey-form [type=checkbox]:focus,
#survey-form [type=radio]:focus {
outline: none;
border-color: #fff;
}
#survey-form [type=radio] {
border-radius: 50%;
}
#survey-form [type=radio]:after {
border-radius: 50%;
}
#survey-form [type=number] {
width: 45px;
}
#survey-form [type=number]::-webkit-inner-spin-button, #survey-form [type=number]::-webkit-outer-spin-button {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
margin: 0;
}
#survey-form select {
height: 40px;
padding-left: 5px;
background-color: #37404a;
border: 2px solid #fff;
color: #85ffc7;
}
#survey-form select option {
padding: 5px 10px;
font-weight: 300;
cursor: pointer;
}
#survey-form select option:hover {
background-color: #85ffc7;
}
#survey-form textarea {
resize: none;
margin-top: 2%;
padding: 10px 10px 0px 20px;
width: 100%;
height: 90px;
color: #85ffc7;
background-color: #37404a;
border: 2px solid #fff;
}
#survey-form .btn {
display: inline-block;
position: relative;
width: 100%;
margin: 3% 0 0 0;
height: 45px;
text-transform: uppercase;
text-decoration: none;
cursor: pointer;
border: 3px solid #85ffc7;
border-radius: 0;
font-weight: 500;
font-size: 1.2em;
color: #85ffc7;
text-align: center;
background: none;
transition: color 0.25s ease;
}
#survey-form .btn:after {
position: absolute;
content: "";
top: 0;
left: 0;
width: 0;
height: 100%;
background-color: #85ffc7;
transform-origin: left;
transition: width 0.5s ease;
z-index: -1;
}
#survey-form .btn:hover {
color: #37404a;
}
#survey-form .btn:hover:after {
width: 100%;
}
#survey-form fieldset {
margin: 5% 0 0 0;
}
.copyright {
text-align: center;
font-size: 10px;
color: #fff;
}
.copyright i {
color: #ef5350;
}
@media only screen and (max-width: 600px) {
body {
padding: 8% 0;
}
}
</style>
</head>
<main id="main" class="container">
<div class="row">
<div class="col-xs-12 col-lg-offset-3 col-lg-6">
<div class="m-b-md text-center">
<h1 id="title">Stash Form</h1>
<p id="description" class="description" class="text-center">Download form</p>
</div>
<form method="GET" action="/stash/simple-form/" id="survey-form" name="survey-form">
<fieldset>
<label for="name" id="name-label">
Name *
<input class="" type="text" id="name" name="name" placeholder="Enter your name (required)" required />
</label>
</fieldset>
<button id="submit" type="submit" class="btn">Submit the form</button>
</form>
</div>
</div>
</main>
</html>
+3
View File
@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.
+50
View File
@@ -0,0 +1,50 @@
import redis
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from django.shortcuts import render
r = redis.Redis(
host='django-redis-svc',
port=6379,
db=0 # The default Redis database index
)
def hello(request):
return HttpResponse('<h1>Hello redirect!</h1>')
def redirect(request):
return render(request, 'redirect_form.html',{})
def clearkey_process(request):
key = request.GET.get('key')
r.delete(key)
return 0
def redirect_process(request):
key = request.GET.get('key')
value = request.GET.get('value')
key = key.lower()
r.set(key, value)
text_generated = "successfully set "+value+" to "+key
return HttpResponse(text_generated, content_type="text/plain")
def display_key(request,key):
value = r.get(key)
value_extracted = str(value.decode())
text_generated = key+" is set to "+value_extracted
return HttpResponse(text_generated, content_type="text/plain")
def redirect_to_key(request,key):
value = r.get(key)
if value == None:
print(key+" is not setup, displaying default page")
return render(request, 'blank_page.html',{})
else:
value_extracted = str(value.decode('utf-8'))
print(key+" is setup to : "+value_extracted)
print(value_extracted)
return HttpResponseRedirect(value_extracted)
@@ -0,0 +1,3 @@
from django.db import models
# Create your models here.
@@ -0,0 +1,9 @@
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="icon" type="image/x-icon" href="https://cdn-icons-png.flaticon.com/512/6402/6402576.png">
<title>Streaming</title>
</head>
</html>
@@ -0,0 +1,285 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Redirect form</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto|Varela+Round">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<style>
@charset "UTF-8";
.m-b-xs {
margin-bottom: 2%;
}
.m-b-md {
margin-bottom: 10%;
}
.m-t-xs {
margin-top: 2%;
}
.m-t-sm {
margin-top: 5%;
}
* {
outline: 0 !important;
}
body {
padding: 2% 0;
background-color: #37404a;
}
h1 {
font-family: "Roboto", sans-serif;
font-size: 2.2em;
font-weight: 300;
color: #85ffc7;
text-transform: uppercase;
}
p {
font-family: "Roboto", sans-serif;
font-size: 1.1em;
font-weight: 300;
color: #fff;
}
a {
color: #fff;
}
a:hover {
text-decoration: none;
color: #fff;
}
#survey-form label,
#survey-form .labels {
display: block;
margin-bottom: 2%;
font-family: "Roboto", sans-serif;
font-size: 1.1em;
font-weight: 300;
color: #fff;
letter-spacing: 0.5px;
}
#survey-form input::-webkit-input-placeholder {
color: transparent !important;
}
#survey-form input::-moz-placeholder {
color: transparent !important;
}
#survey-form input:-ms-input-placeholder {
color: transparent !important;
}
#survey-form input:-moz-placeholder {
color: transparent !important;
}
#survey-form input,
#survey-form select {
display: block;
width: 100%;
overflow: hidden;
outline: none;
border: 2px solid #333;
}
#survey-form input {
margin-top: 1.5%;
padding: 0 0 5px 0;
background: transparent;
border: none;
outline: none;
border-bottom: 2px solid #fff;
font-size: 1.1em;
font-weight: 300;
color: #85ffc7;
}
#survey-form input:focus {
border-color: #85ffc7;
}
#survey-form [type=checkbox],
#survey-form [type=radio] {
display: inline-block;
width: auto;
margin: 0px 10px 0 0;
}
#survey-form [type=checkbox],
#survey-form [type=radio] {
display: inline-block;
margin: 0 10px 0 0 !important;
position: relative;
top: 5px;
right: 0;
bottom: 0;
left: 0;
-webkit-appearance: none;
-moz-appearance: none;
-o-appearance: none;
appearance: none;
height: 23px;
width: 23px;
transition: all 0.15s ease-out 0s;
background: #37404a;
color: #fff;
cursor: pointer;
outline: none;
z-index: 1000;
border: 1px solid #fff;
}
#survey-form [type=checkbox]:hover,
#survey-form [type=radio]:hover {
border-color: #85ffc7;
}
#survey-form [type=checkbox]:checked:before,
#survey-form [type=radio]:checked:before {
display: inline-block;
height: 21px;
width: 21px;
position: relative;
left: 0;
bottom: 0;
content: "";
text-align: center;
font-family: "Glyphicons Halflings";
line-height: 20px;
font-size: 15px;
color: #85ffc7;
}
#survey-form [type=checkbox]:focus,
#survey-form [type=radio]:focus {
outline: none;
border-color: #fff;
}
#survey-form [type=radio] {
border-radius: 50%;
}
#survey-form [type=radio]:after {
border-radius: 50%;
}
#survey-form [type=number] {
width: 45px;
}
#survey-form [type=number]::-webkit-inner-spin-button, #survey-form [type=number]::-webkit-outer-spin-button {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
margin: 0;
}
#survey-form select {
height: 40px;
padding-left: 5px;
background-color: #37404a;
border: 2px solid #fff;
color: #85ffc7;
}
#survey-form select option {
padding: 5px 10px;
font-weight: 300;
cursor: pointer;
}
#survey-form select option:hover {
background-color: #85ffc7;
}
#survey-form textarea {
resize: none;
margin-top: 2%;
padding: 10px 10px 0px 20px;
width: 100%;
height: 90px;
color: #85ffc7;
background-color: #37404a;
border: 2px solid #fff;
}
#survey-form .btn {
display: inline-block;
position: relative;
width: 100%;
margin: 3% 0 0 0;
height: 45px;
text-transform: uppercase;
text-decoration: none;
cursor: pointer;
border: 3px solid #85ffc7;
border-radius: 0;
font-weight: 500;
font-size: 1.2em;
color: #85ffc7;
text-align: center;
background: none;
transition: color 0.25s ease;
}
#survey-form .btn:after {
position: absolute;
content: "";
top: 0;
left: 0;
width: 0;
height: 100%;
background-color: #85ffc7;
transform-origin: left;
transition: width 0.5s ease;
z-index: -1;
}
#survey-form .btn:hover {
color: #37404a;
}
#survey-form .btn:hover:after {
width: 100%;
}
#survey-form fieldset {
margin: 5% 0 0 0;
}
.copyright {
text-align: center;
font-size: 10px;
color: #fff;
}
.copyright i {
color: #ef5350;
}
@media only screen and (max-width: 600px) {
body {
padding: 8% 0;
}
}
</style>
</head>
<main id="main" class="container">
<div class="row">
<div class="col-xs-12 col-lg-offset-3 col-lg-6">
<div class="m-b-md text-center">
<h1 id="title">Redirect Form</h1>
<p id="description" class="description" class="text-center">Download form</p>
</div>
<form method="GET" action="/redirect/redirect-form/" id="survey-form" name="survey-form">
<fieldset>
<label for="key" id="key-label">
Key *
<input class="" type="text" id="key" name="key" placeholder="Enter your key (required)" required />
</label>
</fieldset>
<fieldset>
<label for="value" id="value-label">
Value *
<input class="" type="value" id="value" name="value" placeholder="Enter the value (required)" />
</label>
</fieldset>
<button id="submit" type="submit" class="btn">Submit the form</button>
<button id="clearkey" type="submit" formaction="/redirect/clearkey/" class="btn">Clear the key</button>
</form>
</div>
</div>
</main>
</html>
+3
View File
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+8
View File
@@ -0,0 +1,8 @@
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
from django.shortcuts import render
def hello(request):
return HttpResponse('<h1>Hello Django!</h1>')
+30
View File
@@ -0,0 +1,30 @@
# Stage 1: Build the module
FROM python:3
ENV PYTHONUNBUFFERED 1
WORKDIR /code/
# Install build tools and MaxMind library
RUN apt-get update && \
apt-get install -y git && \
rm -rf /var/lib/apt/lists/*
# Clone the specific GeoIP2 module project
RUN git clone -b testing https://gitea.tryton.geeraert.eu/pi-ux-ce/Django_kube.git
RUN pip install --cache-dir=/opt/hostedtoolcache/pip --upgrade pip
RUN pip list --cache-dir=/opt/hostedtoolcache/pip --outdated
RUN pip install --cache-dir=/opt/hostedtoolcache/pip --upgrade wheel
RUN pip install --cache-dir=/opt/hostedtoolcache/pip --upgrade setuptools
RUN pip install --cache-dir=/opt/hostedtoolcache/pip -r Django_kube/requirements.txt
RUN python Django_kube/django_code/manage.py migrate
COPY entrypoint.sh /code/entrypoint.sh
RUN chmod +x /code/entrypoint.sh
EXPOSE 8000
ENTRYPOINT ["/code/entrypoint.sh"]
+15
View File
@@ -0,0 +1,15 @@
#!/bin/bash
cd Django_kube
#another methid but needs to rm -rf before
#git clone --depth 1 -b main https://gitea.tryton.geeraert.eu/pi-ux-ce/Django_kube.git
git pull
pip install -r requirements.txt
python django_code/manage.py migrate
python django_code/manage.py runserver "0.0.0.0:8000"
+1
View File
@@ -9,3 +9,4 @@ services:
command: python manage.py runserver 0.0.0.0:7000
ports:
- 7000:7000
+11 -1
View File
@@ -1,9 +1,19 @@
FROM gitea.tryton.geeraert.eu/pi-ux-ce/modified-python:latest
FROM gitea.tryton.geeraert.eu/pi-ux-ce/python:3
ENV PYTHONUNBUFFERED 1
WORKDIR /code/
# Copy only the requirements file first (Changes infrequently)
COPY requirements.txt ./
RUN pip install --cache-dir=/opt/hostedtoolcache/pip --upgrade pip
RUN pip list --cache-dir=/opt/hostedtoolcache/pip --outdated
RUN pip install --cache-dir=/opt/hostedtoolcache/pip --upgrade wheel
RUN pip install --cache-dir=/opt/hostedtoolcache/pip --upgrade setuptools
RUN pip install --cache-dir=/opt/hostedtoolcache/pip -r requirements.txt
# Copy the rest of your application code (Changes frequently, invalidates subsequent cache)
COPY . ./
RUN python django_code/manage.py migrate