AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1112006
Accepted
Rino Bino
Rino Bino
Asked: 2022-10-01 13:46:05 +0800 CST2022-10-01 13:46:05 +0800 CST 2022-10-01 13:46:05 +0800 CST

Limpando o espaço de trabalho do Jenkins, mas mantendo o .venv do Python intacto

  • 772

Esta questão se refere a trabalhar com um projeto Python + Poetry em um pipeline Jenkins e como manter o.venv/


CENÁRIO:

Eu tenho um trabalho do Jenkins Pipeline que aciona um projeto Python. O projeto usa poesia para criar um ambiente virtual em .venv dentro do espaço de trabalho. A cada execução de trabalho subsequente, ele reutilizará o .venv conforme o esperado, de modo que cada pacote pip não precise ser baixado novamente a cada execução (a menos que haja um diff no arquivo poet.lock). Tudo funciona como esperado.

Eu quero fazer uma alteração no Pipeline usando o Jenkins Workspace Cleanup Plugin, quero destruir os arquivos do espaço de trabalho, mas manter alguns arquivos, incluindo os arquivos de ambiente pip/poetry/venv . Isso é para permitir que ele reutilize pacotes pip da execução anterior ainda armazenados em .venv -- assim como faz no Pipeline de trabalho hoje.

O exemplo de arquivo de pipeline completo está na parte inferior deste post, mas aqui está um trecho da parte cleanWs() que adicionei ao pipeline existente:

post {
  always {
    cleanWs(
      deleteDirs: true,
      notFailBuild: true,
      patterns: [
        [pattern: '.venv', type: 'EXCLUDE'],
        [pattern: '.venv/**', type: 'EXCLUDE']
      ]
    )
  }
}

AQUI ESTÁ A QUESTÃO:

  • Na primeira vez que o trabalho é executado, ele funciona perfeitamente e a limpeza do espaço de trabalho funciona conforme o esperado. O .venv/diretório é mantido conforme o esperado.

  • (problema) Em execuções subsequentes do trabalho, o Poesia reinstalará todos os pacotes e não reutilizará o diretório .venv :

    Creating virtualenv test in /data/jenkins_home/workspace/test-cleanup/.venv-- Isso força um novo download completo de cada pacote, mesmo que .venvjá exista. Foi confirmado que /data/jenkins_home/workspace/test-cleanup/.venvjá existe antes da execução do trabalho.

  • Aqui está a parte estranha: se eu for para o diretório do espaço de trabalho manualmente no servidor Jenkins e executar exatamente o mesmo comando poetry install , ele funcionará conforme o esperado, .venvserá reutilizado e todos os pacotes não serão reinstalados. Portanto, há algo específico sobre a maneira como ele é tratado em execução no trabalho que está fazendo com que ele queira recriar o diretório .venv.

NOTA que in-project = truejá está definido para Poesia. Portanto, ele sempre tentará usar .venv dentro do diretório de trabalho atual.


EXEMPLOS:

Aqui está um pipeline de exemplo simples que funciona conforme o esperado. Quando poetry installa etapa é executada, ela não baixa novamente todos os pacotes toda vez que o trabalho é executado, apenas na primeira vez ou se houver uma diferença:

pipeline {

  agent any

  stages {

    stage("Prep Build Environment") {
      steps {

        script {
          scmVars = git branch: "main", poll: false, url: "[email protected]:my-org/private-repo.git"
        }

        sh "poetry install"
      }
    }
  }
}

Aqui está o novo arquivo de pipeline Jenkinsfile com cleanWs()adicionado. Depois que isso for adicionado, o projeto não reutilizará mais o .venv em cada execução, mesmo que ele ainda exista:

pipeline {

  agent any

  stages {

    stage("Prep Build Environment") {
      steps {

        script {
          scmVars = git branch: "main", poll: false, url: "[email protected]:my-org/private-repo.git"
        }

        sh "poetry install"
      }
    }
  }

  post {
    always {
      cleanWs(
        deleteDirs: true,
        notFailBuild: true,
        patterns: [
          [pattern: '.venv', type: 'EXCLUDE'],
          [pattern: '.venv/**', type: 'EXCLUDE']
        ]
      )
    }
  }

}
python
  • 2 2 respostas
  • 60 Views

2 respostas

  • Voted
  1. jayhendren
    2022-10-02T18:39:27+08:002022-10-02T18:39:27+08:00

    Normalmente, um Jenkins Pipeline limpa o espaço de trabalho no início de uma compilação, e é por isso que a pasta .venv existe após a execução da compilação, mas não ao executar a etapa virtualenv durante a próxima compilação.

    Se você deseja armazenar em cache ou reter alguns arquivos entre compilações, a maneira mais confiável de fazer isso é armazenar esses arquivos fora do espaço de trabalho. Você precisa ser extremamente cuidadoso com isso, no entanto, porque a execução simultânea de compilações acessando os mesmos arquivos pode levar à contenção de recursos e condições de corrida e arquivos corrompidos.

    • 0
  2. Best Answer
    Rino Bino
    2022-10-04T16:54:51+08:002022-10-04T16:54:51+08:00

    A resposta rápida:

    Adicione [pattern: '.git/**', type: 'EXCLUDE']à sua lista de cleanWs()padrões.

    Os arquivos do espaço de trabalho, inclusive .venv/, persistirão entre as execuções de trabalho.


    A resposta longa:

    Portanto, o problema parece ser que o plugin git sobrecarrega o espaço de trabalho quando o .git/diretório está ausente (quando precisa fazer um clone completo). Eu não vejo esse comportamento documentado em qualquer lugar do que eu vi.

    Como a cleanWs()ação remove .git, ela acionará esse "recurso" do plugin git.

    Adicionar o .git/diretório à lista de exclusão parece ter resolvido o problema original e permite que os outros arquivos persistam entre as compilações.

    Esse comportamento pode ser comprovado:

    1. Etapas de pipeline que gravam um arquivo no espaço de trabalho e fazem check-out do repositório.

      steps {
        sh "ls -l"
        sh "touch foo.txt"
        git branch: "master", poll: false, url: "[email protected]:golang/example.git"
      }
      

      Depois que o trabalho for executado uma vez, foo.txt persistirá no espaço de trabalho:

    2. Remova .gitos dados após a clonagem:

      steps {
        sh "ls -l"
        sh "touch foo.txt"
        git branch: "master", poll: false, url: "[email protected]:golang/example.git"
        sh "rm -rf .git"
      }
      

      Depois que o trabalho for executado uma vez, foo.txt agora estará ausente no início de cada execução de trabalho:


    Postagem final/sempre snippet de bloco. As instalações de poesia e o env virtual estão funcionando como esperado agora:

    post {
      always {
        cleanWs(
          deleteDirs: true,
          notFailBuild: true,
          patterns: [
            [pattern: '.git/**', type: 'EXCLUDE'],
            [pattern: '.venv/**', type: 'EXCLUDE']
          ]
        )
      }
    }
    
    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve