Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: upload built artifacts to the target machine #170

Merged
merged 2 commits into from
Jun 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions .github/workflows/infrstructure.yml
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,7 @@ jobs:

- name: Configure Control Machine
run: |
sudo useradd --create-home ubuntu && sudo usermod --append --groups sudo ubuntu

ANSIBLE_USER=$([ "${IS_MANUAL_DEPLOYMENT}" == "true" ] && echo "ubuntu" || echo "${USER}")
ANSIBLE_CONNECTION="ansible_connection=local"
if [ "${IS_MANUAL_DEPLOYMENT}" == "true" ]; then
ANSIBLE_CONNECTION=""
Expand All @@ -153,9 +152,9 @@ jobs:

cat <<-EOH > infrastructure/nomad/hosts.ini
[nomad_servers]
${TARGET_MACHINE_IP} ${ANSIBLE_CONNECTION} ansible_user=ubuntu
${TARGET_MACHINE_IP} ${ANSIBLE_CONNECTION} ansible_user=${ANSIBLE_USER}
[nomad_clients]
${TARGET_MACHINE_IP} ${ANSIBLE_CONNECTION} ansible_user=ubuntu
${TARGET_MACHINE_IP} ${ANSIBLE_CONNECTION} ansible_user=${ANSIBLE_USER}
EOH

ansible all --inventory infrastructure/nomad/hosts.ini --module-name ping
Expand Down
70 changes: 53 additions & 17 deletions infrastructure/nomad/playbooks/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
src: "{{ vault_init_file }}"
register: vault_init
become: true
become_user: "{{ hostvars[inventory_hostname].ansible_user }}"
become_user: "{{ ansible_user }}"
no_log: true

- name: Parse Vault Initialization File
Expand Down Expand Up @@ -135,12 +135,18 @@
else profiles[profile].jobs
}}

- name: Ensure "{{ ansible_env.HOME }}/{{ env }}" Directory Exists
ansible.builtin.file:
- name: Determine "{{ ansible_env.HOME }}/{{ env }}" Status
ansible.builtin.stat:
path: "{{ ansible_env.HOME }}/{{ env }}"
state: directory
mode: "0744"
recurse: yes
register: env_dir

- name: Check "{{ ansible_env.HOME }}/{{ env }}" Directory Exists
assert:
that:
- env_dir.stat.isdir is defined
- env_dir.stat.isdir
fail_msg: "The directory {{ ansible_env.HOME }}/{{ env }} does not exist."
success_msg: "The directory {{ ansible_env.HOME }}/{{ env }} exists."

- name: Read Existing "meta.json"
ansible.builtin.shell: |
Expand Down Expand Up @@ -228,7 +234,7 @@
{% if artifact.keystore is defined %}
case "{{ environments[env].secrets }}" in
"generate")
PASSPHRASE="{{ lookup('password', '/dev/null', length=1024) }}"
PASSPHRASE="{{ lookup('password', '/dev/null', length=1024, chars=["ascii_letters", "digits", ".,:_"]) }}"

