Ich verwende den folgenden Code in meinen bitbucket-pipelines.yml
-Dateien, um Code auf einem Staging-Server remote bereitzustellen.
image: php:7.1.1
pipelines:
default:
- step:
script:
# install ssh
- apt-get update && apt-get install -y openssh-client
# get the latest code
- ssh [email protected] -F ~/.ssh/config "cd /path/to/code && git pull"
# update composer
- ssh [email protected] -F ~/.ssh/config "cd /path/to/code && composer update --no-scripts"
# optimise files
- ssh [email protected] -F ~/.ssh/config "cd /path/to/code && php artisan optimize"
Dies alles funktioniert, mit der Ausnahme, dass jedes Mal, wenn die Pipeline ausgeführt wird, der ssh-Client heruntergeladen und installiert wird (was der Erstellungszeit ~ 30 Sekunden hinzufügt). Gibt es eine Möglichkeit, diesen Schritt zwischenzuspeichern?
Und wie kann ich den Schritt apt-get
zwischenspeichern?
Würde zum Beispiel so etwas funktionieren (oder welche Änderungen sind erforderlich, um die folgende Arbeit zu machen):
pipelines:
default:
- step:
caches:
- aptget
script:
- apt-get update && apt-get install -y openssh-client
definitions:
caches:
aptget: which ssh
Dies ist ein typisches Szenario, in dem Sie anstelle eines von Atlassian bereitgestellten Docker-Images Ihr eigenes Docker-Image verwenden sollten. (Oder suchen Sie nach einem Docker-Image, das genau dies bietet.)
In Ihrem einfachen Fall sollte dieses Dockerfile ausreichen:
FROM php:7.1.1
RUN apt-get update && \
apt-get install -y openssh-client
Erstellen Sie dann ein DockerHub-Konto, veröffentlichen Sie das Bild und referenzieren Sie es in bitbucket-pipelines.yml
.
Leider sind die Teile, die die Zeit in Anspruch nehmen, unsicher oder sinnlos zu zwischenspeichern. Denken Sie daran, dass die Pipeline-Caches jederzeit gelöscht werden können, sodass Sie die Befehle immer ausführen müssen.
apt-get update
verwendet keinen Cache und lädt daher jedes Mal die neuesten Indizes herunter.
apt-get install
speichert heruntergeladene Pakete in /var/cache/apt
, sodass Sie diese speichern können. Dies wird jedoch wahrscheinlich keine Zeit sparen
907 kB in 0s (998 kB/s) abgerufen
Die tatsächlich installierten Pakete können nicht zwischengespeichert werden, da sie a) auf mehrere gemeinsam genutzte Dateien und Verzeichnisse verteilt sind und b) möglicherweise nicht auf verschiedene Docker-Images portiert werden können.
Auf einer tieferen Ebene ist eine zufriedenstellende Interaktion zwischen Caching, apt-get update
und Docker ein komplexes Problem .