ansibleでデプロイするタスクを書いていて遭遇した仕様の話。
やりたいことは、gitのtagやbranch名を引っ張ってきてslackに通知したい。
ステージング環境でのデプロイでも使っているタスクなので、「masterブランチのtag」が入るか、「develop/test」などのブランチが入ってきても適切に通知したい。
最初は、
# branchがmasterの場合、gittagにtag名を入れる
- name: git status
shell: git status | head -1 | awk '{print $2}'
args:
chdir: "{{ workdir }}/{{ repobase }}/{{ project }}"
register: branch_name
changed_when: false
- name: check tag version
shell: git status | head -1 | awk '{print $5}'
args:
chdir: "{{ workdir }}/{{ repobase }}/{{ project }}"
register: gittag
when: branch_name.stdout == "HEAD"
changed_when: false
# branchがmasterではない場合、gittagにブランチ名を入れる
- name: check branch
shell: git status --short --branch | awk '{print $2}'
args:
chdir: "{{ workdir }}/{{ repobase }}/{{ project }}"
register: gittag
when: branch_name.stdout != "HEAD"
changed_when: false
# slack送信
- name : send tag (finish)
slack:
token: '{{ slack_token }}'
msg: "デプロイが開始します\n
```
project: {{project}}\n
env: {{env}}\n
version: {{ gittag.stdout }}\n
date: {{ lookup(\"pipe\",\"date +%Y/%m/%d-%H:%M:%S\") }}
```"
channel: '{{ post_channel }}'
color: good
run_once: true
と書いたが、branchがmasterで、check branchタスクがskipされているにも関わらず、register: gittagの中身が空っぽになる。
公式を確認すると、
If a task fails or is skipped, the variable still is registered with a failure or skipped status, the only way to avoid registering a variable is using tags.
タスクが失敗したり、スキップしたりした場合も変数は設定される。
らしい。
結局、以下のように修正。
vars_files:
- ../vars/vars.yml
tasks:
# branchがmasterの場合、gittagにtag名を入れる
- name: git status
shell: git status | head -1 | awk '{print $2}'
args:
chdir: "{{ workdir }}/{{ repobase }}/{{ project }}"
register: branch_name
changed_when: false
- name: check tag version
shell: git status | head -1 | awk '{print $5}'
args:
chdir: "{{ workdir }}/{{ repobase }}/{{ project }}"
register: gittag
when: branch_name.stdout == "HEAD"
changed_when: false
# branchがdevelopではない場合、gittagにブランチ名を入れる
- name: check branch
shell: git status --short --branch | awk '{print $2}'
args:
chdir: "{{ workdir }}/{{ repobase }}/{{ project }}"
register: gitbranch
when: branch_name.stdout != "HEAD"
changed_when: false
# slack送信
- name : send tag (finish)
slack:
token: '{{ slack_token }}'
msg: "デプロイを開始します\n
```
project: {{project}}\n
env: {{env}}\n
version: {{ gittag.stdout }}\n
date: {{ lookup(\"pipe\",\"date +%Y/%m/%d-%H:%M:%S\") }}
```"
channel: '{{ post_channel }}'
color: good
when: branch_name.stdout == "HEAD"
run_once: true
- name : send branch (finish)
slack:
token: '{{ slack_token }}'
msg: "デプロイを開始します\n
```
project: {{project}}\n
env: {{env}}\n
version: {{ gitbranch.stdout }}\n
date: {{ lookup(\"pipe\",\"date +%Y/%m/%d-%H:%M:%S\") }}
```"
channel: '{{ post_channel }}'
color: good
when: branch_name.stdout != "HEAD"
run_once: true
上手い書き方無いかなぁ