RESULT=$(
{{ keystore_generator.stdout }} generate \
Expand Down Expand Up @@ -462,13 +468,12 @@
run_once: true
when: build_artifacts

- name: Upload Artifacts Async
- name: Upload Artifacts Async to AWS S3
amazon.aws.aws_s3:
bucket: "{{ aws_s3_bucket }}"
object: "{{ item.path | basename }}"
src: "{{ item.path }}"
mode: put
tags: "{{ {'AutoDelete': 'true'} if env == 'devenv' else {} }}"
loop: "{{ upload_artifacts.files }}"
loop_control:
label: "{{ item.path | basename }}"
Expand All @@ -477,7 +482,7 @@
delegate_to: localhost
run_once: true
register: upload_artifacts_async
when: build_artifacts and (upload_artifacts.files | default([])) | length > 0
when: build_artifacts and upload_artifacts.matched > 0 and env != 'devenv'

- name: Wait for Upload Artifacts Async to Complete
ansible.builtin.async_status:
Expand All @@ -491,7 +496,23 @@
label: "{{ item.item.path | basename }}"
delegate_to: localhost
run_once: true
when: build_artifacts and (upload_artifacts.files | default([])) | length > 0
when: build_artifacts and upload_artifacts.matched > 0 and env != 'devenv'

- name: Ensure Target Directory Exists and is Empty
ansible.builtin.shell: |
rm -rf {{ ansible_env.HOME }}/{{ env }}/artifacts/ && mkdir {{ ansible_env.HOME }}/{{ env }}/artifacts/
args:
executable: bash
when: build_artifacts and upload_artifacts.matched > 0 and env == 'devenv'

- name: Copy Artifacts to Target Machine
ansible.builtin.copy:
src: "{{ item.path }}"
dest: "{{ ansible_env.HOME }}/{{ env }}/artifacts/{{ item.path | basename }}"
loop: "{{ upload_artifacts.files }}"
loop_control:
label: "{{ item.path | basename }}"
when: build_artifacts and upload_artifacts.matched > 0 and env == 'devenv'

- name: Push Generated Secrets to Vault
ansible.builtin.uri:
Expand All @@ -508,13 +529,13 @@
delegate_to: localhost
no_log: true

- name: Cleanup Artifacts
- name: Cleanup Built Artifacts
ansible.builtin.file:
path: "{{ dist_dir }}"
state: absent
delegate_to: localhost
run_once: true
when: build_artifacts and (upload_artifacts.files | default([])) | length > 0
when: build_artifacts and upload_artifacts.matched > 0

- name: Delete "meta.json"
file:
Expand Down Expand Up @@ -550,16 +571,21 @@
ansible.builtin.shell: |
RESULT="$(nomad run {{ ansible_env.HOME }}/{{ env }}/{{ job.name }}.nomad 2>&1)"
if [ $? -ne 0 ]; then
echo "Failed to deploy {{ job.name }}: ${RESULT}"
echo "Failed to deploy {{ job.name }}: ${RESULT}."
exit 1
fi

TIMEOUT=300
TIMEOUT={% if profile == 'ci' %}600{% else %}300{% endif %}
START_TIME=$(date +%s)
JOB_TYPE=$(nomad job status -json "{{ job.name }}" | jq -r '.[0].Allocations[0].JobType')
RESULT=$(nomad job status -json "{{ job.name }}")
if [ $? -ne 0 ]; then
echo "Failed to get job status for {{ job.name }}: ${RESULT}."
exit 1
fi
JOB_TYPE=$(echo "${RESULT}" | jq -r '.[0].Allocations[0].JobType')

while true; do
STATUS=$(nomad job status -json "{{ job.name }}" | jq -r '.[0].Allocations[0].ClientStatus')
STATUS=$(echo "${RESULT}" | jq -r '.[0].Allocations[0].ClientStatus')

case "${JOB_TYPE}" in
service)
Expand All @@ -573,7 +599,12 @@
fi
;;
*)
{% if env != 'devenv' %}
break
{% else %}
echo "Unknown job type: ${JOB_TYPE}"
exit 1
{% endif %}
;;
esac

Expand All @@ -585,6 +616,11 @@
fi

sleep 1
RESULT=$(nomad job status -json "{{ job.name }}")
if [ $? -ne 0 ]; then
echo "Failed to get job status for {{ job.name }}: ${RESULT}."
exit 1
fi
done
args:
executable: bash
Expand Down
17 changes: 13 additions & 4 deletions infrastructure/nomad/playbooks/init.yml
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
- name: Initialize and Configure Cluster
hosts: all
become: yes
remote_user: "{{ hostvars[inventory_hostname].ansible_user }}"
gather_facts: yes

vars:
version: "unknown"
ansible_user_home: "/home/{{ hostvars[inventory_hostname].ansible_user }}"
nomad_server_ip: "{{ (hostvars[groups['nomad_servers'][0]]['ansible_default_ipv4']['address'] if groups['nomad_servers'] | default([]) | length > 0 else '127.0.0.1') }}"
nomad_clients_defined: "{{ groups['nomad_clients'] | length > 0 }}"
nomad_servers_defined: "{{ groups['nomad_servers'] | length > 0 }}"
Expand Down Expand Up @@ -113,6 +113,15 @@
fail_msg: "The profile name is not set correctly."
success_msg: "The profile name is set to: {{ profile }}."

- name: Ensure "{{ ansible_user_home }}/{{ env }}" Directory Exists
ansible.builtin.file:
path: "{{ ansible_user_home }}/{{ env }}/artifacts"
state: directory
mode: "0744"
recurse: yes
become: true
become_user: "{{ ansible_user }}"

tasks:
- name: Add DataDog Repository Key
ansible.builtin.apt_key:
Expand Down Expand Up @@ -141,7 +150,7 @@

- name: Add PostgreSQL Repository
ansible.builtin.apt_repository:
repo: "deb http://apt.postgresql.org/pub/repos/apt {{ ansible_distribution_release }}-pgdg main"
repo: "deb https://apt.postgresql.org/pub/repos/apt {{ ansible_distribution_release }}-pgdg main"
state: present
filename: pgdg.list

Expand Down Expand Up @@ -231,7 +240,7 @@
mode: "0400"
when: vault_status.json.initialized == false
become: true
become_user: "{{ hostvars[inventory_hostname].ansible_user }}"
become_user: "{{ ansible_user }}"
no_log: true

- name: Determine Vault Seal Status
Expand All @@ -250,7 +259,7 @@
- vault_status.json.initialized == true
- vault_seal_status.json.sealed == true
become: true
become_user: "{{ hostvars[inventory_hostname].ansible_user }}"
become_user: "{{ ansible_user }}"
no_log: true

