feat: build and install Seriatim from source
This commit is contained in:
189
tasks/build.yml
Normal file
189
tasks/build.yml
Normal file
@@ -0,0 +1,189 @@
|
||||
---
|
||||
- name: Construct canonical Seriatim build inputs
|
||||
ansible.builtin.set_fact:
|
||||
seriatim_build_inputs: >-
|
||||
{{ {
|
||||
'source_commit': seriatim_source_commit,
|
||||
'go_version': seriatim_go_version_result.stdout,
|
||||
'go_binary': seriatim_go_binary,
|
||||
'build_version': seriatim_build_version,
|
||||
'build_flags': seriatim_go_build_flags,
|
||||
'ldflags': seriatim_go_ldflags,
|
||||
'package': seriatim_go_package,
|
||||
'environment': {
|
||||
'GOWORK': 'off',
|
||||
'GOTOOLCHAIN': 'local',
|
||||
'CGO_ENABLED': '0'
|
||||
}
|
||||
} | to_nice_json(indent=2, sort_keys=true) }}
|
||||
|
||||
- name: Calculate desired Seriatim build fingerprint
|
||||
ansible.builtin.set_fact:
|
||||
seriatim_desired_fingerprint: "{{ seriatim_build_inputs | hash('sha256') }}"
|
||||
seriatim_stored_fingerprint: ""
|
||||
seriatim_stored_checksum: ""
|
||||
|
||||
- name: Inspect installed Seriatim binary
|
||||
ansible.builtin.stat:
|
||||
path: "{{ seriatim_binary_path }}"
|
||||
checksum_algorithm: sha256
|
||||
register: seriatim_installed_binary_stat
|
||||
|
||||
- name: Inspect Seriatim build input state
|
||||
ansible.builtin.stat:
|
||||
path: "{{ seriatim_build_state_dir }}/build-inputs.json"
|
||||
register: seriatim_build_inputs_state_stat
|
||||
|
||||
- name: Inspect Seriatim fingerprint state
|
||||
ansible.builtin.stat:
|
||||
path: "{{ seriatim_build_state_dir }}/fingerprint.sha256"
|
||||
register: seriatim_fingerprint_state_stat
|
||||
|
||||
- name: Inspect Seriatim checksum state
|
||||
ansible.builtin.stat:
|
||||
path: "{{ seriatim_build_state_dir }}/binary.sha256"
|
||||
register: seriatim_checksum_state_stat
|
||||
|
||||
- name: Read stored Seriatim fingerprint
|
||||
ansible.builtin.slurp:
|
||||
src: "{{ seriatim_build_state_dir }}/fingerprint.sha256"
|
||||
register: seriatim_stored_fingerprint_result
|
||||
when: seriatim_fingerprint_state_stat.stat.exists
|
||||
|
||||
- name: Read stored Seriatim checksum
|
||||
ansible.builtin.slurp:
|
||||
src: "{{ seriatim_build_state_dir }}/binary.sha256"
|
||||
register: seriatim_stored_checksum_result
|
||||
when: seriatim_checksum_state_stat.stat.exists
|
||||
|
||||
- name: Record stored Seriatim state values
|
||||
ansible.builtin.set_fact:
|
||||
seriatim_stored_fingerprint: >-
|
||||
{{ seriatim_stored_fingerprint_result.content | b64decode | trim }}
|
||||
seriatim_stored_checksum: >-
|
||||
{{ seriatim_stored_checksum_result.content | b64decode | trim }}
|
||||
when:
|
||||
- seriatim_fingerprint_state_stat.stat.exists
|
||||
- seriatim_checksum_state_stat.stat.exists
|
||||
|
||||
- name: Read installed Seriatim version
|
||||
ansible.builtin.command:
|
||||
argv:
|
||||
- "{{ seriatim_binary_path }}"
|
||||
- --version
|
||||
register: seriatim_installed_version_result
|
||||
changed_when: false
|
||||
failed_when: false
|
||||
when: seriatim_installed_binary_stat.stat.exists
|
||||
|
||||
- name: Decide whether Seriatim requires rebuilding
|
||||
ansible.builtin.set_fact:
|
||||
seriatim_build_required: >-
|
||||
{{ not seriatim_installed_binary_stat.stat.exists
|
||||
or not seriatim_build_inputs_state_stat.stat.exists
|
||||
or not seriatim_fingerprint_state_stat.stat.exists
|
||||
or not seriatim_checksum_state_stat.stat.exists
|
||||
or seriatim_stored_fingerprint != seriatim_desired_fingerprint
|
||||
or seriatim_stored_checksum != (seriatim_installed_binary_stat.stat.checksum | default(''))
|
||||
or (seriatim_installed_version_result.rc | default(1)) != 0
|
||||
or (seriatim_installed_version_result.stdout | default('')) != 'seriatim version ' ~ seriatim_build_version }}
|
||||
|
||||
- name: Build, validate, and install Seriatim
|
||||
when: seriatim_build_required
|
||||
block:
|
||||
- name: Create temporary Seriatim build directory
|
||||
ansible.builtin.tempfile:
|
||||
state: directory
|
||||
prefix: ansible-seriatim-build-
|
||||
register: seriatim_build_tempdir
|
||||
|
||||
- name: Build staged Seriatim binary
|
||||
ansible.builtin.command:
|
||||
argv: >-
|
||||
{{ [seriatim_go_binary, 'build']
|
||||
+ seriatim_go_build_flags
|
||||
+ ['-ldflags', seriatim_go_ldflags,
|
||||
'-o', seriatim_build_tempdir.path ~ '/seriatim',
|
||||
seriatim_go_package] }}
|
||||
chdir: "{{ seriatim_source_dir }}"
|
||||
environment:
|
||||
GOWORK: "off"
|
||||
GOTOOLCHAIN: local
|
||||
CGO_ENABLED: "0"
|
||||
changed_when: true
|
||||
|
||||
- name: Validate staged Seriatim binary
|
||||
ansible.builtin.command:
|
||||
argv:
|
||||
- "{{ seriatim_build_tempdir.path }}/seriatim"
|
||||
- --version
|
||||
register: seriatim_staged_version_result
|
||||
changed_when: false
|
||||
failed_when: >-
|
||||
seriatim_staged_version_result.rc != 0 or
|
||||
seriatim_staged_version_result.stdout != 'seriatim version ' ~ seriatim_build_version
|
||||
|
||||
- name: Install validated Seriatim binary
|
||||
ansible.builtin.copy:
|
||||
src: "{{ seriatim_build_tempdir.path }}/seriatim"
|
||||
dest: "{{ seriatim_binary_path }}"
|
||||
remote_src: true
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0755"
|
||||
|
||||
- name: Validate installed Seriatim binary
|
||||
ansible.builtin.command:
|
||||
argv:
|
||||
- "{{ seriatim_binary_path }}"
|
||||
- --version
|
||||
register: seriatim_new_installed_version_result
|
||||
changed_when: false
|
||||
failed_when: >-
|
||||
seriatim_new_installed_version_result.rc != 0 or
|
||||
seriatim_new_installed_version_result.stdout != 'seriatim version ' ~ seriatim_build_version
|
||||
|
||||
- name: Calculate installed Seriatim checksum
|
||||
ansible.builtin.stat:
|
||||
path: "{{ seriatim_binary_path }}"
|
||||
checksum_algorithm: sha256
|
||||
register: seriatim_new_binary_stat
|
||||
|
||||
- name: Create Seriatim build state directory
|
||||
ansible.builtin.file:
|
||||
path: "{{ seriatim_build_state_dir }}"
|
||||
state: directory
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0755"
|
||||
|
||||
- name: Record Seriatim build inputs
|
||||
ansible.builtin.copy:
|
||||
content: "{{ seriatim_build_inputs }}\n"
|
||||
dest: "{{ seriatim_build_state_dir }}/build-inputs.json"
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0644"
|
||||
|
||||
- name: Record Seriatim build fingerprint
|
||||
ansible.builtin.copy:
|
||||
content: "{{ seriatim_desired_fingerprint }}\n"
|
||||
dest: "{{ seriatim_build_state_dir }}/fingerprint.sha256"
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0644"
|
||||
|
||||
- name: Record installed Seriatim checksum
|
||||
ansible.builtin.copy:
|
||||
content: "{{ seriatim_new_binary_stat.stat.checksum }}\n"
|
||||
dest: "{{ seriatim_build_state_dir }}/binary.sha256"
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0644"
|
||||
|
||||
always:
|
||||
- name: Remove temporary Seriatim build directory
|
||||
ansible.builtin.file:
|
||||
path: "{{ seriatim_build_tempdir.path }}"
|
||||
state: absent
|
||||
when: seriatim_build_tempdir.path is defined
|
||||
Reference in New Issue
Block a user