[PYTHON] Faites quelque chose régulièrement de Heroku à Shotgun

Qu'est-ce que c'est?

Ceci est une suite de cet article

[Python + heroku] De l'état sans Python à l'affichage de quelque chose avec heroku (Partie 1) http://qiita.com/it_ks/items/afd1bdb792d41d0e1145 (Partie 2) http://qiita.com/it_ks/items/ca6c7f6e8fc89e49e46d

La raison pour laquelle je touchais heroku ces jours-ci était d'utiliser ** l'API Shotgun ** pour traiter les fusils de chasse.

Supplément 1: Contexte d'utilisation

GUNCY'S Co., Ltd. Projet Road to Stingray J'ai participé en tant que personnel de configuration Shotgun. Ici, je pense que ce serait bien si je pouvais écrire les connaissances que j'ai acquises sur Shotugn (dans le futur). Je n'ai pas pu aller trop loin, donc j'ai l'impression que la portée est limitée à la version officiellement publiée (version japonaise) ...

Je pense qu'il s'agit d'un cas de projet de taille relativement petite à moyenne et de sites multiples (travail à distance). (Shotgun est également utilisé dans des productions de 100 à 1000 personnes, mais je me demande si ce sera une histoire différente de ce cas)

Supplément 2: Tag

La balise ** "Shotgun" ** dans qiita Il était déjà utilisé dans le thème de la bibliothèque ruby du même nom. Donc, je pense qu'il serait préférable pour chaque personne de vivre séparément avec le tag "Shotgun Softrware". Si vous avez lu cet article et souhaitez publier un article sur Shotgun, Si vous êtes d'accord avec l'intention, nous vous serions reconnaissants si vous pouviez le taguer de la même manière.

Shotgun sg_01.png

https://shotgunsoftware.com/ (Agence nationale) https://www.borndigital.co.jp/software/4070.html

