首页 > 解决方案 > GitHub Actions:工作流程永无止境

问题描述

我有一个应用程序在 GitHub Action 上无休止地运行,每次我需要手动取消工作流程。

我的main.yml文件很简单:

#main.yml
name: Python Script Workflow

on:
  schedule:
    - cron: "50 13 * * 1-5"

  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    environment:
      name: production

    steps:
      - name: Checkout repository content
        uses: actions/checkout@v2 # Checkout the repository content to github runner.

      - name: Setup Python Version
        uses: actions/setup-python@v2
        with:
          python-version: 3.9.6

      - name: Install Python dependencies
        uses: py-actions/py-dependency-install@v2
        with:
          path: "requirements.txt"

      - name: Run Python script # Run the app.py
        env:
          FROM_EMAIL: ${{ secrets.FROM_EMAIL }}
          FROM_PWD: ${{ secrets.FROM_PWD }}
          API_KEY: ${{ secrets.API_KEY }}
          API_KEY_SECRET: ${{ secrets.API_KEY_SECRET }}
          ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
          ACCESS_TOKEN_SECRET: ${{ secrets.ACCESS_TOKEN_SECRET }}
          BEARER_TOKEN: ${{ secrets.BEARER_TOKEN }}
        run: python app.py

我有一个app.py调用该文件的文件,该文件read_email.py在读取后调用下面的文件,这又会执行推文。他在这里:

#post_tweet.py
from dotenv import load_dotenv
from os import getenv
from textwrap import wrap
from time import sleep
from tweepy import OAuthHandler, API


def twitter_connect(tweet_list):
    load_dotenv()
    consumer_key = getenv('API_KEY')
    consumer_secret = getenv('API_KEY_SECRET')
    access_token = getenv('ACCESS_TOKEN')
    access_token_secret = getenv('ACCESS_TOKEN_SECRET')

    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)

    api = API(auth)
    try:
        api.verify_credentials()
        post_tweet(tweet_list, api)
    except:
        sleep(120)
        twitter_connect(tweet_list)


def post_tweet(tweet_list, api):
    for tweet in tweet_list:
        print('\n' + tweet + '\n')
        each_tweet = wrap(tweet, 280, break_long_words=False)
        original_tweet = []
        for i, chunk in zip(range(len(each_tweet)), each_tweet):
            original_tweet.extend([chunk])
            print(original_tweet)
            if i == 0:
                original_tweet[i] = api.update_status(chunk)
            else:
                original_tweet[i] = api.update_status(chunk,
                                                      in_reply_to_status_id=original_tweet[i-1].id,
                                                      auto_populate_reply_metadata=True)
            sleep(1)
        sleep(300)

当我在 localhost 上运行它时,它会正常运行并完成。但是当它在 GitHub Actions 上运行时,在最后一条推文之后,它并没有按预期完成。

有谁知道我要去哪里错了?我错过了什么?

最后构建:https ://github.com/arnonrdp/Bot-Deschamps-Newsletter/actions/runs/1329254957

编辑:

#read_email.py
from dotenv import load_dotenv
from imap_tools import MailBox, MailMessageFlags, A
from os import getenv
from post_tweet import twitter_connect
from time import sleep


def mail_connect():
    load_dotenv()
    FROM_EMAIL = getenv('FROM_EMAIL')
    FROM_PWD = getenv('FROM_PWD')
    SMTP_SERVER = "imap.gmail.com"

    mailbox = MailBox(SMTP_SERVER).login(
        FROM_EMAIL, FROM_PWD, initial_folder='INBOX')
    read_email(mailbox)


def read_email(mailbox):
    posts = []
    mail_list = [i.uid for i in mailbox.fetch()]
    if mail_list:
        for msg in mailbox.fetch(A(from_='newsletter@filipedeschamps.com.br')):
            posts = msg.text.replace('*', '').split('\r\n\r\n')
            posts = posts[2:-3]
            mark_as_read(mailbox)
            archive_message(mailbox, msg.uid)
        twitter_connect(posts)
    else:
        sleep(60)
        mail_connect()


def mark_as_read(mailbox):
    flags = (MailMessageFlags.ANSWERED, MailMessageFlags.FLAGGED)
    mailbox.flag(mailbox.fetch(A(seen=False)), flags, True)
    mailbox.flag(mailbox.fetch("SENTON 01-Jan-2021"),
                 MailMessageFlags.SEEN, False)


def archive_message(mailbox, msg_uid):
    move_to = 'Tweeted'
    mailbox.move(msg_uid, move_to)

标签: pythongithub-actionstweepy

解决方案


推荐阅读