- name: Parse Vault Initialization File
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#jinja2: trim_blocks:True, lstrip_blocks:True

# This job exists only to provide deployment information to the Nomad UI.
job "{{ environments[env].version }}" {
job "{% if env != 'devenv' %}{{ environments[env].version }}{% else %}artifacts-{{ environments[env].version }}{% endif %}" {
datacenters = ["{{ datacenter }}"]

{% if env != 'devenv' %}
type = "batch"
priority = 1

Expand All @@ -11,6 +11,7 @@ job "{{ environments[env].version }}" {
periodic {
cron = "0 0 1 1 6"
}
{% endif %}

meta {
CHAIN_ID = "{{ environments[env].chain_id }}"
Expand All @@ -22,7 +23,10 @@ job "{{ environments[env].version }}" {
TIMESTAMP = "{{ now(utc=true, fmt='%a %Y-%m-%d %H:%M:%S UTC') }}"
}

{% if env != 'devenv' %}
group "info" {
count = 1

task "dummy" {
driver = "exec"

Expand All @@ -37,4 +41,46 @@ job "{{ environments[env].version }}" {
}
}
}
{% else %}
group "artifacts-group" {
count = 1

network {
mode = "bridge"

port "http" {
static = 1111
to = 1111
}
}

volume "artifacts-volume" {
type = "host"
source = "artifacts-volume"
read_only = true
}

task "artifacts" {
driver = "exec"

service {
name = "artifacts"
port = "http"
tags = ["http"]
provider = "nomad"
}

volume_mount {
volume = "artifacts-volume"
destination = "/local/artifacts"
read_only = true
}

config {
command = "python3"
args = ["-m", "http.server", "1111", "--directory", "/local/artifacts"]
}
}
}
{% endif %}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,15 @@ job "{{ job.name }}" {
destination = "local/foundry.sh"
}

{% if env != 'devenv' %}
artifact {
source = "https://primev-infrastructure-artifacts.s3.us-west-2.amazonaws.com/contracts_{{ version }}.tar.gz"
}
{% else %}
artifact {
source = "http://{{ ansible_facts['default_ipv4']['address'] }}:1111/contracts_{{ version }}.tar.gz"
}
{% endif %}

template {
data = <<-EOH
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,21 @@ job "{{ job.name }}" {
destination = "local/foundry.sh"
}

{% if env != 'devenv' %}
artifact {
source = "https://primev-infrastructure-artifacts.s3.us-west-2.amazonaws.com/contracts_{{ version }}.tar.gz"
}

artifact {
source = "https://primev-infrastructure-artifacts.s3.us-west-2.amazonaws.com/mev-commit-bridge-relayer_{{ version }}_Linux_{{ target_system_architecture }}.tar.gz"
}
{% else %}
artifact {
source = "http://{{ ansible_facts['default_ipv4']['address'] }}:1111/contracts_{{ version }}.tar.gz"
}
artifact {
source = "http://{{ ansible_facts['default_ipv4']['address'] }}:1111/mev-commit-bridge-relayer_{{ version }}_Linux_{{ target_system_architecture }}.tar.gz"
}
{% endif %}

template {
data = <<-EOH
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,15 @@ job "{{ job.name }}" {
}
{% endfor %}

{% if env != 'devenv' %}
artifact {
source = "https://primev-infrastructure-artifacts.s3.us-west-2.amazonaws.com/{{ job.target_type }}-emulator_{{ version }}_Linux_{{ target_system_architecture }}.tar.gz"
}
{% else %}
artifact {
source = "http://{{ ansible_facts['default_ipv4']['address'] }}:1111/{{ job.target_type }}-emulator_{{ version }}_Linux_{{ target_system_architecture }}.tar.gz"
}
{% endif %}

template {
data = <<-EOH
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,21 @@ job "{{ job.name }}" {
}
{% endfor %}

{% if env != 'devenv' %}
artifact {
source = "https://primev-infrastructure-artifacts.s3.us-west-2.amazonaws.com/genesis_{{ version }}.json"
}

artifact {
source = "https://primev-infrastructure-artifacts.s3.us-west-2.amazonaws.com/mev-commit-geth_{{ version }}_Linux_{{ target_system_architecture }}.tar.gz"
}
{% else %}
artifact {
source = "http://{{ ansible_facts['default_ipv4']['address'] }}:1111/genesis_{{ version }}.json"
}
artifact {
source = "http://{{ ansible_facts['default_ipv4']['address'] }}:1111/mev-commit-geth_{{ version }}_Linux_{{ target_system_architecture }}.tar.gz"
}
{% endif %}

template {
data = <<-EOH
Expand Down
Loading
Loading