S'il est possible de gérer diverses situations, C'est un bijou qui a un côté assez jaja cheval sans configuration (* C'est une impression individuelle)

API Il est publié sur github.

https://github.com/shotgunsoftware/python-api

wiki

https://github.com/shotgunsoftware/python-api/wiki

Pipeline Toolkit C'est un terme général pour un groupe de kits préparés pour envelopper l'API ci-dessus, créer un lien avec divers outils externes et étendre Shotgun (Web). https://support.shotgunsoftware.com/entries/94042238-Toolkit-Home-Page Je ne m'en occuperai pas cette fois.

Comme l'API, elle est publiée sur github, et c'est principalement celle avec "** tk - **" dans la tête. tk est une abréviation de tool kit. https://github.com/shotgunsoftware

Dans le ftrack présenté dans cet article (↓) http://qiita.com/it_ks/items/374a320bc8282c7f65a8 On peut dire qu'il est équivalent à "ftrack connect".

traitement du calendrier heroku

Document officiel:

Scheduled Jobs with Custom Clock Processes in Python with APScheduler https://devcenter.heroku.com/articles/clock-processes-python

Just qiita a un article en heroku et en python

Obtenez des taux de change réguliers avec Heroku et téléchargez des journaux sur Amazon S3 http://qiita.com/gumob@github/items/ca5d76186f94e592a5f0

Le traitement périodique lui-même utilise le module "** APScheduler **". Si vous recherchez avec AP Schuler, celui qui apparaît en haut est ici.

Une petite planification avancée des travaux avec APScheduler http://qiita.com/yushin/items/a026626dbb291dd43dd8


Préparation au traitement régulier

Commençons par configurer le traitement périodique dans heroku. Nous procéderons selon cela.

https://devcenter.heroku.com/articles/clock-processes-python

Présentation d'AP Schuler

Après être descendu dans l'application et activé l'environnement vertical (← c'est le contenu jusqu'à la dernière fois),

pip install apscheduler

python


(sgenv) >pip install apscheduler
Collecting apscheduler
  Downloading APScheduler-3.0.5-py2.py3-none-any.whl (49kB)
    100% |################################| 53kB 2.4MB/s
Requirement already satisfied (use --upgrade to upgrade): six in c:\users\path\to\app\sgenv\lib\site-packages (from apscheduler)
Collecting futures (from apscheduler)
  Downloading futures-3.0.4-py2-none-any.whl
Collecting pytz (from apscheduler)
  Downloading pytz-2015.7-py2.py3-none-any.whl (476kB)
    100% |################################| 479kB 853kB/s
Collecting tzlocal (from apscheduler)
  Downloading tzlocal-1.2.tar.gz
Building wheels for collected packages: tzlocal
  Running setup.py bdist_wheel for tzlocal ... done
  Stored in directory: C:\Users\{user}\AppData\Local\pip\Cache\wheels\39\8d\3b\21db6b23bc7483a2e1cf391865427e8fbd09022
3d9db2cfab3
Successfully built tzlocal
Installing collected packages: futures, pytz, tzlocal, apscheduler
Successfully installed apscheduler-3.0.5 futures-3.0.4 pytz-2015.7 tzlocal-1.2

Aussi, Dans requirements.txt APScheduler==3.0.0 Je vais ajouter.

clock.py Préparez un script Python que vous souhaitez traiter régulièrement. Il est nommé "clock.py" selon le document précédent.

clock.py


from apscheduler.schedulers.blocking import BlockingScheduler

sched = BlockingScheduler()

@sched.scheduled_job('interval', minutes=3)
def timed_job():
    print('This job is run every three minutes.')

@sched.scheduled_job('cron', day_of_week='mon-fri', hour=17)
def scheduled_job():
    print('This job is run every weekday at 5pm.')

sched.start()

Tout d'abord, le contenu du script est le même que celui du document.

Il y a deux emplois.

Ajouté à Procfile

Ajoutez le contenu suivant à ** Procfile **.

clock: python clock.py

clock: est le nom du paramètre, et python ~ ~ est la commande que vous voulez exécuter. Autant que décrit dans le Procfile, il apparaîtra sur le tableau de bord heroku sur le Web et peut être activé / désactivé respectivement. Avec l'heroku gratuit, un seul peut être activé, donc si vous en désactivez un, vous pouvez l'activer. (Les détails de l'activation / de la désactivation seront décrits plus tard)

Déployer

git add . et git commit -m" hogehoge "ʻet git push heroku master`. Dans l'ajout et la validation, diverses choses s'écouleront selon la quantité d'APScheduler ajoutée précédemment.

échelle

Si c'est un document heroku ps:scale clock=1 Il dit, mais avec cela, vous pouvez changer l '"horloge" ajoutée au fichier Proc en "1 (= valide. ON)". Cependant, comme un processus appelé "web" est déjà en cours d'exécution, il n'est pas possible de l'exécuter dans cet état.

python


>heroku ps:scale clock=1
Scaling dynos... failed
 !    Please verify your account in order to change resources (please enter a credit card) For more information, see htt
ps://devcenter.heroku.com/categories/billing Verify now at https://heroku.com/verify

Connectez-vous à heroku avec un navigateur, désactivez le déjà activé, puis activez "horloge". freedynos.png Vous pouvez le faire à partir d'une commande au lieu d'un navigateur. Je voulais utiliser le tableau de bord.

Vérification

Maintenant, le processus appelé "clock" a démarré et le contenu de clock.py est exécuté. Je voudrais voir le journal. En regardant le journal d'heroku ↓

heroku logs

python


>heroku logs
2016-02-02T13:36:08.456761+00:00 app[web.1]:     res = instance.__dict__[self.name] = self.func(instance)
2016-02-02T13:36:08.456761+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/functional.py", line 33, in __get__
2016-02-02T13:36:08.456762+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/core/urlresolvers.py", line 417, in url_patterns
2016-02-02T13:36:08.456763+00:00 app[web.1]:     patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
2016-02-02T13:36:08.456765+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/core/urlresolvers.py", line 410, in urlconf_module
(Omis)
2016-02-08T12:23:23.304081+00:00 heroku[api]: Scale to web=0 by 〜〜@gmail.com
2016-02-08T12:23:24.758985+00:00 heroku[api]: Scale to clock=1 by 〜〜@gmail.com
2016-02-08T12:23:29.007235+00:00 heroku[clock.1]: Starting process with command `python clock.py`
2016-02-08T12:23:29.571304+00:00 heroku[clock.1]: State changed from starting to up
2016-02-08T12:26:30.559161+00:00 app[clock.1]: This job is run every three minutes.

Il a commencé à bouger en toute sécurité

Utilisez l'API Shotgun

Lorsqu'il commence à fonctionner en toute sécurité, ajoutez le contenu à l'aide de l'API Shotgun à clock.py.

Préparation API

Pip selon installation sur github. https://github.com/shotgunsoftware/python-api#installing

pip install git+git://github.com/shotgunsoftware/python-api.git

Si vous voulez corriger la version, c'est ici, donc pip install git+git://github.com/shotgunsoftware/[email protected] J'ai écrit ceci dans requirements.txt. À propos, v3.0.25 à ce moment-là

Enregistrer l'utilisateur de script avec Shotgun

Les «utilisateurs» dans Shotgun sont divisés en «** utilisateur humain » et « utilisateur de script **». Le premier est le soi-disant utilisateur, et le second est un script tel que Pipeline Toolkit. Du point de vue du fusil de chasse, la personne qui accède à la fois aux personnes et aux scripts est l'utilisateur. Enregistrons un ScriptUser pour y accéder depuis heroku.

Après vous être connecté à Shotgun, ouvrez "Scripts" dans le menu en haut à droite et cliquez sur "+ Scripts". sg_scriptuser.png

"** Nom du script " à enregistrer ici, " Clé d'application **" obtenue après inscription, Et l'URL du serveur ** Shotgun sous licence ** ("https: // {studio-name} .shotgunstudio.com") J'en aurai besoin la prochaine fois, alors prenez-en note.

De plus, comme cela me rend excité, ajoutons une icône appropriée à ScriptUser.

Enregistrer les variables d'environnement dans heroku

Même à partir de la commande (ry, mais depuis le tableau de bord. Vous pouvez définir des variables d'environnement dans "Variables de configuration" sous "Paramètres" à l'extrême droite.

config_var_01.png Appuyez sur "Reveal Config Vars" pour le montrer caché. Alors ↓ Ce sera comme ça. ![config_var_02.png](https://qiita-image-store.s3.amazonaws.com/0/102581/9279b953-428a-8da9-ba14-19b5d2019edc.png) J'ai enregistré le "nom du script", la "clé d'application" et l '"URL" que j'ai notées plus tôt.

Lire les variables d'environnement

Les variables d'environnement que vous avez renseignées précédemment sont dans le script Python ʻOs.environ.get ('{nom de la variable}') ` Vous pouvez l'utiliser en écrivant comme. Je l'ai ajouté à clock.py comme ça ↓

python


import os

SG_KEY = os.environ.get('SG_KEY')
SG_SCRIPT = os.environ.get('SG_SCRIPT')
SG_SERVER = os.environ.get('SG_SERVER')

Soyez prudent car si vous vous y habituez, vous risquez d'oublier d'écrire import os.

Obtenir un objet fusil de chasse

Shotgun() - Usage Example @Reference: Methods https://github.com/shotgunsoftware/python-api/wiki/Reference%3A-Methods#usage-example

↑ Importez et recevez l'instance de cette manière

python


import os
from shotgun_api3 import Shotgun

### get sg object ###
SG_KEY = os.environ.get('SG_KEY')
SG_SCRIPT = os.environ.get('SG_SCRIPT')
SG_SERVER = os.environ.get('SG_SERVER')

sg = Shotgun(SG_SERVER, SG_SCRIPT, SG_KEY)

Recherchez Shotgun et imprimez les résultats toutes les 3 minutes

Cette fois, je rechercherai un projet nommé ** "TEST" ** et le publierai dans le journal.

Cette fois, il n'y a qu'un seul résultat renvoyé, donc La méthode à utiliser est find_one.

sg.find_one("Project",[['name','is','TEST']],[])

S'il atteint, il sera renvoyé en tant que ** type de dictionnaire ** avec le type de données (type d'entité) et l'ID sur Shotgun comme ceci. {'type': 'Project', 'id': 69}

Le script créé en incorporant ceci ressemble à ceci ↓

clock.py


import os
from shotgun_api3 import Shotgun
from apscheduler.schedulers.blocking import BlockingScheduler

### get sg object ###
SG_SERVER = os.environ.get('SG_SERVER')
SG_SCRIPT = os.environ.get('SG_SCRIPT')
SG_KEY = os.environ.get('SG_KEY')
sg = Shotgun(SG_SERVER, SG_SCRIPT, SG_KEY)

sched = BlockingScheduler()

@sched.scheduled_job('interval', minutes=3)
def timed_job():
    testPrj = sg.find_one("Project",[['name','is','TEST']],[])
    print('every 3min search...',testPrj)

sched.start()

Vérification

journaux push et heroku.

python


2016-02-08T12:42:19.165168+00:00 heroku[clock.1]: State changed from crashed to starting
2016-02-08T12:42:23.381828+00:00 heroku[clock.1]: Starting process with command `python clock.py`
2016-02-08T12:42:24.077203+00:00 heroku[clock.1]: State changed from starting to up
2016-02-08T12:45:27.542367+00:00 app[clock.1]: ('every 3min search...', {'type': 'Project', 'id': 69})
2016-02-08T12:48:27.586542+00:00 app[clock.1]: ('every 3min search...', {'type': 'Project', 'id': 69})
2016-02-08T12:51:27.559255+00:00 app[clock.1]: ('every 3min search...', {'type': 'Project', 'id': 69})
(Omis)

La valeur de retour qui a été recherchée et atteinte est imprimée toutes les 3 minutes. J'ai atteint mon objectif de faire quelque chose sur une base régulière.


Résumé

Ce que j'ai fait

--Ajouter un processus à Procfile, l'activer sur le tableau de bord --Préparation d'un script à l'aide de l'API Shotgun

Cependant, la version gratuite d'heroku a toujours besoin de dormir plus de 6 heures par jour, vous ne pouvez donc pas la faire tourner tout le temps.

le prochain déploiement

--Utilisez le traitement de l'API Shotgun autre que find (créer, mettre à jour, etc.) --Utilisez l'API Shotgun, qui n'est pas un processus régulier

Etc. sont possibles.

20200207 Addendum

En parlant de cela, il semble qu'un crochet Web soit attaché. J'ai hâte d'y être.

https://developer.shotgunsoftware.com/ja/3d448f5e/

Remarques

find_one https://github.com/shotgunsoftware/python-api/wiki/Reference%3A-Methods#find_one

Comment écrire un filtre utilisé pour la recherche Reference: Filter Syntax https://github.com/shotgunsoftware/python-api/wiki/Reference%3A-Filter-Syntax

Recommended Posts

Faites quelque chose régulièrement de Heroku à Shotgun
[Python + heroku] De l'état sans Python à l'affichage de quelque chose avec heroku (Partie 1)
[Python + heroku] De l'état sans Python à l'affichage de quelque chose avec heroku (partie 2)
Somme de 1 à 10
Effacez le cron.log régulièrement pour l'empêcher de se développer.
Je veux faire quelque chose avec Python à la fin
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
Transition de WSL1 à WSL2
De l'édition à l'exécution
Historique des commandes de la configuration de l'interface de ligne de commande heroku à la mise à niveau Postgre (MacOS)
Je veux faire quelque chose comme sort uniq en Python
De la construction de l'environnement au déploiement pour flask + Heroku avec Docker
Comment effectuer les réglages initiaux à partir de la création de projet Django
Que faire si l'installation du package échoue lors du déploiement sur heroku
[Python] Exportez régulièrement de CloudWatch Logs vers S3 avec Lambda